본문 바로가기
728x90

JAVA/Effective Java65

item 23. 태그 달린 클래스보다는 클래스 계층 구조를 활용하라 public class Figure { enum Shape {RECTANGLE, CIRCLE} // 태그 필드 - 현재 모양을 나타냄 final Shape shape; // 모양이 사각형일때만 사용 double length; double width; // 모양이 원형일때만 사용 double radius; // 원 생성자 Figure(Shape shape, double radius) { shape = Shape.CIRCLE; this.radius = radius; } //사각형 생성자 Figure(Shape shape, double length, double width) { shape = Shape.RECTANGLE; this.length = length; this.width = width; } //태그 .. 2022. 5. 7.
item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라 - 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입이다. - 클래스가 인터페이스를 구현한다 => 자신이 인스턴스로부터 무엇을 할 수 있는지를 클라이언트에 얘기 해 주는 것. * 잘못 사용한 예 : 상수 인터페이스 // 절 대 따 라 하 지 마 // public interface PhysicalConstants { // 아보가드로 수 (1/몰) double AVOCADOS_NUMBER = 6.022_140_857e23; // 볼츠만 상수 (J/K) double BOLTZMANN_CONSTANT = 1.380_648_52e-23; // 전자 질량(kg) double ELECTRON_MASS = 9.109_383_56e-31; } - 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아니라.. 2022. 5. 3.
item 21. 인터페이스는 구현하는 쪽을 생각해 설계하라 Java 8 이후 디폴트 메서드를 사용할 수 있게 되었지만, 여전히 주의해야 할 점이 있다. 디폴트 메서드를 선언하면 해당 인터페이스를 구현한 후 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 사용된다. 기존 인터페이스에 메서드를 추가할 수 있게 되었지만 모든 기존 구현체들과 연동되리라는 보장은 없다. [ JAVA 8에서 Collection Interface에 추가된 removeIf 메서드 ] default boolean removeIf(Predicate 2022. 5. 3.
item 20. 추상 클래스보다는 인터페이스를 우선하라 인터페이스와 추상 클래스 공통점 - 인스턴스로 생성이 불가능하다. - (자바 8부터) 인스턴스 메서드를 구현 형태로 제공할 수 있다. - 선언부만 있는 추상 메서드를 갖는다. 차이점 - 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다. (새로운 타입을 정의하는 데 제약 있음) - 인터페이스가 선언한 메서드를 모두 정의하고 일반 규약을 잘 지켰다면 다른 어떠한 클래스를 상속했든 같은 타입으로 취급된다. - 추상 클래스 : 단일 상속만 지원하기 때문에, 다중 클래스 상속이 불가능 // idol에 Entertainer을 추가로 상속 받고 싶어도 할 수 없음. public class Idol extends Singer { // ... } abstract class .. 2022. 5. 3.
item 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지해라 [ 상속 관련 문서화를 할 때의 규약 ] - 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다. - 호출되는 메서드가 재정의 할 수 있는 가능성이 있다면 해당 사실과 호출 순서, 각각의 호출 결과가 처리에 어떤 영향을 미치는지도 적어야 한다. (재정의 가능 : public, protected method 중 non-final) - 재정의 가능 메서드를 호출할 수 있는 모든 상황을 API 문서로 남겨야 한다. (API 문서에서 내부 동작 방식을 결정하는 부분은 implementation Requirements 로 시작) public class HashMap extends AbstractMap implements Map, Cloneable, Serializable .. 2022. 5. 3.
item 18. 상속보다는 컴포지션을 사용해라 상속 - 코드를 재사용하는 강력한 수단. 같은 패키지 안에서 확장을 목적으로 사용된다면 안전한 방법이다. (인터페이스 상속) - 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 됨. 패키지 경계를 넘어 다른 패키지의 구체 클래스를 상속하는 일은 안전하지 않을 수 있다. (구현 상속 ) [ 상속을 구현할 때 주의 사항 ] 1. 캡슐화를 깨뜨린다. 상위 클래스의 구현에 따라 하위 클래스 동작에 이상이 생길 수 있다. public class item18 { public static void main(String[] args) { InstrumentedHashSet s = new InstrumentedHashSet(); //정적 팩터리 메소드인 list.of 사용 s.addAll(List.of("틱", "탁.. 2022. 4. 26.
728x90