JaPark Bug World

item2. 생성자에 매개변수가 많다면 빌더를 고려하라. 본문

개발새발/Effective Java

item2. 생성자에 매개변수가 많다면 빌더를 고려하라.

JAstory 2024. 3. 28. 12:26

* 해당 내용은 인프런 이펙티브 자바 완벽 공략 1부 백기선님의 영상을 기준으로 작성하였습니다. https://inf.run/fnnRy

 

백기선 이펙티브 자바 완벽 공략 1부 강의 - 인프런

자바 학습의 끝판왕 “이펙티브 자바”를 보다 쉽고 완벽하게 학습하세요. 이 강의를 수강하시면 여러분의 자바 프로그래밍 지식과 실력뿐 아니라 학습 능력 또한 향상 시킬 수 있습니다., MS 시

www.inflearn.com

 

    // 2. getter, setter 메소드 이름 규약
    // boolean type인 경우
    private boolean selected;

    // get이 아닌 is로 표기하는게 기본
    public boolean isSelected() {
        return selected;
    }
    • 하지만 실제로 오늘날 자바빈 스팩 중에서도 getter와 setter를 주로 쓰는 이유는?
      1. JPA나 스프링과 같은 여러 프레임워크에서 리플렉션을 통해 특정 객체의 값을 조회하거나 설정하기 때문입니다.
  • 객체 얼리기 (freezing) - 임의의 객체를 불변 객체로 만들어주는 기능 (자바 스크립트에서 사용가능 자바x)
    • Object.freeze()에 전달한 객체는 그 뒤로 변경될 수 없다.
      1. 새 프로퍼티를 추가하기 못함
      2. 기존 프로퍼티를 제거하지 못함
      3. 기존 프로퍼티 값을 변경하지 못함
      4. 프로토타입을 변경하지 못함
    • strict 모드에서만 동작함
    • 비슷한 류의 function으로 Object.seal()과 Object.preventextensions()가 있다.

* 자바에서는 지원하지 않는 기능이니까 가볍게 듣고 흘려본다.. 

  • 빌더 패턴 - 동일한 프로세스를 거쳐 다양한 구성의 인스턴스를 만드는방법
    • 복잡한 객체를 만드는 프로세스를 독립적으로 분리할 수 있다.
  • IllegalArgumentException - 잘못된 인자를 넘겨 받았을 때 사용할 수 있는 기본 런타임 예외
    • 질문1) checked exception과 unchecked exception의 차이?
      1. checked exception은 RuntimeException을 상속하지 않고, 컴파일 시점에서 컴파일러 확인절차필요하므로 반드시 예외처리를 해야함. 대표적인 예외로 FileNotFonndException 
      2. unchecked exception은 RuntimeException을 상속하며 런타임 단계에서 확인이 가능하므로 에러 처리를 강제하지 않는다. 대표적인 예외로 NullPointException, ArrayIndexOutOfBoundsException
    • 질문2) 간혹 메서드 선언부에 unchecked exception을 선언하는 이유는?
      1. 어떠한 상황에 대해 클라이언트에게 명시적으로 알려줄 필요가 있을 때
    • 질문3) checked exception은 왜 사용할까?
      1. 에러가 발생했을 때 클라이언트가 후속작업을 해야함을 알려줄 때?
    • 과제1) 자바의 모든 RuntimeException 클래스 이름 한번씩 읽어보기
    • 과제2) 이 링크에 있는 글을 꼭 읽으세요.
  • 재귀적인 타입 한정을 이용하는 제네릭 타입
  • 빌더를 사용하면 가변인수(varargs)매개변수를 여러 개 사용할 수 있다.
    • 가변인수는 메소드에 오직 하나만 선언할 수 있다.
    • 가변인수는 메소드의 가장 마지막 매개변수가 되어야 한다.
public class VarargsSamples {
    // 가변인수는 하나만 선언 가능, 매개변수가 여러개 일때 가변인수는 마지막에 선언 해줘야 함.
    public void printNums(int... nums) {
        System.out.println(nums.getClass().getCanonicalName());
        System.out.println(nums.getClass().getComponentType());
        Arrays.stream(nums).forEach(System.out::println);
    }

    public static void main(String[] args) {
        VarargsSamples samples = new VarargsSamples();
        samples.printNums(5, 10);
    }
}

 

    // 가변인수는 하나만 선언 가능, 매개변수가 여러개 일때 가변인수는 마지막에 선언 해줘야 함.
    public void printNums(String str, int... nums) {
        System.out.println(nums.getClass().getCanonicalName());
        System.out.println(nums.getClass().getComponentType());
        Arrays.stream(nums).forEach(System.out::println);
    }