정리 - chap 01.

MinSeoCho·2021년 7월 16일
0

Effective Java 정리

목록 보기
1/2
post-thumbnail

정적 펙토리 메소드 -???? 이게 뭘까 아직 까진 정확히 감이 안잡힘.

그런데 1~3장에 걸쳐서 계속해서 설명중... 궁금함

--> 객체 생성의 역할을 하는 클래스 메서드라는 의미로 요약해볼 수 있다.

이렇다곤 하는데...여전히 감은 안잡힘

아 생성자를 통한 객체 생성이 아닌 메소드를 통한 객체생성

납득 납득

1장

생성자 대신 정적 팩토리 메소드를 고려해라

일단 정리 하기에 앞서 필자는 ㅋㅋㅋ 이팩티브 자바를 3~5장 까지 읽을때까지 그래서 정적펙토리 메소드가 뭔데?? 디패에서 팩토리 메소드랑 뭐가 다른거지??? 이러고 있었음...

그래서 오늘 최소한의 목표였던 5장까지 읽기 전에 3장쯤에서 검색을 해보고 나서 이해함ㅋㅋㅋㅋㅋ

팩토리 메소드 : 객체 생성 역할을 하는 클래스 메소드

라는 걸 딱 한줄 요약을 하고 나니 이제야 이해를 했다...ㅋㅋㅋㅋㅋ

각설하고 정리를 하면

장점

1.이름을 가질 수 있다.

생성자만으로는 객체의 특성을 명확히 나타내기 어려운 경우가 많은 반면,

정적 팩토리 메소드는 객체의 특성을 명확하게 표현할 수 있다.

ex) BigInteger.probablePrime = 값이 소수인 BigInteger를 반환하다.

이런식으로 표현이 가능하기 때문이다.

1개의 생성자는 1개의 시그니처 밖에 가질 수 밖에 없는데 반면,

여러개의 정적팩토리 메소드는 1개의 시그니처를 가질 수 있다. 대신 여기서 주의 할 점은 같은 시그니처이기 때문에 서로가 구분이 가지 않을 수 있으므로 차이를 표현할 수 있게 이름을 잘 지어야한다.

2. 호출될 때마다 인스턴스(객체)를 새로 생성하지 않아도 된다.

정적 팩토리 메소드의 경우 인스턴스(객체)를 미리 생만들어 두거나, 새로 생성한 인스턴스를 캐싱하여 재활용하여 불필요한 객체 생성을 막을 수 있다.

ex) Boolean.valueOf(boolean) = 객체를 아예 생성하지 않음

이는 객체가 언제 살아 있는지 통제가 가능하다. 이런 클래스를 instance -controlled 클래스라 한다.

  • Q. 그럼 왜 통제를 하는 걸까??*

  • A-1. 클래스를 싱글톤으로 만들 수 있기 때문입니다.

  • A-2. 인스턴스 불가로 만들 수 있기 때문입니다.(noninstantiable)

  • A-3. 불변 값 클래스에서 동일한 인스턴스는 1개임을 보장이 가능 하다.

    • 인스턴스 통제 == 플라이웨이트 패턴의 근간!!

아직 플라이웨이트 패턴이 뭔지는 모름...

3. 반환 할때 하위 타입 객체로 반환이 가능하다.

이는 API를 만들때 유연한건데 구현 클래스를 공개하지 않고도 객체를 반환하는게 가능하다! == API를 작게 유지 가능!

나중에 보면 이해하지 못할거기 때문에.. 자세히 적으면..

자바 컬렉션 프레임워크는 핵심 인터페이스들에 수정 불가, 동기화 등등의 기능을 붙인 45개의 유틸리티 구현체를 제공한다. 이 대부분의 구현체들은 단 1개의 인스턴스 불가 클래스인java.util.Collections에서 정적 팩토리 메소드를 통해서 사용(?) 얻도록(?)하였다.

*컬렉션을 사용하고 싶을때(?) 접근 하고 싶을때(?) 객체 생성이 불가능한 java.util.Collections를 사용하여 접근한다는 건가??

4. 매개변수에 따라 매번 다른 클래스의 객체를 반환 할 수 있다.

반환 되는 게 하위 타입이라면 어떤 클래스의 객체던 반환 할 수 있다.

A라는 클래스가 상위 클래스고, B,C,D가 하위 클래스라면 A는 B,C,D중 어느것이나 반환이 가능하다.

5. 정적 팩토리 메소드를 작성하는 시점에는 반환할 객체 클래스가 존재하지 않아도 된다.

이런건 서비스 제공자 프레임워크를 만드는데 근간이다. -> 이게 뭐지?

대표적인 예론 JDBC가 있는데 위의 정의중 제공자의 의미ㅈ는 서비스의 구현체라는 것이다. 그리고 프레임워크가 클라이언트에게 제공하기 위해서 구현체들을 통제함과 동시에 사용자로부터 분리한다.

뭔가 MVC&MTV 패턴이 생각나는 거 같은건 기분탓인가?? 좀더 공부가 필요할 듯

위의 정의는 총 3가지의 핵심 컴포넌트로 이뤄지는데.

  1. 서비스 인터페이스 - ex) Connection
  2. 제공자 등록 api - ex) DriverManager.registerDriver
  3. 서비스 접근 Api - ex) DriverManager.getConnection

이렇게 총 3가지로, 1번은 구현체의 동작을 정의하고, 2번은 제공자가 구현체를 등록하고, 3번은 클라이언트가 서비스의 인스턴스를 얻을 때 사용한다.

3번이 바로 이것들중 가장 핵심이라 할 수 있는 유연한 정적 팩터리이다. 그리고 이건 널리 알려진 브리지 패턴이다.

단점

1. 상속을 하려면 public,protected 생성자가 필요하여 정적 팩터리 메소드만 제공하면 하위 클래스를 못 만든다.

이는 만약 불변타입으로 만들고, 컴포지션으로 사용하는 경우는 장점이다.

아직 안나온 내용이라 잘 이해가 안간다...

2. 정적팩토리 메소드는 프로그래머가 찾기 어렵다.

잘 나오지 않으니...API 문서를 잘 작성하두고, 이름도 규약에 맞게 작성해야한다..

정적객토리 메소드 명명 방식

  • from : 매개변수 1개 해당 인스턴스 반환
  • of : 매개변수 여러개 받아 적합한 인스턴스 반환
  • value of : from & of 의 자세한 버전
  • instance||getInstance : 매개변수를 받는다면 매갭ㄴ수로 명시한 인스턴스를 반환하나, 보장하지는 않음
  • create || newInstance : 위의 메소드와 동일하나, 매번 새로운 인스턴스를 생성해 반환한다.
  • get Type : getInstance와 동일, 생성할 클래스가 아닌 다른 클래스에 팩토리 메소드를 정의할 때 쓴다. Type부분은 ㅂ팩토리 메소드가 반환할 객체 타입
  • new Type : newInstance와 동일하나, 이 이후 특징은 getType 이하동문
  • Type : 위 2개의 간결한 버전
profile
열심히 하자..!

0개의 댓글