본문 바로가기
IT/Java

이펙티브 자바 4장 -2

by 봉즙 2019. 12. 2.

추상 클래스보다는 인터페이스를 우선하라

추상클래스 방식은 자바가 단일상속만 지원하기에 새로운 타입을 정의하는데 제약을 가지게 된다.
인터페이스의 경우 어떠한 클래스를 상속했든 같은 타입으로 취급된다.

기존 클래스에도 손쉽게 새로운 인터페이스를 구현해 넣을 수 있다.

인터페이스는 믹스인 정의에 안성맞춤이다. 믹스인이란 클래스가 구현할 수 있는 타입으로 믹스인을 구현한 클래스에 원래의 주된 타입 외에도 특정 선택적 행위를 제공한다고 선언하는 효과를 준다.

 

인터페이스로는 계층구조가 없는 타입 프레임워크를 만들 수 있다.

언터페이스는 기능을 향상시키는 안전하고 강력한 수단이다. 추상클래스로 정의해둔다면 그타입에 기능을 추가하는 방법은 상속뿐이며 상속해서 만든 클래스는 래퍼클래스보다 활용도가 떨어지고 깨지기는 더 쉽다.

템플릿 메서드 패턴 : 인터페이스로는 타입을 정의하고 골격 구현 클래스를 통해 메서드들을 구현해둔다면 골격 구현을 확장하는 것만으로도 인터페이스를 구현하는 것이 가능하다.

 

인터페이스는 구현하는 쪽을 생각해서 설계하라

디폴트메서드 : 인터페이스 구현한 후 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰인다. 컴파일에 성공하더라도 기존 구현체에 런타임 오류를 일으킬 수 있다. 이러한 이유 때문에 기존 인터페이스에 디폴트 메서드로 새 메서드를 추가하는 것은 반드시 필요한 경우가 아니라면 피해야한다.

 

인터페이스는 타입을 정의하는 용도로만 사용하라

클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 이야기하는 것이다.
상수 공개용 수단으로 사용하는 것은 좋지 않다.

 

태그 달린 클래스보다는 클래스 계층 구조를 활용하라

태그 달린 클래스는 어러 코드가 혼합이 되있어 불필요한 코드가 많으며 사용하지 않는 코드들까지 초기화 하는 등 단점이 많다.

태그 달린 클래스는 장황하고, 오류를 내기 쉬우며 비효율적이다. 또한 클래스 계층구조를 흉내낸 것 뿐이다. 태그 필드를 사용하고 있다면 계층구조로 리팩토링하는 것이 좋다.

 

멤버 클래스는 되도록 static으로 만들어라

중첩클래스 : 다른 클래스 안에 정의된 클래스, 자신을 감싼 바깥 클래스에서만 사용되야하며, 그외에 사용하려면 톱레벨 클래스로 만들어야한다. 중첩 클래스의 종류는 정적 멤버 클래스, 비정적 멤버 클래스, 익명 클래스, 지역클래스 네가지가 존재한다. 정적 멤버 클래스를 제외하면 내부클래스에 해당된다.

 

정적 멤버 클래스는 다른 클래스안에서 선언되며 바깥 클래스의 private 멤버에 접근할 수 있다는 점을 제외하면 다른 정적 멤버와 같은 접근 규칙을 적용받는다.

비정적 멤버 클래스는 정적 멤버 크래스와 static의 차이지만 바깥 클래스의 인스턴스와 암묵적으로 연결되기에 this를 사용해 바깥 인스턴스의 메서드를 호출하거나 잠조를 가져올 수 있다. 바깥 인스턴스 없이는 생성할 수 없다. 어댑터를 정의할 때 자주 쓰이며 이는 어떤 클래스의 인스턴스를 감싸 마치 다른 클래스의 인스턴스처럼 보이게 하는 것이다.

멤버 클래스에서 바깥 인스턴스에 접글할 일이 없다면 무조건 static을 붙여서 정적 멤버 클래스로 만드는 것이 좋다.

 

익명 클래스는 이름이 없으며 바깥 클래스의 멤버도 아니다. 도한 선언 과 동시에 인스턴스가 만들어 지기에 코드의 어디에서든 만들 수 있다. 상수 이외의 멤버는 가질 수 없다. 익명클래스는 제약이 많은 편이다.

그외의 경우에는 지역클래스로 만들어야한다.

 

톱레벨 클래스는 한 파일에 하나만 담아라

소스파일 하나에은 톱레벨 클래스 혹은 톱레벨 인터페이스를 하나만 담아야 컴파일러가 한클래스에 대한 정의를 여러개 만드는 일을 막을 수 있다.

 

 

'IT > Java' 카테고리의 다른 글

이펙티브 자바 5장 - 제네릭 2  (0) 2019.12.05
이펙티브 자바 5장  (0) 2019.12.03
이펙티브 자바 4장 - 1  (0) 2019.11.27
이펙티브 자바 3장  (0) 2019.11.26
이펙티브자바 2장  (0) 2019.11.23

댓글