분류 전체보기
-
아이템17) 변경 가능성을 최소화하라책/이펙티브 자바 3e 2022. 3. 5. 13:44
클래스를 불변으로 만드려면 다음 다섯가지 규칙을 따르면 된다. 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. 클래스를 확장할 수 없도록 한다. final을 사용하거나 모든 생성자를 private 혹은 package-private으로 만들고 public 정적 팩터리를 제공 모든 필드를 final로 선언한다. 모든 필드를 private으로 선언한다. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 불변 객체의 장점 불변 객체는 단순 시작부터 끝까지 동일함 불변 객체는 근본적으로 스레드 안전하여 따로 동기화할 필요가 없다. 여러 스레드가 동시에 사용해도 절대 훼손되지 않음 불변 객체는 자유롭게 공유할 수 있고, 불변 객체끼리는 내부 데이터를 공유할 수 있다. 값이 변하지 않으니 공유를..
-
전략 패턴책/개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴 2022. 3. 3. 14:30
개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴 전략(strategy) 패턴 (p.175 ~ 181) 과일 매장에 여러가지 할인 정책이 있다.(ex. 첫 손님 10% 할인, vip 15% 할인 등) 이를 코드로 구현하는 방법 중 하나는 if-else를 사용하는 것이다. public class Calculator { public int calculate(boolean firstGuest, boolean vip, List items) { if 첫번째손님이면, 10%할인 else if vip손님이면, 15퍼 할인 } } 이는 두가지 문제점이 있다. 서로 다른 정책들이 하나의 코드에 있어 정책이 늘어날수록 코드분석이 어려워짐 정책이 늘어날수록 확장하기가 어려워짐. 정책에 따른 조건이 매개변수에 추가되어야 ..
-
아이템 22) 인터페이스는 타입을 정의하는 용도로만 사용하라책/이펙티브 자바 3e 2022. 3. 3. 14:29
아이템22) 인터페이스는 타입을 정의하는 용도로만 사용하라 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 함 즉, 인터페이스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것 인터페이스를 상수 공개용 수단으로 사용하지 말자 상수 인터페이스 안티패턴 - 사용금지! public interface Constants { static final int MAX = 9; static final int MIN = 0; } 상수 유틸리티 클래스 - 이걸 사용하자 public class Constants { private Constants() {} //인스턴스화 방지 static final int MAX = 9; static final int MIN = 0; }
-
List.of와 Arrays.asList의 차이TIL 2022. 3. 2. 17:26
학습동기 많이 사용하는 List 자료구조, 크기가 고정된 배열을 만들어주는 Arrays.asList를 종종 사용했는데, 자바9에 List.of가 추가되었다고 한다. 둘의 차이가 궁금해 찾아봄 학습내용 Arrays.asList는 mutable list를, List.of는 immutable list를 반환 Arrays.asList는 null원소를 허용, List.of에선 안됨 contains(null)의 결과가 다름, Arrays.asList로 만들어진 얘는 true/false, List.of는 NullPointerException 배열을 인자로 넘겨줬을때, Arrays.asList의 결과는 배열값이 바뀌면 따라바뀜, List.of는 안바뀜 결론 불변이 대세인거 같으니 List.of쓰자 출처 https://..
-
ch3. 타입과 추상화책/객체지향의 사실과 오해 2022. 3. 2. 03:58
객체지향의 사실과 오해 3장 타입과 추상화 (p.72 ~ 105) 선요약 시간에 따라 상태가 동적으로 변하는 객체를 정적으로 추상화 한것이 타입이다. 객체는 행동에 따라 동일한 타입으로 분류될 수 있다. 동일한 타입의 객체가 무엇인지 행동에 따라 분류하기 위해선 1. 외부에 제공해야 하는 행동(책임)을 먼저 결정하고, 2. 책임을 수행하는데 필요한 적절한 데이터를 결정해야 한다. 객체와 타입 객체를 분류하고 이름을 붙이는 것은 새로운 타입을 선언하는 것과 같다. 객체가 어떤 타입에 속하는지 결정하는 것은 "객체가 수행하는 행동"이다. 같은 타입에 속한 객체는 행동만 동일하면 서로 다른 데이터를 가질 수 있다. (동일한 행동이란 동일한 책임을 의미하며, 동일한 책임이란 동일한 메시지 수신을 의미한다.) 따..
-
Collection에 final 예약어가 붙어도 내용이 변경될 수 있음TIL 2022. 3. 1. 22:49
학습동기 final만 붙이고 return하면 외부에서 안의 내용은 변경될 수 있다고 함 학습내용 private final List numbers; 위의 final이 보장해 주는것은 numbers의 모든 원소가 불변이라는 것이 아닌 "numbers가 참조하는 객체는 변하지 않음"이다. 따라서 getter로 numbers을 바로 리턴해주면 외부에서 numbers의 원소를 바꿀 수 있음! 결론 getter를 사용할 경우 Collections.unmodifiable~ 를 사용해 원소의 불변도 보장하자 public List getNumbers() { return Collections.unmodifiableList(this.numbers); }