본문 바로가기
책(독서)

[이펙티브자바] ~149p item 21~24

by DevJR 2020. 10. 19.

아이템 21 - 인터페이스는 구현하는 쪽을 생각해 설계하라.

 

-> 기존에는 기존 구현체를 깨뜨리지 않고 인터페이스에 새로운 메서드를 추가할 방법이 없었다. (이미 해당 인터페이스가 클라이언트 쪽에서 구현되어 있을 때 해당 인터페이스를 구현하고 있는 클래스에서 모두 다시 구현을 해주어야 했다. )

-> 하지만 자바 8버전에서는 인터페이스에 '디폴트 메서드' 라는 것을 구현할 수 있게 되었다.

-> 디폴트 메서드는 인터페이스에 선언해도 해당 인터페이스를 구현한 클래스에서 필수적으로 구현해야 하는 내용은 아니다. 그렇기에 새로운 메서드를 추가할 때 상당한 유연성을 제공한다.

-> 하지만, 이미 배포된 라이브러리 인터페이스에 디폴트 메서드를 추가할 때에는 기존 구현체에 따라 런타임 오류를 발생시킬 수 있다. 그렇기 때문에 추후에 추가하는 내용은 설계시에 고민할 거리가 많고, 디폴트 메서드라도 주의해서 추가해야 한다. (책에서는 최소 다른 구현으로 3가지 이상 구현해보고 테스트 해보라고 나와있다.)

-> 결과적으로 구현하는 쪽을 고려하면 아무리 인터페이스에 유연성을 제공하는 디폴트 메서드라도 실제 추가시에는 주의해야 한다는 것이다.

 

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

 

-> 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해 주는 것.

-> 이 용도 이외의 용도로 사용하지 말라

-> 특히, 상수 인터페이스는 안티패턴이다.

 

아이템 23 - 태그 달린 클래스보다는 클래스 계층구조를 활용하라

 

-> 태그달린 클래스 (책 142p 참조)

-> 태그 달린 클래스를 쓸 바에는 계층구조 클래스를 활용해서 (추상클래스) 상위클래스를 잡고, 해당 상위 클래스를 상속받아 하위 클래스들을 각각 구현하게끔 처리하는 게 좋다.

-> 일단 태그 달린 클래스가 책에 나온대로라면, 거의 이렇게 짤 일이 없을 것 같아서 참고하는 정도면 될 것 같다.

 

아이템 24 - 멤버 클래스는 되도록 static으로 만들라

 

-> 중첩 클래스 4가지

  • 정적 멤버 클래스
  • (비정적) 멤버 클래스
  • 익명 클래스
  • 지역 클래스

-> 참고 : sjh836.tistory.com/145

 

중첩클래스를 알아보자 (내부클래스, 정적 중첩클래스, 지역클래스, 익명클래스)

일반클래스는 Package member class 라고들 하며, 아래 항목에서 제외했다. 구글링해보면 클래스간에 관계나 큰 틀에서의 구조를 안잡고 나열하는 식이 많은 것 같다ㅋㅋ 1. 중첩 클래스는 왜 쓰는가?

sjh836.tistory.com

-> 그때그때 맞춰서 쓰라는 얘기