1주차
-
AssertJ :
-
Junit Parameterized Test : https://www.baeldung.com/parameterized-tests-junit-5
-
객체지향 생활체조 원칙 : https://limdingdong.tistory.com/category/프로그래밍/클린코드 %26 리팩토링
-
Pattern과 Matcher :
-
isEmpty()와 isBlank() 차이 : https://hianna.tistory.com/531
-
git fetch와 git pull의 차이 : https://chaeyoung2.tistory.com/43
-
정적 팩토리 메서드(static factory method) :
new를 통해서 객체 생성을 하는데, 직접 생성하는 것이 아니라 메서드 내에서 new를 호출하여 생성한 객체를 반환하는 메서드이다. (new를 간접적으로 사용)
정적 팩토리 매서드
장점 :
- 이름을 가질 수 있다.
- 호출 될 때마다 인스턴스를 새로 생성하지 않아도 된다.
- 불변 클래스는 인스턴스를 미리 만들어 놓거나 새로 생성한 인스턴스를 캐싱하여 재활용하는 식으로 불필요한 객체 생성을 피할 수 있다.(Enum이 대표적)
- 따라서 (특히 생성 비용이 큰) 같은 객체가 자주 요청되는 상황이라면 성능을 상당히 끌어올려 준다.
- 이를 이용해 인스턴스를 통제할 수 있고, 인스턴스를 통제하면 클래스를 싱글턴으로 만들 수도, 인스턴스화 불가로 만들 수도 있다.
- 미리 생성된 객체를 정적 팩토리 메서드로 반환해 줄 수 있다.
- 이는 객체 생성마다의 중복과정을 없앨 수 있고 로직상 중복을 없앨 수 있다.
- 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다. (다형성)
- 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
- 예를들어 EnumSet의 정적 팩토리 메서드 경우 parameter에 따라 다른 클래스의 객체 반환 가능.
- 따라서 유연이 높아진다.
- 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
정적 팩토리 매서드를 통한 단점:
- 상속에는 public / protected 생성자가 필요하므로 정적 팩토리 메서드만 제공할 경우 상속이 불가능함.
- 정적 팩토리 메서드를 다른 개발자들이 찾기 어렵다.
정적 팩토리 메서드 명명방식
- from : 하나의 매개변수를 받아 해당 타입의 인스턴스를 반환하는 형변환 메서드
- of : 여러 매개변수를 받아 적합한 타입의 인스턴스를 반환하는 집계 메서드
- valueOf : from과 Of의 더 자세한 버전
- instance 혹은 getInstance : 매개변수로 명시한 인스턴스를 반환하지만, 같은 인스턴스임을 보장 하지 않음
- create 혹은 newInstance :instance 혹은 getInstance 와 같으나 매번 새로운 인스턴스를 생성해 반환 함을 보장.
- getType : getInstacne와 같으나, 생성할 클래스가 아닌 다른 클래스에 팩터리 메서드를 정의할 때 쓴다. "Type"은 팩터리 메서드가 반환할 객체의 타입이다.
- newType : newInstance와 같으나, 생성할 클래스가 아닌 다른 클래스에 팩터리 메서드를 정의할 때 쓴다. "Type"은 팩터리 메서드가 반환할 객체의 타입이다.
- type : getType과 newType의 간결한 버전
정리
정적 팩터리 메서드와 public 생성자는 각자의 쓰임새가 있으니 상대적인 장단점을 이해하고 사용하는 것이 좋다. 그렇다고 하더라도 정적 팩터리를 사용하는 게 유리한 경우가 더 많으므로 무작정 public 생성자를 제공하던 습관이 있다면 고치자.
Item 16. 불필요한 객체 생성을 피하라
- 생성자는 호출할 때마다 새로운 객체를 만들지만, 팩터리 메서드는 그렇지 않다.
불변 객체만이 아니라 가변 객체라해도 사용중에 변경되지 않을 것임을 안다면 재사용 할 수 있다.
- 생성 비용이 아주 비싼 객체는, 반복해서 비싼객체가 필요하면 캐싱해서 재사용하길 권한다.
- 예를들어 Pattern 인스턴스를 정적 초기화 과정에서 직접 캐싱해두고, 나중에 메서드 호출 될때마다 재사용 하게 만들 수 있다.이렇게 하면 빈번히 메서드가 호출되는 상황에서 성능을 상당히 끌어 올릴 수 있다.
getter를 사용하는 대신 객체에 메시지를 보내자 : https://tecoble.techcourse.co.kr/post/2020-04-28-ask-instead-of-getter/
메서드 시그니처를 수정하여 테스트하기 좋은 메서드로 만들기 : https://tecoble.techcourse.co.kr/post/2020-05-07-appropriate_method_for_test_by_parameter/
인터페이스를 분리하여 테스트하기 좋은 메서드로 만들기 : https://tecoble.techcourse.co.kr/post/2020-05-17-appropriate_method_for_test_by_interface/
프리코스 3주차 : https://docs.google.com/document/d/1QAzhx7Nw8CmOg7rhnbwg0tGxktt-bSu-Gf_RlVt_Bus/edit#