본문 바로가기

Effective Java73

[Effective Java] 아이템67 최적화는 신중히 하라 ■ 최적화 관련 격언 첫번째, 하지 마라. 두 번째, (전문가 한정) 아직 하지 마라. 다시 말해, 완전히 명백하고 최적화되지 않은 해법을 찾을 때까지는 하지마라. 자그마한 효율성은 모두 잊자. 섣부른 최적화가 만악의 근원이다. 이 격언들은 자바가 탄생하기 20년 전에 나온 것으로 최적화의 어두운 진실을 이야기한다. 최적화는 좋은 결과 보다는 해로운 결과로 이어지기 쉽고, 섣불리 진행하면 특히 더 그렇다. 따라서 성능 때문에 견고한 구조를 희생하지 말자. 빠른 프로그램보다는 좋은 프로그램을 작성하라. 좋은 프로그램이지만 원하는 성능이 나오지 않는다면 그 아키텍처 자체가 최적화할 수 있는 길을 안내해줄 것이다. 좋은 프로그램은 정보 은닉 원칙을 따르므로 개별 구성요소의 내부를 독립적으로 설계 할 수 있다... 2021. 8. 1.
[Effective Java] 아이템66 네이티브 메서드는 신중히 사용하라 자바 네이티브 인터페이스는 자바 프로그램이 네이티브 메서드를 호출하는 기술이다. 여기서 네이티브 메서드란 C나 C++ 같은 네이티브 프로그래밍 언어로 작성한 메서드를 말한다. 전통적으로 네이티브 메서드의 주요 쓰임은 다음 세가지 이다. 레지스트리 같은 플랫폼 특화 기능 사용 네이티브 코드로 작성된 기존 라이브러리를 사용 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성 성능을 개선할 목적으로 네이티브 메서드를 사용하는 것은 거의 권장하지 않는다. 네이티브 메서드에는 심각한 단점이 있다. 네이티브 언어가 안전하지 않으므로(아이템50) 네이티브 메서드를 사용하는 애플리케이션도 메모리 훼손 오류로부터 더 이상 안전하지 않다. 또한 디버깅도 어렵고, 이식성도 낮으며, 가비지 컬.. 2021. 8. 1.
[Effective Java] 아이템65 리플렉션보다는 인터페이스를 사용하라 ■ 리플렉션 리플렉션 기능(java.lang.reflect)을 이용하면 프로그램에서 임의의 클래스에 접근할 수 있다. Class 객체가 주어지면 그 클래스의 생성자, 메서드, 필드에 해당하는 Constructor, Method, Field 인스턴스를 가져올 수 있고, 이어서 이 인스턴스들로는 그 클래스의 멤버 이름, 필드 타입, 메서드 시그니처 등을 가져올 수 있다. 또한 Constructor, Method, Field 인스턴스를 이용해 각각에 연결된 실제 생성자, 메서드, 필드를 조작할 수도 있다. 예를 들어 Method.invoke는 어떤 클래스의 어떤 객체가 가진 어떤 메서드라도 호출할 수 있다. ■ 리플렉션 단점 컴파일타임 타입 검사가 주는 이점을 하나도 누릴 수 없다. 리플렉션을 이용하면 코드가.. 2021. 8. 1.
[Effective Java] 아이템64 객체는 인터페이스를 사용해 참조하라 적합한 인터페이스만 있다면 매개변수뿐 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라. 객체의 실제 클래스를 사용해야 할 상황은 '오직' 생성자로 생성할 때뿐이다. 인터페이스를 타입으로 사용하는 습관을 길러두면 프로그램이 훨씬 유연해질 것이다. 단, 주의할 점이 하나 있다. 원래 클래스가 인터페이스의 일반 규약 이외의 특별한 기능을 제공하며, 주변 코드가 이 기능에 기대어 동작한다면 새로운 클래스도 반드시 같은 기능을 제공해야 한다. 따라서 적합한 인터페이스가 없다면 당연히 클래스로 참조해야 한다. 적합한 인터페이스가 없는 두번쨰 부류는 클래스 기반으로 작성된 프레임 워크가 제공하는 객체들이다. OutputStream 등 java.io 패키지의 여러 클래스가 이 부류에 속한다. 적합한 인.. 2021. 8. 1.
[Effective Java] 아이템63 문자열 연결은 느리니 주의하라 문자열 연결 연산자(+)는 여러 문자열을 하나로 합쳐주는 편리한 수단이다. 한 줄짜리 출력 값 혹은 작고 크기가 고정된 객체의 문자열 표현을 만들 때는 괜찮지만, 본격적으로 사용하기 시작하면 성능 저하를 감내하기 어렵다. 문자열 연결 연산자로 문자열 n개를 잇는 시간은 n^2에 비례한다. 문자열은 불변이라서 두 문자열을 연결할 경우 양쪽의 내용을 모두 복사해야한다. 대신에 StringBuilder의 append 메서드를 사용하라. 문자 배열을 사용하거나, 문자열(연결하지 않고)을 하나씩 처리하는 방법도 있다. 2021. 8. 1.
[Effective Java] 아이템62 다른 타입이 적절하다면 문자열 사용을 피하라 ■ 문자열은 다른 값 타입을 대신하기에 적합하지 않다. 많은 사람이 파일, 네트워크, 키보드 입력으로부터 데이터를 받을 때 주로 문자열을 사용한다. 하지만 입력 받은 데이터가 진짜 문자열일 때만 그렇게하는게 좋다. 받은 데이터가 수치형이라면 int, float 같은 타입으로 변환해야 한다. "예/아니오"의 경우라면 boolean으로 변환해야 한다. 즉, 기본 타입이든 참조 타입이든 적절한 값 타입이 있다면 그것을 사용하고, 없다면 새로 하나 작성하라. 문자열은 열거 타입을 대신하기에 적합하지 않다. 또한 문자열은 혼합 타입을 대신하기에 적합하지 않다. 문자열은 잘못 사용하면 번거롭고, 덜 유연하고, 느리고, 오류 가능성도 크다. 2021. 7. 23.