Reference/Effective-Java

    [Effective-Java] Chapter4 #18. 상속보다는 컴포지션을 사용하라

    📌 상속의 문제점 상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다. 같은 프로그래머가 통제하는 패키지 안에서라면 상속도 안전한 방법이다. 확장할 목적으로 설계되었고 문서화도 잘 된 클래스(Item 19)라면 마찬가지로 안전하다. 하지만 일반적인 구체 클래스를 패키지 경계를 넘어, 다른 패키지의 구체 클래스를 상속하는 일은 위험하다. (참고로 여기서 '상속'은 클래스가 다른 클래스를 확장하는 구현 상속을 말하고, 인터페이스 상속과는 무관하다.) 1️⃣ 예제1 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. 상위 클래스는 릴리즈마다 내부 구현이 달라질 수 있으며, 그 여파로 하위 클래스는 아무것도 건드리지 않았는데 오동작할 수 있다. 만약, 상위 클래스 설계자가 확장을 충분히 고려하지 않고, ..

    [Effective-Java] Chapter4 #17. 변경 가능성을 최소화하라 : 불변 클래스

    불변 클래스란 그 인스턴스 내부 값을 수정할 수 없는 클래스를 말한다. 불변 인스턴스에 간직된 정보는 객체가 파괴되는 순간까지 절대 달라지지 않는다. 자바 플랫폼 라이브러리의 String, 기본 타입 박싱 클래스들, BigInteger, BigDecimal이 여기 속한다. 불변 클래스는 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 안전하다. 📌 구현 규칙 불변 클래스를 생성하기 위해 다섯 가지 규칙을 따르면 된다. 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. getter를 만들었다고 무조건 setter를 만들지는 말자. 클래스를 확장할 수 없도록 한다. 하위 클래스에서 객체의 상태를 변하게 만드는 상태를 방지한다. 대표적인 방법은 final로 선언하는 것이지만, 기본 생성자..

    [Effective-Java] Chapter4 #16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

    📌 잘못된 클래스 class Point { public double x; public double y; } 위 클래스는 다음과 같은 문제점이 있다. 캡슐화의 이점을 제공하지 못함 (데이터 필드 직접 접근 가능) 내부 표현 변경시 API 수정 필요 불변식 보장 불가능 외부에서 필드 접근 시, 부수 작업 수행 불가능 📌 public 접근자 class Point{ private double x; private double y; public Point(double x, double y){ this.x = x; this.y = y; } public double getX(){ return x; } public double getY(){ return y; } public void setX(double x){ retu..

    [Effective-Java] Chapter4 #15. 클래스와 멤버의 접근 권한을 최소화하라

    잘 설계된 컴포넌트는 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐다. 📌 정보 은닉의 장점 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨김으로써 구현과 API를 깔끔히 분리한다. 오직 API를 통해서만 다른 컴포넌트와 소통하며, 서로의 내부 동작 방식에 전혀 개의치 않으므로 독립적으로 작동한다. 이를 정보 은닉, 캡슐화라고 하는데 소프트웨어 설계의 근간이 되는 원리이다. 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있다. 각 컴포넌트 개발자는 명확하게 정의된 인터페이스를 기반으로 개발을 진행할 수 있다. 또한, 인터페이스가 변경되어도 해당 컴포넌트만 수정하면 되므로 전체 시스템에 대한 영향을 최소화할 수 있다. 시스템 관리 비용을 낮춘다. 각 컴포넌..