본문 바로가기

Effective Java

(63)
[Effective Java] 아이템 64 - 객체는 인터페이스를 사용해 참조하라 cf) Item.51 : 매개변수 타입으로 클래스가 아닌, 인터페이스를 사용하라 → 객체는 클래스가 아닌 인터페이스로 참조하라로 확장 적합한 인터페이스만있다면 매개변수뿐 아니라, return, 변수, 필드를 전부 인터페이스 타입으로 선언하자 실제 클래스를 사용해야 할 상황은 오직 생성자로 생성할 때뿐이다. 인터페이스를 타입으로 사용하는 습관은 프로그램을 훨씬 유연하게 만들어 준다 // Good Set sonSet = new LinkedHashSet(); Set sonSet = new HashSet(); //유연하게 변경가능 // Bad LinkedHashSet sonSet = new LinkedHashSet(); 인터페이스를 타입으로 사용하면 이후 구현 클래스를 교체할 때 새 클래스의 생성자(혹은 다른 ..
[Effective Java] 아이템 63 - 문자열 연결은 느리니 주의하라 String + String 에서의 + : 문자열 연결 연산자는 여러 문자열을 하나로 합쳐주는 편리한 수단 단 한 줄짜리 출력값 혹은 작고 크기가 고정된 객체의 문자열을 표현할 때만 사용하자 문자열은 불변이기 때문에 두 문자열을 연결할 경우에는 양쪽의 내용을 모두 복사해야하므로, 문자열 연결 연산자를 통한 문자열 n개의 연산은 O(n^2)이다. 예시 // 청구서의 item을 전부 하나의 문자열로 연결하는 메서드 // 문자열 연결을 잘못 사용한 예 - 아이템이 많아지면 많아질수록 성능저하 public String statement() { String result = ""; for (int i = 0; i < numItems(); i++) { result += lineForItem(i); } return r..
[Effective Java] 아이템 62 - 다른 타입이 적절하다면 문자열 사용을 피하라 String(문자열) - Text를 표현하도록 설계되고, 자바가 잘 지원해주는 타입 하지만 워낙 자바에서 너무 잘 지원해주어서, 원래의 의도대로 사용되지 않는 경향이 있으며, 이럴 때 문자열 사용을 피해야할 사례에 대해서 이야기한다. # 문자열을 쓰지 않아야할 사례 1. 다른 값 타입을 대신해서 문자열을 사용하는 경우 받는 데이터가 수치형 - int, float, BigInteger ... 적당한 수치를 타입으로 변환해서 사용할 것 Y/N 를 나타낼 수 있다면 적절한 열거 타입 혹은 boolean 타입을 사용할 것 즉 기본 타입이든 참조 타입이든 적절한 값 타입이 있다면 그것을 사용하고, 없다면 새로 하나 작성할 것 2. 열거 타입을 대신하여 문자열을 사용할 경우 3. 혼합 타입을 대신하여 문자열을 사용..
[Effective Java] 아이템 61 - 박싱된 기본 타입보다는 기본 타입을 사용하라 Java Data Type 기본 타입 : int , double, boolean .. 참조 타입 : String, List ... 기본 타입과 참조 타입의 차이에 대해서 설명해주세요 더보기 1. 각 타입에 따라 저장되는 값이 다르다. A. 기본 타입 - 변수에는 실제 값이 저장된다. B. 참조 타입 - 배열, 열거, 클래스, 인터페이스를 이용해서 선언된 변수는 메모리 주소 값을 가지게 된다. 2. 해당 값이 저장되는 위치 A. 기본 타입 - Stack B. 참조 타입 - Heap 기본 타입과 박싱된 기본 타입의 차이에 대해서 설명해주세요 더보기 기본타입 : int, double , boolean ... 박싱된 기본 타입 : Integer, Double , Boolean ... 차이점 기본 타입은 값만 ..
[Effective Java] 아이템 60 - 정확한 답이 필요하다면 float와 double은 피하라 float, double 과학과 공학 계산용으로 설계된 타입 이진 부동소수점 연산에 사용되며, 넓은 범위의 수를 빠르고 정밀한 "근사치" 계산을 위해 세심하게 설계 → 따라서 float과 double 타입은 특히 금융 관련과 같은 정확한 답이 필요한 계산에서는 사용하기 적절치 않다. ex) 정확한 값을 구해야할 때 double, float을 사용하는 경우 // Q1. 1.03달러가 있을 때 그중 42센트를 사용할 경우 얼마가 남았을까? System.out.println(1.03 - 0.42); // -> result : 0.6.10000000000000001 // Q2. 1달러로 10센트짜리 사탕 9개를 살 경우에 얼마가 남았을까? System.out.println(1.00 - 9 * 0.10); // ..
[Effective Java] 아이템 59 - 라이브러리를 익히고 사용하라 개요 도입으로써 난수 발생 예제를 확인해보자 static Random rnd = new Random(); static int Random(int n){ return Math.abs(rnd.nextInt()) % n; } 위 코드는 크게 세 가지의 문제를 가지고 있다. 문제 1. n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다. 문제 2. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. 문제 3. 지정한 범위 '바깥'의 수가 종종 튀어나올 수 있다. (rnd.nextInt() 와 Math.abs()의 Integer처리 때문) 위 결함을 해결하기 위해서는 의사난수 생성기, 정수론, 2의 보수 계산 등에 대한 지식이 필요한데... 우리는 그것을 알 필요가 없..
[Effective Java] 아이템 58 - 전통적인 for 문보다는 for-each문을 사용하라 개요 이전 아이템에서 for문이 while문 보다 더 적격이다 라는 내용을 다루었지만 같은 for문 내에서도 for-each 문을 사용하는 것이 더 바람직하다 반복자와 인덱스 변수는 모두 코드를 지저분하게 할 뿐 우리에게 진짜 필요한 건 원소들 뿐이다. 쓰이는 요소 종류가 늘어나면 오류가 발생할 가능성이 높아진다. 중첩되어 반복문이 사용되는 경우 변수를 잘못 사용할 틈새가 넓어진다. 혹시라도 잘못된 변수를 사용했을 때 컴파일러가 잘못 사용한 변수를 잡아준다는 보장도 없다. 컬렉션인지 배열인지에 따라 코드 형태도 상당히 달라지므로 주의해야 한다. 해결법 : for-each 위에서 언급한 내용들은 for-each문을 사용하면 모두 해결이 가능하다. 반복자와 인덱스 변수를 사용하지 않으니 코드가 깔끔해지고 오..
[Effective Java] 아이템 57 - 지역변수의 범위를 최소화하라 이번 아이템은 "클래스와 멤버의 접근 권한을 최소화하라" 의 취지로 접근하자. 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 처음 사용 지역변수의 범위를 줄이는 가장 강력한 기법은 역시 '가장 처음 쓰일 때 선언하기'이다. 지역변수를 사용시점 훨씬 이전에 사용하게 되면 막상 사용할 시점에 타입과 변수명이 기억나지 않을 수도 있기 때문이다. 거의 모든 지역변수는 선언과 동시에 초기화해야 한다. 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다. try-catch문은 제외! - 변수를 초기화하는 과정에서 예외를 던질 가능성이 있다면 try 블럭안에서 사용. 단 변수 값을 try 블럭 외부에서도 사용해야 하는 경우라면 try 블럭 앞..
[Effective Java] 아이템 56 - 공개된 API 요소에는 항상 문서화 주석을 작성하라 개요 쓸모 있는 API에는 잘 작성된 문서도 필요하다. API 문서는 사람이 직접 작성하므로, 코드의 변경 시 매번 함께 수정해줘야 하는데 자바에서는 자바독(javadoc)이라는 유틸리티가 도와준다. Javadoc : 소스코드 파일에서 문서화 주석이라는 특수한 형태로 기술된 설명을 추려 API 문서로 변환해준다. API의 올바른 문서화를 위해서는 공개된 모든 클래스, 인터페이스, 메서드, 필드 선언에 문서화 주석을 달아야한다. 직렬화할 수 있는 클래스라면 직렬화 형태에 관해서도 적어야 한다. 문서화 주석이 없다면 자바독도 그저 공개 API 요소들의 '선언'만 나열해주는게 전부이다. 문서화 주석 기본 규칙 메서드용 문서화 주석에는 해당 메서드와 클라이언트 사이의 규약을 명료하게 기술해야 한다. 상속용으로 ..
[Effective Java] 아이템55 - 옵셔널 반환은 신중히 하라 자바 8 전의 경우 메서드가 특정 조건에서 값을 반환할 수 없을 때, 예외를 던지거나 (반환 타입이 객체 참조라면) null을 반환했다. 하지만 예외는 진짜 예외적인 상황에서만 사용해야 하며 예외를 생성할 때 스택 추적 전체를 캡처하므로 비용도 만만치 않다. null을 반환하면 위 문제는 생기지 않지만, 별도의 null 처리 코드를 추가해야 한다. 자바 버전이 8로 올라가면서 또 하나의 선택지가 생겼다. Optional는 null이 아닌 T 타입 참조를 하나 담거나, 혹은 아무것도 담지 않을 수 있다. 옵셔널은 최대 1개 가질 수 있는 불변 컬렉션이다. T를 반환해야 하지만 특정 조건에서는 아무것도 반환하지 않아야 할 때 T 대신 Optional를 반환하도록 선언하면 된다. 그러면 유효한 반환값이 없을 ..