Java

Effective Java 제 4장 - 클래스와 인터페이스

iksadnorth 2023. 8. 22. 23:03

해당 게시물은 책 'Effective Java'를 참고하고 작성했습니다.

클래스와 멤버의 접근 권한을 가능하다면 최소화해라!
필요한 부분만 외부 API로 노출시켜야 유지보수가 편하다.
모든 부분을 노출시키면 모든 부분을 지속적으로 지원해야 한다.

public 클래스의 필드는 public을 사용하지 마라!
OOP의 캡슐화를 극대화하기 위해 필드에 직접 접근하는 것을 지양하기.

불변 객체를 사용해라!
모든 필드를 final로 선언함으로서 동시성에서 안전하게 해야 한다.
final을 사용하지 않으면 다중 스레드 환경에서 안전하려면 동기화 블록을 설정해야 하는데 그럴바엔
불변 객체를 이용해서 block없이 연산할 수 있게 한다. 

상속보다 컴포지션 이용하기!
상속으로 클래스를 만들면 부모 클래스에 의해 자식 클래스가 휘둘릴 수도 있다.
부모 클래스의 코드를 수정했을 뿐인데 자식 클래스의 오류가 발생할 수도 있기 때문에 
부모 클래스에 의존해도 되는지에 대해 깊게 생각하고 상속을 해야 한다. 
즉, 상속은 캡슐화 특성을 해치는 경향이 있다.
최초 설계자가 건드리지 말았으면 하는 부분을 건드릴 수 있기 때문이다.
위 같은 상황으로 인해 거의 컴포지션을 이용하는 것이 옳다.
컴포지션은 원하는 메서드만 노출시킬 수 있어서 캡슐화 특성을 크게 살릴 수 있고
부모 클래스의 코드가 변경되어도 컴포지션의 메서드만
간단히 수정하면 되기에 상속보다 컴포지션을 주로 사용해야 한다.

추상 클래스보다 인터페이스를 활용하라!
인터페이스는 추상 클래스와 달리 다중 구현이 가능하기 때문에 똑같이 구현가능하다면 
인터페이스를 이용하는 것이 좋다. 다만 인터페이스에서 요구하는 기능이 너무 많아 일일이 
구현하는 것이 부담이라면 골격 추상 클래스를 만들어서 미리 몇몇 기능을 구현해주면 된다.

인터페이스에 상수를 저장하지 마라!
말 그대로 Java 문법에서 허용한다하여 Interface에 상수를 정의하지 마라.

중첩 클래스를 사용할 때, 되도록 static으로 만들어라!
중첩 클래스를 만들 때, 외부 클래스의 인스턴스를 사용하는 경우가 아니라면
static으로 선언해 정적 멤버로 만들어야 한다.
왜냐 하면, 인스턴스 클래스는 외부와 내부 클래스의 관계 정보를 저장하기 위한 추가적인 메모리 공간을 차지하며 생성 시간도 더 소비된다.