728x90
반응형

전체 글 168

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

⭐ 자바 8에 와서 기존 인터페이스에 메서드를 추가할 수 있도록 디폴트 메서드를 소개했지만 그 위험이 완전히 사라진 것은 아니다. 자바 8에서는 핵심 컬렉션 인터페이스들에 다수의 디폴트 메서드가 추가되었다. 주로 람다를 활용하기 위해서다. 하지만, 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어려운 법이다. 자바 8의 Collection 인터페이스에 추가된 디폴트 메서드 default boolean removeIf(Predicate

Java 2022.05.24

[Effective Java] 아이템 20. 추상 클래스보다는 인터페이스를 우선하라.

⭐ 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다. public class Marine implements GroundAttackUnit, Comparable { private String name; private int health; @Override public int compareTo(Marine o) { return Integer.compare(health, o.getHealth()); } /* 인터페이스 override 생략 */ ... /* getter, setter 생략 */ ... } 이처럼 자바 플랫폼에서도 Comparable, Iterable, AutoCloseable 인터페이스가 새로 추가됐을 때 표준 라이브러리의 수많은 기존 클래스가 이 인터페이스들을 구현한 채 릴리..

Java 2022.05.24

[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
728x90
반응형