본문 바로가기
public void static main()/Book

[Effective Java] 아이템 1

by 햄리뮤 2023. 1. 3.
반응형

이펙티브 자바 스터디를 시작했다... 열심히 하자!

[책 규칙]

노란색 - 자세히 알아보고싶은 부분

초록색 - 핵심 개념 (블로그 정리시는 검은색으로!)

빨간색 - 무슨말인지 모르겠는 부분

[아이템 1] 생성자 대신 정적 팩터리 멧서드를 고려하라!

정적 팩터리 메서드가 생성자보다 좋은 장점 다섯가지!

  • 이름을 가질 수 있다.
    • 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있다.
  • 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다.
    • 인스턴스를 미리 만들어 놓거나 새로 생성한 인스턴스를 캐싱하여 재활용하는 식으로 불필요한 객체 생성을 피할 수 있다.
  • 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.
    • 반환할 객체의 클래스를 자유롭게 선택할 수 있게 하는 엄청난 유연성을 갖고있다. 
    • 구현 클래스를 공개하지 않고도 그 객체를 반환할 수 있어 API를 작게 유지할 수 있다.
public interface Person {

    void printInfo();

    static Person createWoman(String name) {
        return new Woman(name);
    }
}

class Woman implements Person {

    String name;

    Woman(String name) {
        this.name = name;
    }

    @Override
    public printInfo() {
        System.out.println(name);
    }
}

Parent 클래스를 상속 받은 Child 클래스의 접근 제어자를 "public class Woman"에서 "class Woman" 로 설정해두면 외부에서는 접근이 불가능하다.

public class Outside {
    public void createWoman() {
    	// 하위 타입 객체 반환!
        Person parson = Person.createWoman("earth");

		// 생성이 불가하다
        Person parson = new Woman("earth");
    }
}
  • 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
  • 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
  public static void main(String[] args) {
  	// 백기선 선생님의 effective java의 예시 이다!
    // KoreanHelloService 의존적이지 않음 import안해도됨
    ServiceLoader<HelloService> loader = ServiceLoader.load(HelloService.class);
    Optional<HelloService> helloServiceOptional = loader.findFirst();
    helloServiceOptional.ifPresent(h -> System.out.println(h.hello()));

    // KoreanHelloService 의존적임 import해야함
    HelloService helloService = new KoreanHelloService();
    System.out.println(helloService.hello());
  }

정적 팩터리 메서드의 단점!

  1. 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
  2. 정적 팩터리 메서드는 프로그래머가 찾기 어렵다.
핵심정리
정적 팩터리 메서드와 public 생성자는 각자의 쓰임새가 있으니 상대적인 장단점을 이해하고 사용하자! 그래도 정적 팩터리를 사용하는 게 유리한 경우가 더 많으므로 무작정 public 생성자를 제공하던 습관이 있다면 고치자!

 

https://earth-95.tistory.com/188

 

[effective JAVA] 아이템1: 생성자 대신 정적 팩토리 메소드를 고려하라

객체를 만들어야 할때와 만들지 말아야 할 때를 구분하자. 올바른 객체 생성 방법과 불필요한 생성을 피하자. 객체가 제때 파괴됨을 보장하고, 파괴 전 수행해야 할 정리 작업을 관리하자. 아이

earth-95.tistory.com

 

** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.

이곳 저곳에서 구글링한 것과 강의 들은 내용이 정리가 되었습니다.

그림들은 그림밑에 출처표시를 해놓았습니다.

문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **

반응형

'public void static main() > Book' 카테고리의 다른 글

[Effective Java] 아이템 15  (0) 2023.01.18
[Effective Java] 아이템 13  (0) 2023.01.10
[Effective Java] 아이템 10 ~ 아이템 11  (0) 2023.01.10
[Effective Java] 아이템 3  (0) 2023.01.03
[Effective Java] 아이템 2  (0) 2023.01.03

댓글