개발서적
[Effective Java] 클래스와 멤버의 접근 권한을 최소화하라
잘 설계된 컴포넌트를 설계하기 위해서는 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 잘 숨겨야 한다. 즉, 모든 내부 구현을 완전히 숨김으로서, 구현과 API를 깔끔히 분리해야 한다. 정보 은닉(캡슐화) 정보 은닉(캡슐화)라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리다. 오직 API를 통해서만 서로 소통하며 내부적으로 어떻게 동작하는지는 신경쓰지 않는다. 정보 은닉의 장점 여러 컴포넌트를 병렬로 개발할 수 있기 때문에 개발 속도를 높일 수 있다. 각 컴포넌트를 더 빨리 파악하여 디버깅하기 쉽고, 다른 컴포넌트로 교체하는 부담도 적기 때문에 시스템 관리 비용이 낮다. 정보 은닉 자체가 성능을 높여주지는 않지만, 성능 최적화에 도움을 준다. -> 해당 컴포넌트만 최적화할 수 있다. ..
[Effective Java] Comparable을 구현할지 고려하라
Comparable을 구현할지 고려하라 Comparable을 구현한다는 것은 그 클래스의 인스턴스들에 자연적인 순서를 부여하는 것이다. 알파벳, 숫자, 연대 같이 순서가 명확한 값 클래스를 작성할 때는 Comparable인터페이스를 구현하는 것이 좋다. Comparable 규약 BigDecimal n1 = BigDecimal.valueOf(12312312); BigDecimal n2 = BigDecimal.valueOf(22212322); BigDecimal n3 = BigDecimal.valueOf(12312312); BigDecimal n4 = BigDecimal.valueOf(22212322); // 1. 반사성 n1.compareTo(n1) => true // 2. 대칭성 n1.compareTo(..
[Effective Java] clone 재정의는 주의하자
clone 재정의는 주의해서 진행하라 clone() 메서드는 객체를 복제하여 새로운 인스턴스를 생성하는 메서드이며 이를 오버라이딩 하기 위해서는 Cloneable을 상속해야 한다. 이상한 점은 clone 메서드가 cloneable이 아닌 Object에 정의되어 있고, 이 마저도 protected로 선언되어 있다. 메서드 하나 없는 Cloneable의 역할은 clone의 동작 방식을 결정한다. 즉, cloneable을 구현한 클래스의 인스턴스에서 clone을 호출하면 그 객체의 필드들을 하나하나 복사한 객체를 반환하며, 그렇지 않은 클래스의 인스턴스에서 호출하면 예외를 던진다. 인터페이스를 구현한다는 것은 일반적으로 해당 클래스가 그 인터페이스에서 정의한 기능을 제공한다고 선언하는 행위로 cloneable..
[Effective Java] toString을 재정의하라
toString을 항상 재정의하라 Object의 기본 toString 메서드가 우리가 작성할 클래스에 적합한 문자열을 반환하는 경우는 없다. toString의 일반 규약 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보 모든 하위클래스에서 이 메서드를 재정의한다 toString의 구현 toString은 그 객체가 가진 주요 정보를 모두 반환하는 것이 좋다. 반환값의 포맷을 문서화할지 정해야 한다. => 값 클래스라면 문서화를 권장한다. => 의도를 명확하게 표현한다. toString이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공하자. => e.g 만약에 지역 코드와 가입자 번호의 정보를 toString에서 반환하고 있는 클래스라면 지역 코드, 가입자 번호 접근자를 제공해야 한다. => why ..
![[Effective Java] equals를 재정의하려거든 hashcode도 재정의하라](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrdXxU%2Fbtsgb6dsYdw%2FSn9wqDRzLgjMx5FeRgEKFK%2Fimg.png)
[Effective Java] equals를 재정의하려거든 hashcode도 재정의하라
hashcode 규약 equals 비교에 사용되는 정보가 변경되지 않았다면 hashcode는 항상 같은 값을 리턴해야 한다. 두 객체에 대한 equals가 같다면, hashcode의 값도 같아야 한다. 두 객체의 equals가 다르더라도, 같은 hashcode값을 가질 수 있다. 더 좋은 성능을 위해 다른 값을 리턴하는 것이 더 좋기는 하다. 다음 예제를 통해 왜 hashcode를 같이 정의해야 하는지 이해해보자. phoneNumber에는 equlas규약에 맞춰 메소드가 잘 정의되어있다고 가정하자. public class HashMapTest { public static void main(String[] args) { Map map = new HashMap(); PhoneNumber number1 = n..