본문 바로가기

분류 전체보기153

이펙티브 자바 아이템 23 - 태그 달린 클래스보다는 클래스 계층 구조를 활용하라 - 핵심 정리 아이템 23 - 태그 달린 클래스보다는 클래스 계층 구조를 활용하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 태그달린 클래스란 그 클래스가 가지고 있는 필드 중 일부가 그 클래스의 구체적인 타입을 나타내는 것을 말한다. class Figure { enum Shape { RECTANGLE, CIRCLE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // 다음 필드들은 모양이 사각형(RECTANGLE)일 때만 쓰인다. double length; double width; // 다음 필드는 모양이 원(CIRCLE)일 때만 쓰인다. double radius; // 원용 생성자 Figure(double rad.. 2022. 11. 30.
이펙티브 자바 아이템 22 - 인터페이스는 타입을 정의하는 용도로만 사용하라 - 핵심 정리 아이템 22 - 인터페이스는 타입을 정의하는 용도로만 사용하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. public interface PhysicalConstants { // 아보가드로 수 (1/몰) static final double AVOGADROS_NUMBER = 6.022_140_857e23; // 볼츠만 상수 (J/K) static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; // 전자 질량 (kg) static final double ELECTRON_MASS = 9.109_383_56e-31; } 위와 같이 인터페이스를 상수를 정의하는 용도 로 사용하는 경우가 있다. publ.. 2022. 11. 30.
이펙티브 자바 아이템 21 - 인터페이스는 구현하는 쪽을 생각해 설계하라 - 완벽 공략 아이템 21 - 인터페이스는 구현하는 쪽을 생각해 설계하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. ConcurrentModificationException ConcurrentModificationException 은 컬렉션을 다룰 때 주로 발생하는 예외이다. 컬렉션을 순회하다 어떤 엘리먼트를 삭제하고 싶을 때 주로 발생할 수 있다. ConcurrentModificationException 는 컬렉션에 국한된 예외는 아니다. ConcurrentModificationException 은 현재 객체의 상태가 바뀌면 안되는 것을 수정 할 때 발생하는 예외이다. 어떤 스레드에서 컬렉션을 순회하는 도중에 다른 스레드가 해당 컬렉션을 변경하려고.. 2022. 11. 29.
이펙티브 자바 아이템 21 - 인터페이스는 구현하는 쪽을 생각해 설계하라 - 핵심 정리 아이템 21 - 인터페이스는 구현하는 쪽을 생각해 설계하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 인터페이스에 디폴트 메서드를 추가하면 다소 위험한 상황이 벌어질 수도 있다. 인터페이스에 디폴트 메서드를 추가하는 것은 해당 인터페이스를 구현한 모든 클래스에 해당 기능을 강제적으로 삽입하는 것을 의미한다. 이로인해 예기치못한 문제가 발생할 수 있다. public interface Collection extends Iterable { // -- 중간 생략 -- default boolean removeIf(Predicate 2022. 11. 29.
이펙티브 자바 아이템 20 - 추상 클래스보다 인터페이스를 우선하라 - 완벽 공략 아이템 20 - 추상 클래스보다 인터페이스를 우선하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 템플릿 메서드 패턴 템플릿 메서드 패턴은 상속을 사용하는 대표적인 디자인 패턴 중 하나이다. 알고리즘의 구조를 서브 클래스가 확장할 수 있도록 템플릿으로 제공하는 방법이다. 상속을 사용해 템플릿 메서드의 일부분을 확장할 수 있다. public abstract class FileProcessor { private String path; public FileProcessor(String path) { this.path = path; } public final int process() { try(BufferedReader reader = new .. 2022. 11. 29.
이펙티브 자바 아이템 20 - 추상 클래스보다 인터페이스를 우선하라 - 핵심 정리 아이템 20 - 추상 클래스보다 인터페이스를 우선하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 추상 클래스와 인터페이스는 자주 비교가 된다. 보통 인터페이스는 타입을 정의 할 때 사용되고 추상 클래스는 인터페이스의 구현체를 일부 기본적으로 제공 할 때 사용한다. 추상 클래스를 상속해 기능을 제공하기보다는 인터페이스를 우선적으로 사용해야한다. 하나의 추상 클래스만 상속 받을 수 있기 때문에 제약이 심해진다. 추상 클래스를 상속받아야 하는 클래스가 다른 클래스를 상속 받았을 수도 있고 여러 클래스가 동일한 클래스를 상속받아야 하는데 둘 간의 계층 구조가 만들어진 경우 추상 클래스 상속이 어려워진다. 인터페이스의 장점 자바 8부터 인터페이.. 2022. 11. 28.
이펙티브 자바 아이템 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.