Study/이펙티브 자바

Study/이펙티브 자바

[Effective Java 3E] 변경 가능성을 최소화하라

💥 개요 불변클래스란 인스턴스 내부 값을 수정할 수 없는 클래스다. 불변 인스턴스에 간직된 정보는 생성된 순간부터 파괴되는 순간까지 절대 달라지지 않습니다. 자바에서 String, 기본 타입의 박싱된 클래스, BigInteger, BigDecimal이 여기에 속합니다. 📃 불변 클래스를 만드는 5가지 규칙 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. 클래스를 확장할 수 없도록 한다. (상속한 클래스에서 객체의 상태를 변하게 만드는 상태를 막아줌, 대표적인 방법으로 final Class) 모든 필드를 final로 선언한다. 모든 필드를 private으로 선언한다. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 👍대표적인 불변 클래스 public final class Comple..

Study/이펙티브 자바

[Effective Java 3E] public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

💥 개요 이따금 인스턴스 필드들을 모아놓는 일 외에는 아무 목적도 없는 퇴보한 클래스를 작성하려 할 때가 있습니다. class Point { public double x; public double y; } 이런 클래스는 데이터 필드에 직접 접근할 수 있으니 캡슐화의 이점을 제공하지 못합니다. API를 수정하지 않고 내부 표현을 바꿀 수 없고, 불변식을 보장할 수 없으며, 외부에서 필드에 접근할 때 부수 작업을 수행할 수도 없습니다. 철저한 객체 지향 프로그래머는 이런 클래스를 싫어해 모두 private으로 필드를 변경하고 public 접근자(getter)를 추가합니다. class Point { private double x; private double y; public Point(double x, dou..

Study/이펙티브 자바

[Effective Java 3E] 클래스와 멤버의 접근 권한을 최소화하라

💥 개요 잘 설계된 컴포넌트는 클래스 내부 데이터와 내부 구현 정보를 얼마나 잘 숨겼느냐 입니다. 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리합니다. 오직 API만을 통해 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 영향을 끼치지 않는데 이것을 정보 은닉, 혹은 캡슐화라고 합니다. ( 소프트웨어 설계의 근간이 되는 원리) 👍 정보 은닉의 장점 정보 은닉의 장점은 정말 많습니다. 그중 대부분은 컴포넌트를 서로 독립시켜서 개발, 테스트, 최적화, 적용, 분석, 수정을 개별적으로 할 수 있게 해주는 것과 연관이 되어있습니다. 시스템 개발 속도를 높인다. 각 컴포넌트를 병렬로 개발이 가능 시스템 관리 비용을 낮춘다. 작은 컴포넌트로 나눠 빨리 파악할 수 있고 디..

Study/이펙티브 자바

[Effective Java 3E] Comparable을 구현할지 고민하라

💥 개요 compareTo는 equals, hashcode, toString과 다르게 Object의 메서드가 아닙니다. 그리고 equals와 2가지만 제외하면 거의 비슷한데, compreTo는 동치성 비교에 더해 순서까지 비교할 수 있으며, 제네릭합니다. 즉 Compareble을 구현하게 된다면 그 클래스의 인스턴스에는 자연적인 순서가 있음을 뜻합니다. 그래서 Compareble을 구현한 객체의 배열은 Arrays.sort(a)와 같이 손쉽게 정렬이 가능합니다. public class WordList { public static void main(String[] args) { Set s = new TreeSet(); Collections.addAll(s, args); System.out.println(s..

Study/이펙티브 자바

[Effective Java 3E] clone 재정의는 주의해서 진행하라

💥 개요 Coneable은 복제해도 되는 클래스임을 명시하는 용도의 믹스인 인터페이스지만, 아쉽게 목적을 제대로 이루지 못했습니다. 가장 큰 문제는 clone 메서드가 Object에 선언되어있고 protected로 정의되어 있다는 점 입니다. 그래서 Cloneable을 구현하는 것 만으로 외부에서 clone 메서드를 호출할 수 없습니다. Cloneable 인터페이스는 Object의 protected clone의 동작방식을 결정합니다. Cloneable을 구현한 클래스에서 clone을 호출하면 그 객체를 복사한 객체를 반환하며, 그렇지 않은 클래스라면 CloneNotSupportedException을 던지게 됩니다. Cloneable을 구현한 클래스의 clone은 public으로 제공하며, 사용자는 복제가..

Study/이펙티브 자바

[Effective Java 3E] toString을 항상 재정의하라

💥 개요 Object의 기본 메서드는 적합한 문자열을 반환하는 경우가 거의 없습니다. PhoneNumber@abddb 처럼 [클래스명@16진수로_표현한_해시코드]를 반환합니다. 읽기 불편하고,무슨 정보인지 클라이언트는 확인하기가 힘듭니다. 💡 toString 생성시 주의점 toString을 잘 구현한 클래스는 사용하기에 훨씬 즐겁고, 그 클래스를 사용한 시스템은 디버깅 하기가 쉽다. toString 메서드는 객체를 println, printf, 문자열 연결 연산자(+), assert 구문에 넘길 때, 혹은 디버거가 객체를 출력할 때 자동으로 불립니다. 하지만 재정의를 하지 않는다면 그다지 쓸모없는 메시지가 출력될 것 입니다. map 객체를 출력할 때 System.out.println(phoneNumber..

Study/이펙티브 자바

[Effective Java 3E] equals를 재작성하려거든 hashcode도 재정의하라

💥 개요 equals를 재정의한 클래스 모두에서 hashcode도 재정의해야 합니다. 그렇지 않으면 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으키게 됩니다. 다음은 Object 명세에서 발췌한 규약입니다. - equals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다. 단, 애플리케이션이 다시 실행한다면 이 값이 달라져도 상관없다. - equals가 두 객체를 다르다고 판단했다면, 두 객체의 hashcode는 똑같은 값을 반환해야 한다. - equals가 두 객체를 다르다고 판단했더라도, 두 객체의 hashcode가 서로 다른 값을..

Study/이펙티브 자바

[Effective Java 3E] equals는 일반 규약을 지켜 재정의하라

💥 개요 equals 메서드는 재정의하기 쉬워 보이지만, 곳곳에 함정이 있습니다. 문제를 피하는 방법은 재정의하지 않는것이고, 아래와 같은 상황 중 하나에 해당한다면 재정의하지 않는것이 좋습니다. 각 인스턴스가 본질적으로 고유하다. 값을 표현하는게 아니라 동작하는 개체를 표현하는 클래스(예를 들어 Thread) equals는 이미 이 객체에 딱 맞게 구현되어 재정의 할 필요가 없습니다. 인스턴스의 논리적 동치성(logical equality)를 검사할 일이 없다. java.util.regex.Pattern은 equals를 재정의해서 두 Pattern의 인스턴스가 같은 정규표현식을 나타내는지(논리적 동치성)를 검사하는 방법도 있습니다. 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다...

mntdev
'Study/이펙티브 자바' 카테고리의 글 목록 (4 Page)