2023-effective-java-study's People
2023-effective-java-study's Issues
ITEM 16. Public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
- 접근자 메서드에 대하여 설명 후 간단한 예제 코드를 작성하세요.
ITEM 18. 상속보다는 컴포지션을 사용하라.
상속은 코드를 재사용할 수 있는 강력한 수단이지만, 잘못 사용하면 객체의 유연성을 해치는 결과를 초래합니다.
(클래스가 다른 클래스를 확장하는 구현상속을 의미, 클래스가 인터페이스를 구현하거나 인터페이스끼리 확장하는 인터페이스 상속은 제외)
컴포지션을 사용하면 개발자가 원하는 메서드만 클라이언트에게 공개할 수 있고, 상위 클래스 내부를 숨겨 캡슐화를 해치지 않을 수 있습니다.
상속으로 클래스 세트를 구성해보고, 이를 컴포지션으로 수정하여 보세요.
Decorator 디자인 패턴을 적용할 수 있으면 더 좋습니다...!
ITEM 01. 생성자 대신 정적 팩터리 메서드를 고려하라
ITEM 01의 요지는 조금 특별한 의미
를 가진 use case가 존재하는 인스턴스를 생성할 경우에 정적 팩터리 매서드를 활용하라는 것입니다. 굳이 생성자를 안 쓰고 일부러 정적 팩터리로 대체할 필요가 없다는 것이죠.
- 생성자 대신 정적 팩터리를 사용한 예를 들어주시고, 예를 든 이유를 설명해주세요.
- 생성자로 바꿀 수 있다면, 생성자로도 바꿔주세요.
ITEM 06. 불필요한 객체 생성을 피하라
불필요한 객체 생성을 피하라는 것은 얼핏 보면 당연한 말입니다.
객체를 생성할 때 불필요한 객체가 생성되는 경우를 작성해 주세요. 해당 경우에 불필요한 객체 생성을 피한다면 어느 만큼의 이득을 보는지 수치로 검증할 수 있는 테스트 코드를 같이 작성해 주세요.
ITEM 29. 이왕이면 제너릭 타입으로 만들라
책에서는 제너릭 타입을 만드는 예시를 소개합니다. 이 중 배열을 사용하는 코드가 있다면, 컴파일에 문제가 생기기도 합니다.
- 배열을 사용하는 클래스를 제너릭 타입으로 만들어 보세요
- 해당 클래스를 만드는 과정에서 배열을 사용하는 코드에서 컴파일 에러가 발생할 것입니다. 책에서 제시하는 두 가지 방법 중 하나를 사용해서 문제를 해결해 보세요.
ITEM 08. finalizer와 cleaner 사용을 피하라
<해당 과제는 카펀님 전용입니다.>
Java의 GC는 기본적으로 각 객체가 Phantom Reachable 상태가 되는 순간 GC 타겟이 된다고 할 수 있습니다.
finalize 메서드를 오버라이딩하게 되면, GC가 진행될 때 각 객체가 Phantom Reachable 이라고 인지된다면 해당 메서드를 호출하여 내부 실행을 유도하는 것 입니다.
문제는 �JVM의 GC는 일반적으로 발생 시기를 예측할 수 없기도 하고, 상황에 따라 죽은 객체를 예토전생 시킬 수 있는 (...) 문제까지 발생하기 때문에 사용이 권장되지 않습니다.
그렇기에, JDK 9 부터 등장한 Cleaner 인터페이스로 대부분이 변경되었습니다.
// ThreadPoolExecutor.java (JDK 11)
@Deprecated(since="9")
protected void finalize() {}
그렇다면, 어떻게 보안 취약점을 만들 수 있을까요? 해당 게시글 을 기반으로, 잘못된 finalize 메서드로 인해 발생하는 Security Hole 예시 코드를 작성해 주세요.
ITEM 05. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
Item 05에서 말하고 싶은 내용은 유연성
이라고 생각합니다. 인스턴스를 생성할 때 필요한 자원을 넘겨줘서, 여러 자원을 지원하는 유연한 클래스를 만들라는 것이죠. 이 과정에서 자원 팩터리를 넘겨줄 수도 있습니다. 다음 요구사항을 만족하는 클래스를 작성해 주세요
- 생성자에
Supplier<T>
인터페이스를 사용해서 자원 팩터리를 넘겨 주세요 - 책에서 나온 예시와 같이 한정적 와일드카드 타입을 사용하는 팩터리를 넘겨 주세요
- 두 개 이상의 자원을 사용하는 예시로 만들어 주세요
- 예시: 한국어 사전과 영어 사전을 자원으로 사용하는 맞춤법 검사기
ITEM 14. Comparable을 구현할지 고려하라
Comparator
인터페이스를 이용해, 비교자 생성 메서드의 연쇄 방식으로Comparable
인터페이스를 구현하는 클래스를 만들어 주세요comparing
메서드를 사용해도 좋고,comparingInt
등의 메서드를 사용해도 좋습니다!
ITEM 09. try-finally 보다는 try-with-resource를 사용하라
반드시 회수가 필요한 자원을 사용한 뒤에, finally에서 자원을 회수하게 되면 코드도 간결해지고, 예외 처리도 훨씬 깔끔하다고 합니다.
그렇다면 try-with-resource를 통해 여러개(2개 이상)의 자원을 사용하는 경우에,
try-finally와 try-with-resource 각각의 예시코드를 작성해보고,
try-with-resource 구문에서 여러 자원이 회수되는 순서를 확인할 수 있는 간단한 코드를 작성해주세요.
ITEM 11. equals를 재정의하려거든 hashCode도 재정의하라
필드가 5개 이상 존재하는 클래스에 대한 hashCode()를 정의해보고, 멀티스레드 환경에서 해당 객체를 Set에 넣는 방식으로 테스트를 진행하여 시간을 기록해봅시다.
hashCode 값이 충돌하는 것을 최대한 방지하려면 어떻게 설계하는게 좋을까요?
책에서 언급하는 내용/인터넷에서 제시하는 방법/IntelliJ 자동 생성 방식등 여러 방법을 고민해보고, 최소 2개 정도의 시나리오를 설계해서 시간을 비교해봅시다.
ITEM 03. private 생성자나 열거 타입으로 싱글턴임을 보증하라
-
클래스를 싱글턴으로 만든 후 reflection을 이용해 싱글턴이 깨지는 것을 확인하는 코드를 작성해주세요
-
reflection에 의해 싱글턴이 깨지는 것을 막는 코드를 작성해주세요
ITEM 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라
- 재정의 가능한 메서드를 호출하여 의도와는 다르게 동작하는 상속용 클래스를 만들어 상속으로 인해 발생할 수 있는 문제를 확인해봅시다.(책의 예시도 허용)
- 상속을 금지하는 클래스를 만들어 봅시다.
ITEM 17. 변경 가능성을 최소화하라
함수형 프로그래밍의 경우, 불변객체를 적극적으로 활용하기 때문에 간단하지만, 새로운 객체를 매번 생성하기 때문에 중간단계가 많다면 성능의 저하가 발생할 수 있습니다.
책에서는 (또는 Scala나 Kotlin 같은 FP를 적극적으로 받아들인 언어에서는) Companion Object 를 생성하여 이런 문제를 완화시키길 권장하고 있습니다.
그렇다면, 상황을 설정하여 Companion Object 사용/미사용의 경우에 대해 각각 코드를 작성하고 성능을 비교해봅시다.
ITEM 31. 한정적 와일드카드를 사용해 API 유연성을 높이라
코드에서 유연성을 높이려면 원소의 생산자나 소비자용 입력 매개변수에 와일드카드 타입을 사용하면 됩니다.
책의 Stack 예시처럼, 자바에서 다른 예시를 찾아 생산자와 소비자 위치에 맞추어 제네릭 타입을 유연하게 사용할 수 있도록 해주세요.
ITEM 15. 클래스와 멤버의 접근 권한을 최소화하라
필요한 정보만 외부에 드러내는 방법은 캡슐화의 기본 이념입니다. Java에서는 접근 제어자 (private, package-private, protected, public)를 통해 이를 명시 및 제어할 수 있는데요.
과도하게 접근 제어를 허가했을 때 생길 수 있는 문제점의 예시를 코드로 나타내고, 이를 접근 제어자를 통한 권한 제어를 통해 해결하는 예시를 작성해 주세요. 완벽할 필요는 없고, 접근 제어자가 도움이 된다는 것만 명확하면 됩니다.
ITEM 02. 생성자에 매개변수가 많다면 빌더를 고려하라
멀티스레드 환경에서 점층적 생성자 패턴, 자바빈즈 패턴, 빌더 패턴을 테스트하고(코드 작성)
각 패턴의 차이점, 장단점에 대해서 분석하세요
ITEM 07. 다 쓴 객체 참조를 해제하라
메모리 누수를 일으키는 주범은 아래와 같이 세 가지가 있습니다.
- 다 쓴 객체 참조
- 캐시
- 리스너, 콜백
위 세 가지 중 한 가지를 선택하여 메모리 누수 방지하는 코드를 작성하세요.
ITEM 12. toString을 항상 재정의하라
- 클래스를 정의하고, toString을 그대로 사용할 때와, 재정의할 때의 차이점을 보이는 코드를 작성해 주세요
- (Optional) 특정한 디버깅이 필요한 경우에는 그대로 toString을 사용해야 하는 경우가 있습니다. 그 경우에 대해서 고민해 보고, 어떤 경우가 있는지 테스트 코드를 작성해 주세요.
ITEM 13. clone 재정의는 주의해서 진행하라
각 번호에 따라 객체 복사 예시와 설명을 작성해주세요.
- clone()의 단점이 되는 예시를 두 가지와 함께 왜 단점이 되는지 설명해주세요.
- 본문에는 배열의 경우에만 clone()을 활용하면 좋다고 합니다. 배열의 경우에 사용 시 이점이 되는 부분과 예시를 들어주세요.
ITEM 10. equals는 일반 규약을 지켜 재정의하라
float, double, null을 정상 값으로 취급하는 필드를 포함하는 서로 다른 2개의 class를 정의하고,
한 class만 equals를 정의하여 boolean List.contains(Object o)를 사용했을 때 어떻게 차이가 있는지 비교해 봅시다.
- 자바 버전에 따라 contains의 내부 동작이 다를 수 있으므로 List가 아닌 다른 자료구조를 사용하여도 무방합니다.
- 단, equals method는 어노테이션을 사용하지 않고 아래 규칙에 맞게 직접 구현해 봅시다.
1. == 연산자를 사용해 입력이 자기 자신의 참조인지 확인한다.
2. instansceof 연산자로 입력이 올바른 타입인지 확인한다.
3. 입력을 올바른 타입으로 형변환한다.
4. 입력 객체와 자기 자신의 대응되는 핵심 필드들이 모두 일치하는지 하나씩 검사한다.
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.