본문 바로가기
기타/이펙티브 자바

[이펙티브자바] 4. 클래스와 인터페이스

by 창이2 2022. 6. 4.

1. 클래스와 멤버의 접근 권한을 최소화하라.

1.1. public클래스의 가변필드는 public이 아니어야 한다.

1.2. static final Array 같은 경우 값의 변경이 가능하기 때문에 private으로 만들어라.

더보기
   public static final Integer[] VALUES = {1, 2, 3};
    
   //수정 가능 
   EffectiveJava.VALUES[0] = 1;
   
   private static final Integer[] VALUES = {1, 2, 3};
   
   
   //해결방법 1.불변 리스트로 만들기
   
   public static final List<Integer> VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));

   //해결방법 2.복사본을 만드는 함수 만들기
   public static final Integer[] getValues(){
       return PRIVATE_VALUES.clone();
   }

2. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

2.1 변수에 직접 접근보다는 메소드를 통해 접근해라(캡슐화의 이점을 살려라)

더보기
        Test test = new Test();
        test.num = 0; // 잘못된 사용
        test.setNum(0); // 옳바른 사용

 

3. 변경 가능성을 최소화하라

1. 불변클래스를 만들기 위한 5가지 규칙

  1.1. 객체의 상태를 변경하는 메서드를 제공하지 않는다

  1.2. 클래스를 확장할 수 없도록 한다.(class를 final로 선언, private으로 생성자 선언)

  1.3. 모든 필드를 final로 선언한다.

  1.4. 모든 필드를 private으로 선언한다.

  1.5. 자신 외에는 가변컴포넌트에 접근할 수 없도록 해야한다.

2. 불변클래스에 clone를 이용하지 마라(불변의 같은 객체를 복사할 필요 없음, ex String 클래스)

3. 불변클래스는 메서드에서 예외가 발생해도 그 안에 사용된 객체는 변하지 않는다. 불변 객체의 메서드는 상태를 바꾸지 않기 때문

4. 불변클래스는 값이 다르다면 반드시 독립된 객체로 만들어야 하는 단점이 있다.

 

4. 상속보다는 컴포지션을 이용하라

5. 상속을 고려해 설계하고 문서화하라.

 1. 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다.

 2. 상속용 클래스를 만들때는 배포전 반드시 하위클래스를 만들어 검증하자.

 3. 상속용 클래스의 생성자는 재정의 가능 메서드를 호출하면 안된다.

더보기

 

public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        child.doNotOverride();
    }
}

class Parent{

    public Parent(){
        doNotOverride();
    }

    public void doNotOverride(){
    }
}

class Child extends Parent{

    final Instant instant;

    Child(){
        instant = Instant.now();
    }

    @Override
    public void doNotOverride() {
        System.out.println(instant);
    }
}

 4. clone과 readObject 는 재정의 가능 메서드를 호출해서는 안된다. readObject의 경우 역직렬화 하기전에 재정의한 메소드가 호출되고 clone의 경우 복제본의 상태를 수정하기 전에 재정의한 메소드를 호출하게 된다.

댓글