일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 바운디드 타입
- junit 5
- System.out
- System.err
- 함수형 인터페이스
- annotation processor
- 스파르타코딩클럽
- Java
- 정렬
- raw 타입
- 항해99
- 람다식
- 자바할래
- 제네릭 와일드 카드
- auto.create.topics.enable
- 제네릭 타입
- 접근지시자
- 자바스터디
- 상속
- 익명 클래스
- 프리미티브 타입
- System.in
- public 필드
- Study Halle
- 브릿지 메소드
- Switch Expressions
- 합병 정렬
- github api
- 로컬 클래스
- Effective JAVA
- Today
- Total
목록전체 글 (285)
코딩하는 털보
package me.rockintuna.effectivejava.item;/*확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 */public class Item38 { /* 대부분 열거 타입에는 확장이 필요 없으나, 연산 코드 상수 열거의 경우에는 필요할 수 있다. (기본 연산 기능 외에 커스텀 연산 기능 확장) 하지만 열거 타입은 확장을 제공하지 않기 때문에 인터페이스를 구현할 수 있다는 점을 활용한 확장을 흉내내는 방법을 사용한다. 1. 인터페이스 정의 2. (기본 구현)인터페이스를 구현하는 enum 상수 정의 */ interface Operation { double apply(double a, double b); }..
package me.rockintuna.effectivejava.item;import java.util.*;import static java.util.stream.Collectors.groupingBy;import static java.util.stream.Collectors.toSet;/*ordinal 인덱싱 대신 EnumMap을 사용하라 */public class Item37 { /* ordinal 사용의 단점 - 타입 안전하지 않음 - 컴파일러는 ordinal과 배열의 인덱스의 관계를 알 수 없다. -> IndexOutOfBounds, NullPointer 등 런타임 에러가 발생 가능 */ private String name; private Style s..
package me.rockintuna.effectivejava.item;import java.util.EnumSet;import java.util.Set;/*비트 필드 대신 EnumSet을 사용하라 */public class Item36 { //비트 열거 패턴 public static final int STYLE_BOLD = 1 styleSet = EnumSet.of(Style.UNDERLINE, Style.ITALIC); item36.applyStyles(styleSet); } /* 비트 필드는 비트 연산을 통한 교집합/합집합 같은 집한 연산이 가능하지만 아래와 같은 단점이 있다. - 정수 열거 상수의 단점 - 값 자체를 통해서는 해석하기 어려..
package me.rockintuna.effectivejava.item;/*enum의 ordinal 메서드 대신 인스턴스 필드를 사용하라 */public class Item35 { enum DAY { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } public static void main(String[] args) { /* ordinal() 메서드는 정의된 열거 타입 상수의 순서를 리턴한다. enum의 ordinal 메서드에 의미를 두어 사용하는 건 좋지 않다. - enum 상수의 ..
package me.rockintuna.effectivejava.item;import java.util.Map;import java.util.Optional;import java.util.stream.Stream;import static java.util.stream.Collectors.toMap;/*int 상수 대신 열거 타입을 사용하라 */public class Item34 { /* 열거 타입의 장점 - 값이 아닌 인스턴스로 존재하므로 여러 기능을 제공 - 싱글턴임이 보증 됨 - 컴파일 타임 타입 안정성 - 상수를 추가하거나 순서를 바꿔도 다시 컴파일 하지 않아도 됨 - 임의의 메서드나 필드를 추가할 수 있음 - 임의의 인터페이스를 구현하게 할 수 있음 ..
package me.rockintuna.effectivejava.item;import org.springframework.core.ParameterizedTypeReference;import java.util.HashMap;import java.util.Map;/*타입 안전 이종 컨테이너를 고려하라 */public class Item33 { /* 하나의 컨테이너(제네릭 인스턴스)에서 여러 매개변수화 타입을 쓰려면?*/ public static void main(String[] args) { //String.class 리터럴의 타입은 Class assert String.class instanceof Class; Favorites favorites = n..
package me.rockintuna.effectivejava.item;import java.util.List;/*제네릭과 가변인수를 함께 쓸 때는 신중하라 */public class Item32 { /* 제네릭과 가변인수를 함께 쓸 때는 타입 안정성이 깨진다. 이게 허용되는 이유는 실무에서 매우 유용하기 때문, 사용하고자 한다면 타입 안전한지 확인이 필요하다. */ //제네릭과 가변인수를 함께 쓸 때 타입 안정성이 깨진다. public static void dangerous(List... stringLists) { //내부적으로 제네릭 배열이 만들어지며, 외부로 노출되는데 Object[] objects = stringLists; ..
package me.rockintuna.effectivejava.item;import java.util.ArrayList;import java.util.List;import java.util.Optional;/*한정적 와일드카드를 사용해 API 유연성을 높이라 */public class Item31 { List list = new ArrayList(); public void addAll(List array) { this.list.addAll(array); } public static void main(String[] args) { Item31 item = new Item31(); List integerList = new ArrayList(); ..
package me.rockintuna.effectivejava.item;import java.util.ArrayList;import java.util.List;import java.util.Optional;import java.util.function.UnaryOperator;/*이왕이면 제네릭 메서드로 만들자 */public class Item30 { /* 입력값이나 반환 값을 명시적으로 형변환해야 하는 메서드보다 제네릭 메서드가 더 안전하며 사용하기 쉽다. */ //로 타입을 매개변수나 반환 타입으로 사용하면 경고가 발생하며, 타입 안전하지 않다. public List addRawTypeList(List list1, List list2) { return ne..
package me.rockintuna.effectivejava.item;/*이왕이면 제네릭 타입으로 만들자 */public class Item29 { /* 기존 타입 중 제네릭이었어야 하는 게 있다면 제네릭 타입으로 변경하자. 제네릭 타입은 하위 버전의 Java에서 호환이 가능하기 때문에 기존 클래스를 제네릭 타입으로 바꾸더라도 원래 클래스를 사용하던 클라이언트에는 영향이 없다. 동시에 새로운 사용자는 훨씬 편하고 타입 안전하게 사용할 수 있다. */}//제네릭 배열 생성을 우회하는 방법 1class Item29GenericArray1 { private final E[] array; //제네릭 타입 배열로 형변환 //요소를 입력할 때 E 타입만 입..