이펙티브 자바13 [Effective Java] 아이템26 로 타입은 사용하지 말라 ■ 로(raw) 타입이란? 로 타입이란 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않은 때를 말한다. 예를 들어서 List의 로 타입은 List다. 제네릭 도입 이후에도 로 타입을 지원하는 이유는 기존 자바 버전과의 호환성 때문이다. 아래 컬렉션 예제 코드에서처럼 로 타입을 사용하여 객체를 저장 하면 컴파일 할 때는 에러가 발생하지 않는다. 그리고 런타임 때 저장된 객체를 꺼내면서 오류가 발생한다. 오류는 컴파일 시점에 발견하는 것이 좋다. //로 타입으로 인스턴스 저장 private final Collection stamps = ...; stamps.add(new Coin()); //데이터 꺼낼 때 오류 발생 for(Iterator i = stamps.iterator(); i.hasNext();){.. 2021. 3. 8. [Effective Java] 아이템20 추상 클래스보다는 인터페이스를 우선하라 ■ 추상 클래스와 인터페이스의 차이점 추상 클래스 : 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야한다. 인터페이스 : 인터페이스에서 정의한 메서드를 모두 정의한 클래스라면 다른 어떤 클래스를 상속했든 상관없이 같은 타입으로 취급. 즉, 인터페이스는 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다. 인터페이스가 요구하는 메서드를 구현하고, implements만 추가하면 된다. 추상 클래스의 경우 2개의 클래스가 같은 추상 클래스를 확장하길 원한다면, 그 추상 클래스는 계층 구조상 두 클래스의 공통 조상이어야한다. 새로 추가된 추상 클래스의 모든 자손이 적절하지 않은 상황에서도 이를 상속하게 된다. ■ 믹스인 정의 인터페이스는 믹스인 정의에 맞춤이다.. 2021. 2. 24. [Effective Java] 아이템17 변경 가능성을 최소화하라 ■ 불변 클래스란? 불변 클래스란 인스턴스의 내부 값을 수정할 수 없는 클래스다. 불변 클래스는 가변 클래스보다 설계하고 구현하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다. 불변 객체는 단순하며 생성된 시점의 상태를 파괴될 때까지 그대로 간직한다. ■ 불변 클래스 생성 규칙 객체의 상태를 변경하는 메서드를 제공하지 않는다. 클래스를 확장할 수 없도록한다. 클래스 final 선언 private 생성자 모든 필드를 final로 선언한다. 모든 필드를 private로 선언한다. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 생성자, 접근자, readObject 메서드 모두에서 방어적 복사를 수행하라. 다음은 불변 복소수 클래스이다. 이 클래스는 복소수(실수부, 허수부로 구성된 수)를 표현.. 2021. 2. 17. [Effective Java] 아이템15 클래스와 멤버의 접근 권한을 최소화하라 어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 바로 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐다. API를 통해서만 다른 컴포넌트와 소통하고 서로의 내부 동작 방식에는 전혀 개의치 않는다. 이것을 정보은닉, 혹은 캡슐화라고 한다. ■ 정보 은닉의 장점 여러 컴포넌트를 병렬로 개발할 수 있기 때문에 시스템 개발 속도를 높인다. 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고 다른 컴포넌트로 교체비용도 줄어든다. 정보 은닉이 성능을 높여주지는 않지만 성능 최적화에 도움을 준다. 다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 최적화 가능 외부에 의존하지 않고 독자적으로 동작할 수 있는 컴포넌트라면 그 컴포넌트와 함께 개발되지 않은 낯선 환경에서도 유용하게.. 2021. 2. 17. [Effective Java] 아이템14 Comparable을 구현할지 고려하라 ■ Comparable 인터페이스 Comparable 인터페이스는 객체간 비교를 용이하게 해주는 인터페이스이다. 이 인터페이스를 구현한 객체들은 서로간의 비교 연산이 가능하다. Comparable을 구현한 객체들의 배열은 다음처럼 손쉽게 정렬할 수 있다. Arrays.sort(a); 자바 플랫폼 라이브러리의 모든 값 클래스와 열거타입이 Comparable을 구현했다. 알파벳, 숫자, 연대 같이 순서가 명확한 값 클래스를 작성한다면 반드시 Comparable 인터페이스를 구현하자. ■ compareTo Comparable 인터페이스의 유일한 메서드인 compareTo의 규약을 살펴 보겠다. 매개 변수 인스턴스와 자신의 인스턴스를 비교하도록 해야한다. 또한 자신의 인스턴스가 매개변수보다 작으면 음수, 같으면.. 2021. 2. 5. [Effective Java] 아이템11 equals를 재정의하려거든 hashCode도 재정의하라 ■ Object 명세 규약 equals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇번을 호출해도 일관되게 항상 같은 값을 반환해야 한다. equals(Object)가 두 객체를 같다고 판단했으면, 두 객체의 hashCode는 똑같은 값을 반환해야한다. equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 없다. 단, 다른 객체에 대해서는 다른 값을 반환해야 해시 테이블의 성능이 좋아진다. hashCode 재정의를 하지 않았을 경우 문제가 되는 조합은 두번째 조항이다. 즉, 논리적으로 같은 객체는 같은 해시 코드를 반환해야한다. 아래와 같이 PhoneNumber 클래스가 있.. 2021. 1. 24. 이전 1 2 3 다음