본문 바로가기

개발/이펙티브 자바

Effective Java ( 이펙티브 자바 ) - 아이템 70 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라 자바는 문제 상황을 알리는 타입으로 검사 예외, 런타임 예외, 에러 이렇게 세 가지를 제공한다. 언제 무엇을 사용해야 하는지 헷갈려 하는 프로그래머들이 종종 있다. 언제나 100% 명확한 것은 아니지만 이럴때 참고하면 좋은 멋진 지침들이 있다. 호출하는 쪽에서 복구하리라 여겨지는 상황이라면 검사 예외를 사용하라 이것이 검사 예외와 비검사 예외를 구분하는 기본 규칙이다. 검사 예외를 던지면 호출자가 그 예외를 catch로 잡아 처리하거나 더 바깥으로 전파하도록 강제하게 된다. 따라서 메서드 선언에 포함된 검사 예외 각각은 그 메서드를 호출했을 때 발생할 수 있는 유력한 결과임을 API 사용자에게 알려주는 것이다. 달리 말하면.. 더보기
Effective Java ( 이펙티브 자바 ) -10장 예외, 아이템 69 예외는 진짜 예외 상황에만 사용하라 try { int i = 0; while(true) range[i++].climb(); } catch (ArrayIndexOutOfBoundsException e) { } 전혀 직관적이지도 않다. 이 코드는 배열의 원소를 순회하는데, 무한루프를 돌다가 배열의 끝에 도달해 Exception이 발생하면 끝을 내는 순회 방식을 사용하고 있다. for (Mountain m : range) m.climb(); 표준적인 관용구는 위와 같다. 그렇다면 왜 예외를 써서 루프를 종료한 걸까? 잘못된 추론을 근거로 성능을 높여보려 한 것이다. JVM은 배열에 접근할 때마다 경계를 넘지 않는지 검사하는데, 일반적인 반복문도 배열 경계에 도달하면 종료한다. 따라서 이 검사를 반복문에도 명시.. 더보기
Effective Java ( 이펙티브 자바 ) - 아이템 65 리플렉션보다는 인터페이스를 사용하라 리플렉션을 이용하면 여러 장점과 기능이 있지만, 단점도 있다. 컴파일타임 타입 검사가 주는 이점을 하나도 누릴 수 없다. 리플렉션을 이용하면 코드가 지저분하고 장황해진다. 성능이 떨어진다. 코드 분석 도구나 의존관계 주입 프레임워크처럼 리플렉션을 써야 하는 복잡한 애플리케이션 조차도 리플렉션 사용을 점차 줄이고 있다. 단점이 명확하다. 리플렉션은 아주 제한된 형태로만 사용해야 그 단점을 피하고 이점만 취할 수 있다. 컴파일타임에 이용할 수 없는 클래스를 사용해야만 하는 프로그램은 비록 컴파일타임이라도 적절한 인터페이스나 상위 클래스를 이용할 수는 있을 것이다. 다행히 이런 경우라면, 리플렉션은 인스턴스 생성에만 쓰고, 이렇게 만든 인스턴스는 인터페이스나 상위 클래스로.. 더보기
Effective Java ( 이펙티브 자바 ) - 아이템 64 객체는 인터페이스를 사용해 참조하라 적합한 인터페이스만 있다면 매개변수뿐 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라. 객체의 실제 클래스를 사용해야 할 상황은 '오직' 생성자로 생성할 때뿐이다. Set sonSet = new LinkedHashSet(); // 좋은 예. LinkedHashSet sonSet = new LinkedHashSet(); // 나쁜 예. 인터페이스를 타입으로 사용하는 습관을 길러두면 프로그램이 훨씬 유연해질 것이다. 단 주의할 점이 하나 있다. 원래의 클래스가 인터페이스의 일반 규약 이외의 특별한 기능을 제공하면, 새로운 클래스도 반드시 같은 기능을 제공해야 한다. 예를 들어, LinkedHashSet을 HashSet으로 바꾸게 되면 순서 정책을 고려해야.. 더보기
Effective Java ( 이펙티브 자바 ) - 아이템 63 문자열 연결은 느리니 주의하라 문자열 연결 연산자(+)는 편리하다. 그러나 본격적으로 사용하면 성능 저하를 감내하기 어렵다. 문자열 연결 연산자로 문자열 n개를 잇는 시간은 n^2에 비례한다. 문자열은 불변이라서 양쪽의 내용을 모두 복사해야 한다. 성능을 포기하고 싶지 않다면 StringBuilder를 사용하자. ( Thread-safe StringBuffer? ) 보통 6.6~6.5배 빠르다. StringBuilder의 append 메서드를 사용하라. 더보기
Effective Java ( 이펙티브 자바 ) - 아이템 62 다른 타입이 적절하다면 문자열 사용을 피하라 문자열은 워낙 흔하고 자바가 또 잘 지원해주어 원래 의도하지 않은 용도로도 쓰이는 경향이 있다. 이번 아이템에서는 문자열을 쓰지 않아야 할 사례를 다룬다. 문자열은 다른 값 타입을 대신하기에 적합하지 않다. 많은 사람이 파일, 네트워크, 키보드 입력으로부터 데이터를 받을 때 주로 문자열을 사용한다. 사뭇 자연스러워 보이지만, 입력받을 데이터가 진짜 문자열일 때만 그렇게 하는게 좋다. 기본 타입이든 참조 타입이든 적절한 값 타입이 있다면 그것을 사용하고, 없다면 새로 하나 작성하라. 문자열은 열거 타입을 대신하기에 적합하지 않다. 상수를 열거할 때는 문자열보다는 열거 타입이 월등히 낫다. 문자열은 혼합 타입을 대신하기에 적합하지 않다. 여러 요소가 혼합된 데.. 더보기
Effective Java ( 이펙티브 자바 ) - 아이템 61 박싱된 기본 타입보다는 기본 타입을 사용하라 자바의 데이터 타입은 기본 타입과 참조 타입으로 나뉜다. 그리고 각각의 기본 타입에 대응하는 참조 타입이 하나씩 있으며, 이를 박싱된 기본 타입이라고 한다. 오토박싱과 오토언박싱 덕분에 두 타입을 크게 구분하지 않고 사용할 수는 있지만, 그렇다고 차이가 사라지는 것은 아니다. 둘 사이에는 분명한 차이가 있으니 어떤 타입을 사용하는지는 상당히 중요하다. 주의해서 선택해야 한다. 기본 타입과 박싱된 기본 타입의 주된 차이는 크게 세 가지다. 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성(identity)이란 속성을 갖는다. 달리 말하면 박싱된 두 인스턴스는 값이 같아도 서로 다르다고 식별될 수 있다. 기본 타입의 값은 언제나 유효하나, 박.. 더보기
Effective Java ( 이펙티브 자바 ) - 아이템 60 정확한 답이 필요하다면 float와 double은 피하라 float와 double 타입은 과학과 공학 계산용으로 설계되었다. 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 세심하게 설계되었다. 따라서 정확한 결과가 필요할 때는 사용하면 안 된다. float와 double 타입은 특히 금융 관련 계산과는 맞지 않는다. 0.1 혹은 10의 음의 거듭 제곱 수(10^-1, 10^(-2))를 표현할 수 없기 때문이다. 예를 들어 주머니에 1.03 달러가 있었는데 그 중 42센트를 썼다고 해보자. 남은 돈은 얼마인가? 다음은 '어설프게' 작성해본 코드다. System.out.println(1.03 - 0.42); 이 코드는 0.6100000000000001 을 출력한다. .. 더보기