아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용하라. 기본 타입(int), 박싱 기본 타입(Integer)은 오토 박싱 / 오토 언박싱을 통해서 구분되지 않고 사용될 수 있음. 기본 타입, 박싱 기본 타입은 다음 차이점이 있음. 기본 타입은 값만 가짐. 박싱 기본 타입은 식별성(identity)도 가짐. → '=='으로 비교하면 같은 객체인지 확인함. 기본 타입은 언제나 유효함. 박싱 기본 타입은 유효하지 않을 수 있음. → 박싱 기본 타입은 Null 값을 전달할 수 있음. 기본 타입이 메모리 / 시간적으로 더 효율적임. 박싱 기본 타입은 연산 시, 오토 박싱 / 오토 언박싱 시에 오버로딩이 발생하기 때문임. 기본 타입과 박싱된 기본 타입의 차이 자바는 오토 박싱 / 오토 언박싱 기능을 제공해주기..
아이템 64. 객체는 인터페이스를 사용해 참조하라. 적합한 인터페이스만 있다면 매개변수, 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언. 구현체만 간단히 갈아끼울 수 있기 때문에 코드 변화가 좀 더 유연하다. 클래스 타입을 사용해도 되는 경우. 적합한 인터페이스가 없는 경우. 예를 들면 record 같은 값 클래스. 클래스 기반으로 작성된 프레임워크가 제공하는 객체들. 예를 들면 OutputStream 같은 것들. 인터페이스에 없는 특별한 메서드를 제공하는 클래스 이런 메서드를 너무 많이 사용할 경우, 구현체를 바꾸는 것이 어려워짐. 가급적이면 덜 의존하도록 해야함. 적합한 인터페이스가 없다면, 클래스의 계층구조 중 필요한 기능을 만족하는 가장 추상적인(상위) 클래스를 사용하자. 코드의 모든 곳을..
아이템 63. 문자열 연결은 느리니 주의하라 String은 불변 객체다. 문자열 덧셈으로 String끼리 연결하면 각 문자열의 값을 복사한 후 붙여야 함. 따라서 문자열 n개를 잇는 시간은 n^2에 비례하게 됨. 문자열 연결을 빠르게 하기 위해서는 Builder의 append(), toString()을 이용하면 됨. 문자열 n개를 잇는데 필요한 시간은 O(n^2)임. 문자열(String)은 불변 객체다. 따라서 문자열끼리 잇는 연산을 하려면, 각 문자열의 모든 내용을 복사한 다음에 새로운 객체를 만드는 작업을 해야한다. 이 연산의 시간복잡도는 O(n^2)이다. 문자열 덧셈의 문제점을 해결하기 위해서는 StringBuilder의 append(), toString() 연산을 이용하면 된다. public cl..
아이템 52. 다중정의는 신중히 사용하라. 다중정의(Overloading)된 메서드는 컴파일 시점에 어느 메서드가 호출될지 결정된다. 재정의된(Overriding)된 메서드는 런타임 시점에 객체 타입으로 어느 메서드가 호출될지 결정된다. 다중정의는 사용하지 않는 것이 좋다. 사용하는 쪽에서 어떤 메서드가 사용될지 추론하기 어렵기 때문이다. 매개변수 수가 같은 다중정의는 가급적이면 사용하면 안됨. 대안 다중정의 대신 이름을 다르게 지어주면 됨. 생성자라면서 팩토리 메서드를 사용하면 됨. 다중정의 어쩔 수 없는 경우 매개변수 수가 같은 다중정의라도, 각 매개변수가 근본적으로 다른 경우라면 어떤 메서드가 호출될지 정확히 추론할 수 있음. 근본적으로 다른 경우는 서로 형변환 할 수 없는 경우를 의미함. 허나 오..
아이템 55. 옵셔널 반환은 신중히 하라. 반환할 값이 없을 때는 세 가지 방법이 있음. 예외 던지기 → 예외는 진짜 예외일 때 던져야 하는데, 이게 예외인지? null 반환하기 → null 반환 시 null 대처해야하며, 그러기 위해서 사용자는 메서드의 내부 구조도 알아야함. Optional 반환하기 Optional은 체크 예외처럼 메서드 사용자에게 빈 값이 반환될 수 있음을 알리고 적절히 대체할 것을 요구하기 위한 용도로 사용됨. Optional의 기본 처리 방법은 다음과 같음. 값을 바로 얻기 없는 경우 기본값 설정하기. (비용이 클 경우, orElseGet으로 Supplier를 이용해서 비용 최적화 가능) 없는 경우 예외 던지기. Optional을 잘 사용하는 방법 isPresent()보다 orE..