Optional<T>
- Optional<T> 클래스는 NPE 를 방지하기 위해 사용하며 null 이 들어올 수 있는 값을 감싸는 Wrapper 클래스이다. Generic으로 타입을 지정할 수 있다.
- 객체가 null 이어도 NPE 가 발생하지 않고 비즈니스 로직대로 흘러갈 수 있어 안정성 향상의 장점이 있다. 다만 null 체크 및 Wrapping 시 오버헤드가 발생하여 성능이 저하될 수 있다. 따라서 null 이 절대 나오지 않는 경우라면 Optional 을 사용하지 않는 것이 성능에 더 좋다.
- 종료 연산 중 orElse(T)는 Optional 값이 null이건 아니건 항상 수행하기 때문에 사용에 신중해야 한다. 특히 메서드를 파라미터로 갖는다면 Optional 값의 null 여부와 상관없이 해당 메서드 내 로직이 모두 수행되기 때문에 잘 확인하고 사용해야 한다.
ThreadLocal
- ThreadLocal 은 쓰레드에 대한 로컬 변수를 제공하여 각각의 쓰레드가 변수에 대해 독립적으로 접근할 수 있게 한다.(JDK 1.2부터 제공) 사용자 인증 관련 부분에서(Spring Security) 사용될 수 있다.
- 쓰레드 풀을 사용하는 환경에서는 쓰레드 로컬 변수 사용이 끝난 후 remove() 메서드를 명시적으로 호출해줘야 한다. 쓰레드가 재활용되면서 이전에 설정했던 쓰레드 로컬 정보가 남아있을 수 있기 때문이다.
오브젝트 - 2장
- 시스템의 어떤 기능을 구현하기 위해 객체들 사이에 이뤄지는 상호작용을 협력(Collaboration)이라고 한다.
- 객체가 다른 객체와 상호작용할 수 있는 유일한 방법은 메세지를 전송(요청)하는 것이다. 다른 객체에게 요청이 도착할 때 해당 객체가 메세지를 수신(응답)했다고 이야기한다. 메세지를 수신한 객체는 스스로의 결정에 따라 자율적으로 메세지를 처리할 방법을 결정하는데 이 방법을 메서드라고 부른다.
- 부모 클래스에서 기본적인 알고리즘 흐름을 구현하고 중간에 필요한 처리를 자식 클래스에게 위임하는 디자인 패턴을 Template Method 패턴이라고 한다.
- 설계가 유연해질수록 코드를 이해하고 디버깅하기 어려워진다. 그렇다고 해서 유연성을 억제하면 코드를 이해하고 디버깅하기는 쉬워지지만 재사용성과 확장 가능성은 낮아질 수 밖에 없다. 따라서 항상 유연성과 가독성 사이에서 고민해야 한다.
- 상속은 코드 재사용을 위해 널리 사용되는 기법이지만 클래스 상속을 위해서는 부모 클래스의 구조를 잘 알고 있어야 하며 부모 클래스의 구현이 자식 클래스에게 노출되기 때문에 캡슐화를 약화시킨다. 그리고 부모-자식 클래스 간의 관계를 컴파일 시점에 결정하기 때문에 실행 시점에 객체의 종류를 변경할 수 없어 설계를 유연하지 못하게 한다는 단점이 있다.
그래서 코드 재사용 면에서는 상속보다 합성을 권장한다. 합성은 인터페이스에 정의된 메세지를 통해서만 재사용이 가능하므로 구현을 효과적으로 캡슐화할 수 있다. 그리고 의존하는 인스턴스를 교체하는 것이 비교적 쉬워 설계를 유연하게 만든다.
상속을 절대 사용하지 말라는 이야기는 아니다. 대부분의 설계에서 다형성을 위해 인터페이스를 재사용하는 경우 상속과 합성을 함께 사용할 수 밖에 없다.
참고
[Java] JAVA8 Optional Class에 대한 정의 및 사용방법 - Tutorial(Sample)
'TIL' 카테고리의 다른 글
20240701 TIL (0) | 2024.07.01 |
---|---|
20240628 TIL (0) | 2024.06.28 |
20240609 일지 (1) | 2024.06.10 |
20240608 일지 (1) | 2024.06.10 |
20240606 일지 (0) | 2024.06.07 |