Language
-
[Effective Java] 아이템19: 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라Language/Java 2022. 7. 9. 09:01
✔️ 상속을 고려한 문서화와 설계 문서화 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다. 재정의 가능 메서드를 호출할 수 있는 모든 상황을 문서로 남겨야 한다. * 재정의 가능 메서드: public과 protected 메서드 중 final이 아닌 모든 메서드. @implSpec 태그 메서드 주석에 붙여주면 자바도 도구가 "Implementation Requirements"로 시작하는, 메서드의 내부 동작 방식을 설명하는 절을 생성해준다. 이 태그를 활성화하려면 명령줄 매개변수로 -tag "implSpec:a:Implementation Requirents:"를 지정해주면 된다. protected 메서드 및 필드 클래스의 내부 동작 과정 중간에 끼어들 수 있는 ..
-
[Effective Java] 아이템18: 상속보다는 컴포지션을 사용하라Language/Java 2022. 7. 2. 04:45
이번 아이템에서 논하는 상속은 클래스가 다른 클래스를 확장하는 구현 상속을 말한다. 클래스가 인터페이스를 구현하거나 인터페이스가 다른 인터페이스를 확장하는 인터페이스 상속과는 무관하다. ✔️ 상속의 위험성 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. 상위 클래스가 릴리스 때 내부 구현이 달라지면, 그 여파로 하위 클래스가 오동작할 수 있다. 메서드를 재정의하는 대신 새로운 메서드를 추가하더라도, 문제가 발생할 수 있다. 상위 클래스의 새 메서드와 시그니처가 같고 반환 타입이 다르다면, 컴파일 오류가 발생한다. 시그니처와 반환 타입 모두 같을 경우, 상위 클래스의 메서드를 재정의한 것이 된다. 새로 추가한 메서드가 상위 클래스의 메서드가 요구하는 규약을 만족하지 못할 가능성이 크다. ✔️ 컴포지션 (Co..
-
[Effective Java] 아이템17: 변경 가능성을 최소화하라Language/Java 2022. 6. 29. 16:00
✔️ 자바 플랫폼 라이브러리의 불변 클래스 String 기본 타입의 박싱된 클래스들 ex) Integer, Long, Double BigInteger BigDecimal→ ✔️ 불변 클래스 만들기 위한 규칙 (5가지) 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. 클래스를 확장할 수 없도록 한다. → 2가지 방법이 있다. (클래스 상속 방지하는 방법 참고) 모든 필드를 final로 선언한다. 모든 필드를 private으로 선언한다. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 생성자, 접근자, readObject 메서드 모두에서 방어적 복사를 수행하라. ✔️ 불변 클래스 예시: 복소수 클래스 // 불변 복소수 클래스 public final class Complex { priv..
-
[Effective Java] 아이템16: public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라Language/Java 2022. 6. 24. 23:55
class Point { public double x; public double y; } 위의 클래스는 데이터 필드를 직접 접근할 수 있어, 캡슐화의 이점을 제공하지 못 한다. API를 수정하지 않고는 내부 표현을 바꿀 수 없고, 불변식을 보장할 수 없으며, 외부에서 필드에 접근할 때 부수 작업을 수행할 수도 없다. class Point { private double x; private double y; public Point(double x, double y) { this.x = x; this.y = y; } public double getX() { return x; } public double getY() { return y; } public void setX(double x) { this.x = x..
-
[Effective Java] 아이템15: 클래스와 멤버의 접근 권한을 최소화하라Language/Java 2022. 6. 22. 11:57
잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리한다. 오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않는다. 이러한 정보 은닉 혹은 캡슐화라고 하는 개념은 소프트웨어 설계의 근간이 되는 원리다. ✔️ 정보 은닉의 장점 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다. 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고, 다른 컴포넌트로 교체하는 부담도 적기 때문이다. 정보 은닉 자체가 성능을 높여주지는 않지만, 성능 최적화에 도움을 준다. 완성된 시스템을 프로파일링해 최적화할 컴포넌트를 정한 다음, 다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 최적화할 수 있기 때문이다...
-
[Effective Java] 아이템14:Comparable을 구현할지 고려하라Language/Java 2022. 6. 20. 13:20
이번에는 Comparable 인터페이스의 유일한 메서드인 compareTo에 대하여 알아보자. compareTo 는 두 가지만 빼면 Object의 equals와 같다. 첫 번째, compareTo 는 단순 동치성 비교에 더해 순서까지 비교할 수 있다. 두 번째, compareTo 는 제네릭하다. Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 자연저인 순서(natural order)가 있음을 뜻한다. 그래서 Comparable을 구현한 객체들의 배열은 손쉽게 정렬할 수 있다. Arrays.sort(a); 또한, 검색, 극단값 계산, 자동 정렬되는 컬렉션 관리도 쉽게 할 수 있다. String이 Comparable을 구현하였기 때문에 다음 예제는 명령줄 인수들을 (중복 제거하고) 알파벳순으..
-
[Effective Java] 아이템13: clone 재정의는 주의해서 진행하라Language/Java 2022. 6. 16. 00:37
Cloneable은 복제해도 되는 클래스임을 명시하는 용도의 '믹스인 인터페이스(mixin interface, 아이템 20)'지만, 의도한 목적을 제대로 이루지 못했다. 가장 큰 문제는 clone 메서드가 선언된 곳이 Cloneable이 아닌 Object이고, 그 마저도 protected라는 것이다. 그래서 Cloneable을 구현하는 것만으로는 외부 객체에서 clone 메서드를 호출할 수 없다. 이러한 여러 문제점에도 불구하고 Cloneable 방식은 널리 쓰이고 있어 잘 알아두는 것이 좋다. 이번 아이템에서는 clone 메서드를 잘 동작하게끔 해주는 구현 방법과 언제 그렇게 해야 하는지, 그리고 가능한 다른 선택지에 관해 논의할 것이다. ✔️ Cloneable 인터페이스 먼저 메서드 하나 없는 Clo..
-
[Effective Java] 아이템12: toString을 항상 재정의하라Language/Java 2022. 6. 10. 21:56
Object의 기본 toString 메서드가 작성한 클래스의 적합한 문자열을 반환하는 경우는 거의 없다. 이 메서드는 단순히 클래스_이름@16진수로_표시한_해시코드 를 반환할 뿐이다. toString의 일반 규약에 따르면 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환해야 한다. 또한, toString의 규약은 '모든 하위 클래스에서 이 메서드를 재정의하라'고 한다. equals와 hashCode 규약만큼 대단히 중요하진 않지만, toString 을 잘 구현한 클래스는 사용하기 훨씬 즐겁고, 디버깅하기 쉽다. 그렇다면 이제부터 toString을 재정의할 때 유의할 점을 알아보자. ✔️ 실전에서 toString은 그 객체가 가진 주요 정보 모두를 반환하는 게 좋다. 만약 객체가 거대하거나, 객체..