본문 바로가기

개발 공부/Java58

이펙티브 자바 아이템 19 - 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 - 핵심 정리 아이템 19 - 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 상속용 클래스는 내부 구현을 문서로 남겨야 한다. 상속 대신 컴포지션 을 사용하라고 했지만 상속은 객체지향의 가장 큰 특징이자 여러가지 코드를 재사용하는 좋은 방법 중 하나이기 때문에 어떻게하면 상속을 잘 사용할 수 있을지에 대한 아이템이다. 상속을 허용할거라면 문서화 를 해야한다. 상속용 클래스에스 재정의를 허용 하는 메서드에는 해당 메서드에 내부 동작 원리를 문서화해야한다. 좋은 API 는 어떻게가 아니라 무엇을 해야하는지에 대해 설명해야한다 라는 격언과 반대되는 말이다. 문서를 읽었을 떄 해당하는 클래스가.. 2022. 11. 25.
이펙티브 자바 아이템 18 - 상속보다는 컴포지션을 사용하라 - 완벽 공략 아이템 18 - 상속보다는 컴포지션을 사용하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 데코레이터 패턴 데코레이터 패턴은 기존 코드를 변경하지 않고 부가 기능을 추가하는 패턴 이다. 데코레이터는 상속이 아니라 위임 을 사용하는 대표적인 디자인 패턴 중 하나이다. 굳이 새로운 클래스를 만들 필요없이 기존의 클래스를 조합해 새로운 인스턴스를 만들 수 있다. 단점으로는 조합을 하는 코드가 복잡해 질 수 있다. public class ForwardingSet implements Set { private final Set s; public ForwardingSet(Set s) { this.s = s; } public void clear() {.. 2022. 11. 24.
이펙티브 자바 아이템 18 - 상속보다는 컴포지션을 사용하라 - 핵심 정리 아이템 18 - 상속보다는 컴포지션을 사용하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 패키지 경계를 넘어 다른 패키지의 구체 클래스를 상속하는 일은 위험하다 주의할 점은 인터페이스 상속이 아니라 구체적인 클래스 를 상속할 때의 이야기이다. public class InstrumentedHashSet extends HashSet { // 추가된 원소의 수 private int addCount = 0; public InstrumentedHashSet() { } public InstrumentedHashSet(int initCap, float loadFactor) { super(initCap, loadFactor); } @Override .. 2022. 11. 22.
이펙티브 자바 아이템 17 - 변경 가능성을 최소화 하라 - 완벽 공략 아이템 17 - 변경 가능성을 최소화 하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 새로 생성된 불변 인스턴스를 동기화 없이 다른 스레드로 건네도 문제없이 동작 불변 인스턴스는 synchronized 와 같은 동기화 작업을 할 필요없이 다른 스레드에서 공유해서 써도 안전하다. final 과 자바 메모리 모델(JMM) final 은 해당 변수가 초기화가 되면 다른 값으로 바뀌지 않게 해주는 것이다. 상수로 만들때 주로 사용한다. final 을 사용하면 해당하는 필드값을 안전하게 초기화 할 수 있다. 이를 이해하려면 자바 메모리 모델에 대한 개념과 자바 메모리 모델에서 final 이 어떻게 동작하는지 이해해야한다. 자바 메모리 모델은 J.. 2022. 11. 21.
이펙티브 자바 아이템 17 - 변경 가능성을 최소화 하라 - 핵심 정리 아이템 17 - 변경 가능성을 최소화 하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 불변 클래스 불변 클래스란 한번 만들어지면 그 인스턴스의 상태가 바뀌지 않는 것 을 말한다. 그 인스턴스가 소멸될 때까지 인스턴스의 내부의 값들이 변경되지 않는 것이다. 이렇게 설계된 클래스를 불변 클래스 라고 하고 불변 클래스의 인스턴스를 불변 인스턴스 라고 한다. 불변 클래스를 만들기위한 다섯가지 규칙이 있다. 객체의 상태를 변경하는 메서드를 제공하지 않는다. public class PhoneNumber { private short areaCode, prefix, lineNum; public void setAreaCode(short areaCode.. 2022. 11. 21.
이펙티브 자바 아이템 16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 - 완벽 공략 아이템 16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 내부를 노출한 Dimension 클래스의 심각한 성능 단순히 public 필드를 만들었다고해서 설계적인 문제는 생기겠지만 어떻게 성능 문제까지 생길 수 있을까 public class DimensionExample { public static void main(String[] args) { Button button = new Button("hello button"); button.setBounds(0, 0, 20, 10); Dimension size = button.getSize(); System.out... 2022. 11. 14.
이펙티브 자바 아이템 16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 - 핵심 정리 아이템 16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라. 주의할 점은 public 클래스인 경우에 해당한다는 것이다. public class Point { public double x; public double y; } 위와 같이 public 필드를 사용하면 외부 클래스에서는 public class main { public static void main(String[] args) { Point point = new Point(); point.x = 10; point.y = 20; Sy.. 2022. 11. 14.
이펙티브 자바 아이템 15 - 클래스와 멤버의 접근 권한을 최소화하라 - 완벽 공략 아이템 15 - 클래스와 멤버의 접근 권한을 최소화하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 자바 모듈 자바 9 버전에서의 가장 큰 변화는 Java Platform Module System 이다. 줄여서 JPMS 라고도 부른다. 모듈 시스템은 컴포넌트 간의 더 나은 관계를 표현해 줄 수 있는 방법을 제공한다. 이전에는 어떤 컴포넌트가 다른 컴포넌트에서 사용한다는 걸 표시하는 방법은 classpath 뿐이었다. classpath 에 jar 파일을 넣음으로써 현재 프로젝트에서 다른 jar 파일을 참조해 사용할 수 있었다. 이 방법은 참조하는 jar 파일이 없더라도 어플리케이션이 동작한뒤 해당 jar 파일을 참조하려고 할 때 알 수가 .. 2022. 11. 9.
이펙티브 자바 아이템 15 - 클래스와 멤버의 접근 권한을 최소화하라 - 핵심 정리 아이템 15 - 클래스와 멤버의 접근 권한을 최소화하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 정보 은닉의 장점 정보 은닉의 장점은 다음과 같다. 시스템 개발 속도를 높인다. 정보 은닉을 하려다보면 자연스럽게 인터페이스 를 설계하게 된다. 어떤 인터페이스의 설계를 마치고 나면 그 인터페이스를 사용하는 쪽은 그 인터페이스에 맞게 개발을 하면 된다. 그 인터페이스를 구현하는 쪽 역시 해당 인터페이스에 정의되어 있는 대로 동작할 수 있는 클래스를 개발하면 된다. 이렇게 인터페이스를 사용하는 쪽과 제공하는 쪽이 동시에 개발 진행이 가능하다. 동시에 여러 모듈을 개발하는 것도 가능하다. 시스템 관리 비용을 낮춘다. 인터페이스를 통해 각 컴포.. 2022. 11. 8.
이펙티브 자바 아이템 14 - Comparable 을 구현할지 고민하라 - 완벽 공략 아이템 14 - Comparable 을 구현할지 고민하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. compareTo 메서드의 인수 타입은 컴파일타임에 정해진다. 제네릭 인터페이스에 제네릭 타입을 선언해주면 구체적인 타입을 컴파일 타임에 인수타입이 정해진다. 컴파일 타임 은 작성한 코드가 컴파일 되는 시점을 의미한다. 어떠한 경우든 컴파일 타임 에 문제를 찾는게 더 좋다. 런타임 에서 문제가 발생했다는 것은 문제를 발견하는데까지 시간이 오래걸린다는 의미다. 런타임 에서 발생하는 문제를 해결하는 게 더 까다롭다. Equals 같은 경우 해당 타입이 맞지 않는다는 오류는 런타임 에서 발생한다. 실제로 어떤 오브젝트가 메서드에 들어올지는 런.. 2022. 10. 31.
이펙티브 자바 아이템 14 - Comparable 을 구현할지 고민하라 - 핵심 정리 아이템 14 - Comparable 을 구현할지 고민하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. Comparable 은 Object 가 제공하는 메서드는 아니지만 일반적으로 널리 사용할 수 있는 인터페이스 이다. Comparable 은 엘리먼트가 지닌 자연적인 순서(natural order) 를 정해줄 때 사용하는 인터페이스이다. Comparable 은 우리가 비교해주고 싶은 순서가 있는 경우에 그 비교 방법을 구현할 수 있다. Comparable 은 제네릭 타입 을 가지고 있기 때문에 컴파일 타임 에 체크가 가능한 장점이 있다. compareTo 를 재정의 할때는 몇가지 규약이 있다. compareTo 규약 compareTo 메서.. 2022. 10. 31.
이펙티브 자바 아이템 13 - clone 재정의는 주의해서 진행하라 - 완벽 공략 아이템 13 - clone 재정의는 주의해서 진행하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. UncheckedException 우리는 보통 UncheckedException 을 선호햔다. public class MyException extends RuntimeException { } UncheckedException 은 RuntimeException 을 상속 받은 Exception 이다. public class MyException extends Error { } Error 를 상속받은 클래스들 역시 UncheckedException 이라고 부를 수 있다. RuntimeException 과 Error 를 확장한 클래스들은 Unche.. 2022. 10. 28.