개발서적

    [Effective Java] 객체는 인터페이스를 사용해 참조하라

    객체는 인터페이스를 사용해 참조하라 적합한 인터페이스만 있다면 매개변수뿐 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하는 것이 좋다. 객체의 실제 클래스를 사용해야 할 상황은 오직 생성자로 생성할 때뿐이다. // [좋은 예시] Set sonSet = new LinkedHashSet(); // [나쁜 예시] LinkedHashSet sonSet = new LinkedHashSet(); 인터페이스를 타입으로 사용하면 프로그램이 훨씬 유연해진다. 만약에 구현 클래스를 교체하고자 한다면 그저 새 클래스의 생성자를 호출해주기만 하면 된다. Set sonSet = new HashSet(); 주의할 점은 원래의 클래스가 인터페이스의 일반 규약 이외의 특별한 기능을 제공하며, 주변 코드가 이 기능에 기..

    [Effective Java] 박싱된 기본 타입보다는 기본 타입을 사용하라

    자바의 데이터 타입 기본 타입 : int, double, boolean 참조 타입 : String, List, 각각의 기본 대응되는 박싱 타입 오토박싱과 오토언박싱 덕분에 기본 타입과 박싱 타입을 크게 구분하지 않고 사용할 수 있지만. 이 둘 사이의 분명한 차이는 존재한다. 기본 타입 vs 박싱 타입 기본 타입은 값만 가지고 있지만, 박싱 타입은 값에 더해 식별성이란 속성을 갖는다. 값이 같아도 서로 다르다고 식별될 수 있다. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값(null)을 가질 수 있다. 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다. 박싱된 기본 타입에 == 연산자를 사용할 땐 주의하라. 다음 코드를 이용하여 백만 개짜리 리스트를 넣거나..

    [Effective Java] 정확한 답이 필요하다면 float와 double은 피하라

    부정확한 계산 float와 double 타입은 과학과 공학 계산용으로 설계되었다. 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 설계되었다. 예를 들어 1.03달러에서 42센트를 썻을 때 남은 금액을 표현해보자. System.out.println(1.03 - 0.42) 이 코드는 0.61000000000001을 출력한다. 정확한 계산 이런 문제를 올바로 해결하려면 BigDecimal, int혹은 long을 사용해야 한다. 특히 금융권에서는 float와 double은 사용하지 말자. BigDecimal 앞의 코드를 double이 아닌 BigDecimal을 사용하면 문제가 해결된다. 하지만 기본 타입보다 쓰기 훨씬 불편하고 느리다는 단점이 있다. BigDecimal의..

    [Effective Java] 라이브러리를 익히고 사용하라

    흔하지만 문제가 많은 코드 다음 random() 클래스를 사용한 코드를 보자. static Random rnd = new Random(); static int random(int n) { return Math.abs(rnd.nextInt()) % n; } 이 코드는 다음과 같은 문제가 있다. n이 크지 않은 2의 제곱수라면 같은 수열이 반복된다. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. 지정한 범위 바깥의 수가 나올 수 있다. (반환한 값을 Math.abs를 이용해 음수가 아닌 정수로 매핑하기 때문) 이 결함을 해결하기 위해 Random.nextInt(int) 메서드를 사용할 수 있다. 자바 7부터는 Random을 더 이상 사용하지 않는 것이 좋다. ThreadLocalRa..

    [Effective Java] 전통적인 for 문보다는 for-each 문을 사용하라

    전통적인 for 문을 이용한 컬렉션 순회 for(Iterator i = c.iterator(); i.hasNext(); ) { Element e = i.next(); } for (int i = 0; i < n; i++) { ...// do sth with a[i] } 이러한 for문은 while 문 보다는 낫지만 가장 좋은 방법은 아니다. 박복자와 인덱스 변수는 모두 코드를 지저분하게 할 뿐 우리에게 진짜 필요한 건 원소들 뿐이다. 잘못된 변수를 사용했을 때 컴파일러가 잡아주기 힘들다 컬렉션이나 배열이냐에 따라 코드 형태가 달라진다. 중첩 for문의 찾기 어려운 버그 enum Suit { CLUB, DIAMOND, HEART, SPADE } enum Rank { ACE, DEUCE, THREE, FOUR..