패키지란 연관된 클래스끼리 그룹핑하는 것입니다. 파일 디렉토리로 치자면 폴더와 비슷합니다.
클래스 그룹핑의 기준은 레이어와 도메인으로 나눌 수 있습니다.
레이어는 어플리케이션을 계층으로 나누고 같은 계층에 속하는 클래스끼리 한 패키지에 놓을 수 있습니다. 3-tier application 아키텍처를 예로 들면 controller, service, dao 로 패키지를 나눌 수 있습니다.
계층별 패키지의 장점은 계층 파악에 쉽습니다. 하지만 계층별로 클래스를 그룹핑하다보니 계층간 결합도가 높아지고 도메인별 응집도가 낮아집니다.
도메인별로 패키지를 나누는 것은 도메인에 관련된 클래스끼리 그룹화하다 보니 도메인별 응집도가 높아집니다. 단점은 패키지 구조가 복잡해질 수 있어 아키텍처 파악에 어려울 수 있습니다.
패키지로 접근 제어를 할 수 있다.
자바에서 접근 제어자는 참조값으로 객체의 상태값이나 메서드에 접근할 수 있는 범위를 제한하는 장치로 public, default, protect, private 키워드가 있습니다.
접근제어자를 사용하여 외부에서 객체에 접근할 때, 상속 관계에서 서브 클래스가 상위 클래스에 접근할 때를 제어할 수 있습니다. 접근 제어로 정보은닉과 캡슐화를 가능하게 해줍니다.
setter 는 수정자 메서드로 객체의 상태 값을 변경할 때 필드에 직접 접근하지 않고 필드는 캡슐화하고 setter 메서드로만 변경하게 합니다.
setter 메서드를 사용하는 이유는 객체의 변경 지점을 행위 메서드로 제한함으로써 변경 지점 트래킹이 좀 더 쉬워집니다.
또한 변경이 필요한 속성만 setter 메서드를 만들고 다른 속성은 객체 내부로 숨겨 캡슐화를 지킬 수 있습니다.
hashCode() 메서드는 객체를 식별할 하나의 정수값을 리턴한다.
hashCode() 내부 구현은 JNI 의 네이티브 메서드를 통해 생성하기 때문에 JVM 벤더사마다 구현 로직이 다를 수 있다.
그래서 java명세에 hashCode 구현 규칙을 정의했는데 그중 두 객체가 equals() 로 일치하다면 두 객채의 hashCode 도 반드시 일치해야 한다는 규칙이 있다.
이말은 서로 다른 메모리 영역에 있는 두 인스턴스가 동등하다면 hashCode도 같은 값을 생성하도록 재정의 해야 한다.