언어
-
이펙티브 자바 Item 18 - 상속보다는 컴포지션을 사용하라언어/Effective Java 2024. 5. 31. 10:35
1. 구체 클래스 상속의 위험성 다른 패키지의 구체 클래스를 상속하는 일은 위험하다 (인터페이스 상속말고, 구현 상속)메서드 호출과 달리 상속은 캡슐화를 깨뜨린다.상위 클래스에 따라 하위클래스의 동작에 문제가 생길 수 있기 때문이다.하위클래스가 깨지기 쉬운 이유 상위 클래스의 메서드를 재정의 하여 하위 클래스의 로직을 방어한다. 상위 클래스의 메서드를 동작을 다시 구현하는게 어렵다.오류나 성능을 떨어뜨릴 수도 있다.하위 클래스에서 접근 불가한 private 클래스를 써야한다면 구현이 불가능하다.상위 클래스 릴리즈에서 새로운 메서드를 추가했을 때를 고려해야함하위 클래스에서 허용되지 않은 원소를 추가할 지도 모른다!! 하위 클래스에 추가한 새 메서드가, 상위 클래스 다음 릴리즈에서 같은 시그니처를 가질 때..
-
이펙티브 자바 Item 17 - 변경 가능성을 최소화하라언어/Effective Java 2024. 5. 30. 16:13
불변 클래스는 별다른 동기화 방법을 적용하지 않았다 해도 어느 쓰레드에서건 마음껏 안전하게 사용할 수 있다. 불변 클래스란 그 인스턴스의 내부 값을 수정할 수 없는 클래스를 의미한다. 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않는다. String, 기본 타입의 박싱된 클래스, BigInteger, BigDecimal 등이 여기에 속한다. 클래스를 불변으로 만들려면 다음 다섯 규칙을 따르면 된다. 객체의 상태를 변경하는 메서드를 제공하지 않는다.클래스를 확장할 수 없도록 한다.하위 클래스에서 부주의하게 혹은 나쁜 의도로 객체의 상태를 변하게 만드는 상태를 막아준다. 상속을 막는 대표적인 방법은 클래스를 final로 선언하는 것이지만 다른 방법도 살펴보자모든 필드를 f..
-
이펙티브 자바 Item 16 - public 클래스에서는 public필드가 아닌 접근자 메서드를 사용하라언어/Effective Java 2024. 5. 30. 09:52
1. 접근자 메서드를 활용한 데이터 캡슐화 대표적인 클래스 작성 실수: 인스턴스 필드만을 모아놓은 퇴보한 클래스 인스턴스 필드만을 모아놓은 클래스는 데이터 직접 접근할 수 있으나 캡슐화의 이점을 제공하지 못한다.public class Point { public double x; public double y;} 캡슐화가 전혀 안되기 때문에 아래와 같은 단점을 수반한다. API를 수정하지 않고는 내부 표현을 바꿀 수 없다. 불변식을 보장하지 못한다.외부에서 필드에 접근할 때 부수작업을 수행할 수 없다.*API 수정부분 Point.getValue() 같은 메서드를 호출해서 x,y를 얻는다고 했을 때 내부 구현 로직이 캡슐화되어 있기 때문에 얼마든지 바꿀 수 있음 Point.x로 접근했을 때, 만약 ..
-
이펙티브 자바 Item15 - 클래스와 멤버의 접근 권한을 최소화하라언어/Effective Java 2024. 5. 29. 17:28
잘 설계된 컴포넌트란?캡슐화가 얼마나 잘 되었는지.노출되는 API와 실제 구현이 얼마나 잘 분리되었는지.메시지를 주고받는 두 컴포넌트가 서로의 내부 동작을 신경쓰지 않는지. 캡슐화를 잘 지켰을 때 장점서로의 구현을 몰라도 되기 때문에 병렬로 개발이 가능하여 개발 속도가 빨라진다.잘 분리되어있는 컴포넌트는 관리 포인트가 작다. 디버깅도 빠르고, 교체도 빠르다잘 분리되어있는 컴포넌트는 최적화도 그 컴포넌트만 하면 되기 때문에 좋다.외부 컴포넌트에 종속되지 않기 때문에 재사용성이 높다.전체 시스템이 완성되지 않아도 개별 컴포넌트를 검증할 수 있기 때문에 큰 시스템 개발하는 난이도를 낮춰준다.1. 캡슐화의 핵심은 "접근제어자" 공개 API를 설계하고 그것만 public으로 지정한다 > 나머지는 private으로..
-
이펙티브 자바 Item 14 - Comparable을 구현할지 고려하라언어/Effective Java 2024. 5. 29. 16:16
1. Comparable 인터페이스란?Comparable 인터페이스는 객체를 정렬하는데 사용되는 메서드인 compareTo를 정의하고 있다.Comparable 인터페이스를 구현한 클래스는 반드시 compareTo를 정의해야 한다. 1.1 Comparable 인터페이스 특징자바에서 같은 타입의 인스턴스를 비교해야만 하는 클래스들은 모두 Comparable 인터페이스를 구현하고 있다.Boolean 타입을 제외한 래퍼 클래스와 알파벳, 연대같이 순서가 명확한 클래스들은 모두 정렬이 가능하다.기본 정렬 순서는 작은 값에서 큰 값으로 정렬되는 오름차순이다. 1.2 Comparable 인터페이스 구현Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 자연적인 순서가 있음을 의미한다.public clas..
-
이펙티브 자바 Item 13 - clone 재정의는 주의해서 진행하라언어/Effective Java 2024. 5. 29. 15:34
clonable의 역할복제해도 되는 클래스임을 나타내는 믹스인 인터페이스이다.Object 클래스에 protected clone()라는 메서드가 있다.Cloneable 인터페이스는 clone() 메서드의 동작 방식을 결정한다.Cloneable을 구현하지 않는 인스턴스에서 clone()를 호출하면 CloneNotSupportedException을 던진다.clone() 사용해보기static class Entry implements Cloneable { String key; String value; public Entry(String key, String value) { this.key = key; this.value = value; ..
-
이펙티브 자바 Item 12 - toString은 항상 재정의하라언어/Effective Java 2024. 5. 29. 14:25
Object의 기본 toString은 클래스_이름@16진수로_표시한_해시코드를 반환한다. toString 규약 사람이 읽기 쉬운 정보를 반환하라 모든 하위 클래스에서 재정의하라 toString 메서드는 객체를 println,printf 문자열 연결, assert 구문에 넘길 때, 디버거가 객체를 출력할 때 자동으로 사용된다. 좋은 toString은 이 인스턴스를 포함하는 객체에서 유용하게 쓰인다. toString() 메서드 재정의 시 주의점 객체가 가진 주요 정보는 모두 보여주는 것이 좋다.정보가 너무 많을 때는 간단히 요약된 정보를 보여줄 수도 있다. 포맷을 명시하기로 했으면, 명시한 포맷에 맞는 문자열과 객체를 상호전환 할 수 있는 정적 팩토리나 생성자 함께 제공하면 좋다. toString이 반환..
-
이펙티브 자바 Itme 10 - equals는 일반 규약을 지켜 재정의 하라언어/Effective Java 2024. 5. 28. 21:46
1. equals를 재정의 하면 안 되는 경우 1. 각 인스턴스가 본질적으로 고유할 때 값 클래스(Integer, String 처럼 값을 표현) 가 아닌 동작하는 개체를 표현하는 클래스(Thread)2. 인스턴스의 '논리적 동치성' 검사할 일이 없을 때 (동등성)논리적 동치성 검사의 1가지: Pattern의 인스턴스가 같은 정규 표현식을 나타내는 지 검사 3. 상위 클래스에서 재정의한 equals가 하위 클래스에도 들어맞을 때 같은 특징을 가지면 equals를 상속받아 사용하는 걸 권장한다.4. 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없을 때 // equals가 실수로 호출되는 걸 막고 싶다면@Override public boolean equals..