Java

    이펙티브 자바, 쉽게 정리하기 - item 63. 문자열 연결은 느리니 주의하라

    이펙티브 자바, 쉽게 정리하기 - item 63. 문자열 연결은 느리니 주의하라 String concatenation + 이용하기 "a" + "b" 와 같은 방식으로 간단히 쓸 수 있지만, 성능저하가 있다. String 객체는 실제로 불변이기 때문에 새로운 객체를 만들어 더해야 한다. &#39;String 타입의 변수는 잘 바뀌는데 이게 왜 불변이지?&#39; 싶다면 스트링 풀 쉽게 이해하기 포스팅 을 참고하면 좋다. n 개의 문자열을 잇는다면 n^2 에 비례하는 시간이 걸린다. @Test public void stringPlusTest() { String result = ""; for (int i = 0; i < 10000; i++) { for (String string : strings) { resu..

    자바 리플렉션 (Reflection) 이란?

    자바 리플렉션 (Reflection) 이란? 실행 중인 자바 애플리케이션이 JRE (Java Runtime Environment) 를 검사, 수정, 상호작용할 수 있도록 하는 기능이다. 애플리케이션의 런타임 동작을 검사하거나 수정할 수 있다. 자바 리플렉션의 용도 (Use Case) 리플렉션의 대부분의 기능은 일반 애플리케이션 개발에는 크게 필요 없으며 프레임워크의 관점에서 접근할 때 크게 도움이 된다. ex) 프레임워크 이용자가 어떤 애노테이션을 적용했는지 알고 싶을 때는 리플렉션이 크게 도움이 된다. 클래스 구조 검사하기 객체의 클래스를 확인하고 어떤 메서드가 있는지 어떤 필드가 있는지 어떻게 구성됐는지에 대한 정보를 얻을 수 있다. 어떤 상수와 애노테이션이 선언되어 있는지 확인할 수도 있다. 우리가..

    이펙티브 자바, 쉽게 정리하기 - item 62. 다른 타입이 적절하다면 문자열 사용을 피하라

    이펙티브 자바, 쉽게 정리하기 - item 62. 다른 타입이 적절하다면 문자열 사용을 피하라 문자열을 잘못쓰는 사례들 데이터를 입력받을 때 무작정 문자열로 입력받는 사람이 있다. 숫자면 숫자, 예/아니오라면 boolean 과 같은 명확한 타입으로 받는게 더 좋다. 열거 타입을 문자열로 대신하는 경우도 있다. 혼합 타입을 문자열로 대신하는 경우도 있다. 권한을 문자열로 표기하는 경우도 있다. 혼합 타입을 남용하는 예 String compoundKey = className + "#" + i.next(); 가운데 # 을 기준으로 파싱하려고 하는 의도가 살짝 보인다. # 이 만약 className 에서 이용되거나 i.next() 에서 이용되면 문제가 일어난다. 문자열 파싱이라는 추가적인 성능 악영향까지 있다...

    자바의 ThreadLocal 이란?

    자바의 ThreadLocal 이란? 오직 같은 스레드에 의해서만 쓰이거나 읽혀질 수 있는 변수를 만들기 위한 클래스이다. 제네릭 타입의 객체 하나만 읽거나 쓰는 용도이다. 각각의 스레드가 독립적인 공간을 가지고 변수를 다룰 수 있게 만든다. 스레드는 독립적으로 초기화된 변수의 자체 복사본을 가질 수 있다. ThreadLocal 인스턴스는 보통 상태를 스레드에 연결하려고 하는 클래스의 비공개 정적 필드로 사용된다. 이 이유에 대해선 아래에서 설명한다. 주로 user ID 나 transaction ID 와 같은 것에 많이 쓰인다. 왜 ThreadLocal 은 private & static 하게 사용되는가? private 을 사용하는 이유 비공개로 선언해야 다른 클래스에서 해당 스레드의 ThreadLocal ..

    이펙티브 자바, 쉽게 정리하기 - item 61. 박싱된 기본 타입보다는 기본 타입을 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 61. 박싱된 기본 타입보다는 기본 타입을 사용하라 기본 타입과 박싱된 기본 타입의 차이 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 식별성(identity)이라는 속성도 갖는다. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 null을 가질 수 있다. 기본 타입이 박싱된 기본 타입보다 메모리 면에서 우수하다. 문제가 생기는 코드 살펴보기 의도치않은 식별성 검사 public class Item61Test { Comparator naturalOrder = (i, j) -> (i < j) ? -1 : (i == j ? 0 : 1); @Test public void naturalOrderTest() { int compare = naturalOrder..

    이펙티브 자바, 쉽게 정리하기 - item 60. 정확한 답이 필요하다면 float 과 double 은 피하라

    이펙티브 자바, 쉽게 정리하기 - item 60. 정확한 답이 필요하다면 float 과 double 은 피하라 float과 double이 사용하는 이진 부동소수점의 취약점 @Test public void floatDoubleTest1() { System.out.println(1.03 - 0.42); // 결과: 0.6100000000000001 } float 과 double 은 이진 부동소수점 연산에 쓰여 근사치로 계산하도록 설계된 타입이다. 위 코드의 경우 0.61 이 그대로 나오지 않고, 0.6100000000000001 이 나오게 된다. 이진수로 소수점을 표현하는 데 한계가 있고, 그 한계가 이진 부동소수점을 사용함으로써 여실히 드러난다. 이를테면 0.1 을 2진수로 표현하면 0.0001100,11..

    이펙티브 자바, 쉽게 정리하기 - item 59. 라이브러리를 익히고 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 59. 라이브러리를 익히고 사용하라 java Random 라이브러리의 예제 public class Item59Test { Random rnd = new Random(); @Test public void randomTest() { int n = 2 * (Integer.MAX_VALUE / 3); // 약 14억 int low = 0; for (int i=0; i < 1_000_000; i++) { if (randomNumber(n) < n / 2) { // 약 7억 low++; } } System.out.println("low = " + low); } public int randomNumber(int n) { return Math.abs(rnd.nextInt())..

    이펙티브 자바, 쉽게 정리하기 - item 58. 전통적인 for 문보다는 for-each 문을 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 58. 전통적인 for 문보다는 for-each 문을 사용하라 전통적인 for문의 약점 for (Iterator i = c.iterator(); i.hasNext()) { Element e = i.next(); // do something with e... } for (int i=0; i{ for (Iterator i = suits.iterator(); i.hasNext();) { for (Iterator j = ranks.iterator(); j.hasNext();) { System.out.println(i.next() + ", " + j.next()); } } }); } 위 코드에는 어떤 버그가 있을까? 먼저, 사용자가 i.next() 와 j.next() 를..

    이펙티브 자바, 쉽게 정리하기 - item 57. 지역변수의 범위를 최소화하라

    이펙티브 자바, 쉽게 정리하기 - item 57. 지역변수의 범위를 최소화하라 지역변수의 범위는 최소한으로 item 15. 에서 "클래스와 멤버의 접근 권한을 최소화하라"고 했던 것과 비슷한 내용이다. 변수는 항상 유효범위를 최소한으로 두고 필요할 때 늘리는 방식으로 활용하자. 지역변수의 범위를 줄이는 테크닉 이 테크닉에 대해서는 동의하는 부분도 있는데, 개인적으로는 변수를 한 곳에 몰아두는 것이 관리하기 훨씬 편하다고 생각한다. 메서드의 시작 부분에 한번에 초기화하여 일목요연하게 보기 좋게 만드는 것이 최선이라 생각한다. 항상 지역변수가 처음 쓰일 때 선언하자. 미리 선언해두면 코드 가독성이 떨어지고 어수선해진다. 쓰이지 않는 변수가 살아있을 위험도 있다. 선언과 동시에 초기화하자. 초기화에 필요한 정..

    이펙티브 자바, 쉽게 정리하기 - item 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라

    이펙티브 자바, 쉽게 정리하기 - item 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라 API 문서화 관련 지침 자바독을 이용하자. 자바독을 최대한 활용한다. 자바독 태그인 @literal, @code, @implSpec, @index (java9) 를 이용하자. {@literal} 주석 내에 HTML 요소나 다른 자바독 태그를 무시함 글자 그대로 쓸 때 필요 {@code} {@literal} 과 비슷한데, 코드 폰트로 렌더링한다. @implSpec 해당 메서드와 하위 클래스 사이의 계약을 설명 하위 클래스가 해당 메서드를 상속했거나, super 키워드를 이용해 호출할 때 메서드가 어떻게 동작할지 명확히 인지할 수 있게 도와준다 필수적으로 들어가야 하는 것들 모든 공개된 클래스, 인터페이스..

    이펙티브 자바, 쉽게 정리하기 - item 55. 옵셔널 반환은 신중히 하라

    이펙티브 자바, 쉽게 정리하기 - item 55. 옵셔널 반환은 신중히 하라 null 처리에 관한 문제 해당 객체의 메서드가 null을 반환할지 알 수 없다. 클라이언트는 구현 코드를 자세히 살펴보고 null을 처리해야 했다. 자바8 이전 null 처리 방법 if (object != null) { return object.method(); } throw new NullPointerException(); if (result != null) throw new NullPointerException(); 코드가 더러워지거나, 진짜 예외의 처리에 쓰여야 할 예외가 널 처리에 쓰이게 되어버린다. Optional의 등장 null 이 아닌 T 타입 참조 하나를 담거나 아무것도 담지 않는다. null 을 피하기 위한 O..

    이펙티브 자바, 쉽게 정리하기 - item 54. null 이 아닌, 빈 컬렉션이나 빈 배열을 반환하라

    이펙티브 자바, 쉽게 정리하기 - item 54. null이 아닌, 빈 컬렉션이나 빈 배열을 반환하라 null을 반환하는 것의 단점 private final List cheesesInStock = new ArrayList(); public List getCheeses() { return cheesesInStock.isEmpty() ? null : new ArrayList(cheesesInStock); } getCheeses()는 cheesesInStock에 원소가 없으면 null을 반환한다. 이 코드엔 무슨 문제가 있을까? 문제 확인 @Test public void getCheesesClient() { List cheeses = getCheeses(); if(cheeses != null && cheese..

반응형