728x90
반응형

Effective Java 67

[Effective Java] 아이템 18. 상속보다는 컴포지션을 사용하라.

상속은 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다. 그 여파로 코드 한 줄 건드리지 않은 하위 클래스가 오동작할 수 있다. 잘못된 예 - 상속을 잘못 사용했다. public class InstrumentedHashSet extends HashSet { private int addCount = 0; public InstrumentedHashSet(){}; public InstrumentedHashSet(int initCap, float loadFactor){ super(initCap, loadFactor); } @Override public boolean add(E e) { addCount++; return super.add(e); } @Override public ..

Java 2022.05.24

[Effective Java] 아이템 17. 변경 가능성을 최소화하라.

불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다. 클래스를 불변으로 만들기 위한 5가지 규칙 1️⃣ 객체의 상태를 변경하는 메서드(setter)를 제공하지 않는다. 2️⃣ 클래스를 확장할 수 없도록 한다. 3️⃣ 모든 필드를 final로 선언한다. 4️⃣ 모든 필드를 private으로 선언한다. 5️⃣ 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 예제 ) 불변의 복소수 // class를 final로 선언하여 확장할 수 없도록 함 public final class Complex { // 모든 필드를 private final로 선언 private final double re; private final double im; public C..

Java 2022.05.24

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

이전 코드 public class Point { // public public double x; public double y; } 변경 후 코드 public class Point { // private private double x; private double y; // getter, setter public double getX() { return x; } public double getY() { return y; } public void setX(double x) { this.x = x; } public void setY(double y) { this.y = y; } } public 클래스는 절대 가변 필드를 직접 노출해서는 안 된다. 불변 필드라면 노출해도 덜 위험하지만 완전히 안심할 수는 없다. ..

Java 2022.05.24

[Effective Java] 아이템 15. 클래스와 맴버의 접근 권한을 최소화하라.

오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않는다. 정보 은닉, 혹은 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리이다. ⭐ 정보 은닉의 핵심 : 모든 클래스와 맴버의 접근성을 가능한 한 좁혀야 한다. ⭐ public 클래스의 인스턴스 필드는 되도록 public이 아니어야 한다. public class User { private long userSn; private String userId; private String userPw; } ⭐ public 가변 필드를 갖는 클래스는 일반적으로 스레드(멀티 스레드에) 안전하지 않다. 스레드 불안정 : 상태 제어가 잘못되면 프로그램은 불안정해져서 먹통이 되거나 다운되는것을 말한다. ⭐ 클래스에서 pub..

Java 2022.05.24

[Effective Java] 아이템 14. Comparable을 구혈할지 고려하라.

알파벳, 숫자, 연대 같이 순서가 명확한 값 클래스를 작성한다면 반드시 Comparable 인터페이스를 구현하자. 이 객체와 주어진 객체의 순서를 비교한다. 이 객체가 주어진 객체보다 작으면 음의 정수를, 같으면 0을, 크면 양의 정수를 반환한다. 이 객체와 비교할 수 없는 타입의 객체가 주어지면 ClassCastException 을 던진다. public class Item14 implements Comparable { private Integer integer; public Item14(Integer integer) { this.integer = integer; } @Override public int compareTo(Item14 o) { return Integer.compare(integer, o...

Java 2022.05.24

[Effective Java] 아이템 13. clone 재정의는 주의해서 진행하라.

Cloneable은 복제해도 되는 클래스임을 명시하는 용도의 믹스인 인터페이스지만, 아쉽게도 의도한 목적을 제대로 이루지 못했다. 가장 큰 문제는 clone 메서드가 선언된 곳이 Cloneable이 아닌 Object이고, 그마저도 protected라는 데 있다. protected native Object clone() throws CloneNotSupportedException; Object 명세에 적힌 규약 ❗ 이 객체의 복사본을 생성해 반환한다. '복사'의 정확한 뜻은 그 객체를 구현한 클래스에 따라 다를 수 있다. 일반적인 의도는 다음과 같다. 어떤 객체 x에 대해 다음 식은 참이다. x.clone() != x 또한 다음 식도 참이다. x.clone().getClass() == x.g..

Java 2022.05.24
728x90
반응형