본문 바로가기

Computer Sience/Java33

[Effective Java] 아이템18 상속보다는 컴포지션을 사용하라 상속(Inheritance)의 위험성상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다.상위 클래스와 하위 클래스가 모두 같은 개발자가 통제하는 패키지 안에서라면 상속도 안전한 방법이다.확장할 목적으로 설계되었고 문서화가 잘 된 클래스라면 마찬가지로 안전하다. 하지만 일반적으로 구체 클래스를 다른 패키지의 구체 클래스를 상속하는 일은 위험하다.  왜 위험할까? 메소드 호출과 달리 상속은 캡슐화를 깨트린다. 상위 클래스가 어떻게 구현되느냐에 따라서 하위 클래스의 동작에 이상이 생길 수 있다. @Getterpublic class InstrumentedHashSet extends HashSet { private int addCount = 0; public InstrumentedHashS.. 2024. 11. 5.
[Effective Java] 아이템15 클래스와 멤버의 접근 권한을 최소화해라 왜 아이템 13, 14는 정리 안 하는지?아이템13은 최근에 프로토타입 패턴을 공부하면서 Object clone(), Cloneable 인터페이스, shallow copy, deep copy 개념을 정리했기 때문에 pass 한다. https://20240228.tistory.com/351 [Design Pattern] 프로토타입 (Prototype) 패턴프로토타입 (Prototype) 패턴기존 인스턴스를 복제하여 새로운 인스턴스를 만드는 방법프로토타입 패턴은 객체를 생성할 때, 기존 객체를 복사하여 새로운 객체를 만드는 생성 패턴 중 하나20240228.tistory.com 아이템14는 Comparable 관련 내용인데 이미 코테를 준비 하면서 자세하게 알던 내용이었기 때문에 pass한다.간단 요약하면 .. 2024. 11. 5.
[Effective Java] 아이템12 toString을 항상 재정의하라 Object의 기본 toString 메소드 public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode());} Object의 기본 toString 메소드가 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 없다. 단순하게 "클래스_이름@16진수로표현한해시코드"를 반환할 뿐이다.public class BirthDate { private final int year; private final int month; private final int day; public BirthDate(int year, int month, int day) { this.year = y.. 2024. 11. 1.
[Effective Java] 아이템11: equals를 재정의하려거든 hashCode도 재정의하라 해시(Hash)이번 아이템을 이해하려면 먼저 해시에 대해서 알아야 한다. https://20240228.tistory.com/86 [Hash] 해시목차해시?충돌?충돌회피(Chaining)충돌회피(OpenAddressing)OpenAddressing (Linear Probing)OpenAddressing (Quadratic Probing)OpenAddressing (Double Hashing)해시해시 자료구조 : 키(Key)에 대응하는 값(Value)을 저장하는 자료구20240228.tistory.com해시 코드(HashCode)equals를 재정의한 클래스 모두에서 hashCode 또한 재정의해야 한다. 그렇지 않으면 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 .. 2024. 11. 1.
[Effective Java] 아이템10: equals는 일반 규약을 지켜 재정의하라 Chapter 03: 모든 객체의 공통 메소드 03장에서는 Object 클래스의 메소드 중에서 오버라이딩이 가능한(not final)한 메소드들에 대해서 설명한다.또한 이 메소드들은 모두 재정의를 염두에 두고 설계된 것이라 어떤 상황에서 어떻게 재정의 해야 하는지에 대해 알려준다.equals 메소드 public class Object { public boolean equals(Object obj) { return (this == obj); }}equals 메소드는 재정의하기 쉬워 보이지만 함정이 많다.잘못 재정의 하면 끔찍한 결과를 초래한다.문제를 회피하는 가장 쉬운 길은 Object에 정의된 메소드를 그대로 사용하는 것이다.equals 메소드 재정의 하지 말자지금부터 equals.. 2024. 10. 28.
[Effective Java] 아이템9: try-finally 보다는 try-with-resources를 사용하라 Chapter 02: 객체 생성과 파괴객체를 만들어야 할 때와 만들지 말아야 할 때를 구분하는 법올바른 객체 생성 방법에 대한 설명 자바 라이브러리에는 close 메소드를 호출해 직접 닫아줘야 하는 자원이 많다. 자원 닫기는 클라이언트가 놓치기 쉬워서 예측할 수 없는 성능 문제로 이어지기도 한다. 전통적인 수단 try-finally전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally가 쓰였다. public class Resource1 implements AutoCloseable{ @Override public void close() { System.out.println("Resource1 close"); throw new RuntimeException.. 2024. 10. 27.