본문 바로가기

공부 기록/Java

(37)
[이펙티브 자바 3/E] 아이템15 - 클래스와 멤버의 접근 권한을 최소화하라 - 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리한다. 정보 은닉의 장점 - 시스템 개발 속도를 높인다. - 시스템 관리 비용을 낮춘다. - 성능 최적화에 도움을 준다. - 소프트웨어 재사용성을 높인다. - 큰 시스템을 제작하는 난이도를 낮춰준다. - 자바는 정보 은닉을 위한 다양한 장치를 제공한다. => 그중 접근 제어 메커니즘은 클래스, 인터페이스, 멤버의 접근성(접근 허용 범위)을 명시한다. - 기본 원칙 : 모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다. - 한 클래스에서만 사용하는 package-private 톱레벨 클래스나 인터페이스는 이를 사용하는 클래스 안에 private static으로 중첩시켜보자(아이템 24). - public일 필요가 없는 ..
[JPA] 5장 - 연관관계 매핑 기초(3) - 양방향 연관관계 양방향 연관관계 - 데이터베이스 테이블은 외래 키 하나로 양방향으로 조회할 수 있다. 양방향 연관관계 매핑 @Entity public class Team { @Id @Column(name = "TEAM_ID") private String id; private String name; // 추가 @OneToMany(mappedBy = "team") private List members = new ArrayList(); ... } - 회원 엔티티에는 변경한 부분이 없지만, 팀 엔티티에는 List members를 추가했다. - @OneToMany에서 mappedBy의 속성은 반대쪽 매핑의 필드 이름을 값으로 주면 된다.(Member.team) 연관관계의 주인 - 엔티티를 양방향 연관관계로 설정하면 객체의 참조는..
[JPA] 5장 - 연관관계 매핑 기초(2) - 연관관계 사용 연관관계 사용 저장 - JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 한다. public void testSave() { Team team1 = new Team("team1", "팀1"); em.persist(team1); Member member1 = new Member("member1", "회원1"); member1.setTeam(team1); // 연관관계 설정 member1 -> team1 em.persist(member1); } 조회 - 연관관계가 있는 엔티티를 조회하는 방법은 크게 2가지다. - 객체 그래프 탐색(객체 연관관계를 사용한 조회) Member member = em.find(Member.class, "member1"); Team team = member.getTe..
[이펙티브 자바 3/E] 아이템14 - Comparable을 구현할지 고려하라 - Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 자연적인 순서(natural order)가 있음을 뜻한다. 그래서 객체들의 배열을 Arrays.sort(a);와 같이 손쉽게 정렬할 수 있다. - 알파벳, 숫자, 연대 같이 순서가 명확한 값 클래스를 작성한다면 반드시 Comparable 인터페이스를 구현하자. - compareTo 메서드의 일반 규약은 equals의 규약(아이템 10)과 비슷하다. - compareTo 메서드로 수행한 동치성 테스트의 결과는 equals와 같아야 한다. - compareTo 메서드에서 관계 연산자 를 사용하는 이전 방식은 거추장스럽고 오류를 유발하니, 이제는 추천하지 않는다. => 박싱된 기본 타입 클래스들에 새로 추가된 정적 메서드인 compare를 이..
[이펙티브 자바 3/E] 아이템13 - clone 재정의는 주의해서 진행하라 - Cloneable을 구현하는 것만으로는 외부 객체에서 clone 메서드를 호출할 수 없다. - Cloneable 인터페이스는 놀랍게도 Object의 protected 메서드인 clone의 동작 방식을 결정한다. => 상위 클래스에 정의된 protected 메서드의 동작 방식을 변경한 것이다. - 가변 객체를 참조하는 클래스를 복제할 수 있도록 만들어보자. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; ... } - clone 메서드가 단순히 super.clone의 결과를 그대로 반환한다면 어떻게 될까? 반환된 Stack 인스..
[JPA] 5장 - 연관관계 매핑 기초(1) - 단방향 연관관계 단방향 연관관계 - 객체 연관관계 : 회원 객체와 팀 객체는 단방향 관계다. => 회원은 Member.team 필드를 통해서 팀을 알 수 있지만 반대로 팀은 회원을 알 수 없다. - 테이블 연관관계 : 회원 테이블과 팀 테이블은 양방향 관계다. 회원 테이블의 TEAM_ID 외래 키를 통해서 회원과 팀을 조인할 수 있고 반대로 팀과 회원도 조인할 수 있다. - 객체 연관관계와 테이블 연관관계의 가장 큰 차이 - 참조를 통한 연관관계는 언제나 단방향이다. 객체 간에 연관관계를 양방향으로 만들고 싶으면 반대쪽에도 필드를 추가해서 참조를 보관해야 한다. => 정확히 이야기하면 이것은 양방향 관계가 아니라 서로 다른 단방향 관계 2개다. 객체 연관관계 VS 테이블 연관관계 정리 - 객체는 참조(주소)로 연관관계를..
[이펙티브 자바 3/E] 아이템12 - toString을 항상 재정의하라 - Object의 기본 toString 메서드가 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없다. 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 한다. 모든 하위 클래스에서 이 메서드를 재정의해야 한다. - 실전에서 toString은 그 객체가 가진 주요 정보 모두를 반환하는 게 좋다. - 객체가 거대하거나 객체의 상태가 문자열로 표현하기에 적합하지 않다면 요약 정보를 담아야 한다. - 이상적으로는 스스로를 완벽히 설명하는 문자열이어야 한다. - toString을 구현할 때면 반환값의 포맷을 문서화할지 정해야 한다. 포맷을 명시하기로 했다면, 명시한 포맷에 맞는 문자열과 객체를 상호 전환할 수 있는 정적 팩터리나 생성자를 함께 제공해..
[이펙티브 자바 3/E] 아이템11 - equals를 재정의하려거든 hashCode도 재정의하라 equals를 재정의한 클래스 모두에서 hashCode도 재정의해야 한다. equals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다. 단, 애플리케이션을 다시 실행한다면 이 값이 달라져도 상관없다. equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다. equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 없다. 단, 다른 객체에 대해서는 다른 값을 반환해야 해시테이블의 성능이 좋아진다. - equals는 물리적으로 다..