본문 바로가기

개발 공부/Java58

Java에서 List 를 테스트해보자 테스트 코드를 작성하다보면 List 를 테스트할 상황이 많이 발생한다. 그 동안은 아무 생각없이 get을 사용해 테스트하는 방식을 주로 사용했다. @Test @DisplayName("List 테스트") void test20230629131424() { List testList = Arrays.asList("test1", "test2", "test3"); assertThat(testList.get(0)).isEqualTo("test1"); }개인적으로 위의 테스트 코드를 작성하며 여러가지 문제점을 겪었다. get 을 사용해 직접 값을 꺼내오기 때문에 List 안의 다른 값들을 테스트하려면 코드의 중복이 발생한다. 순서가 중요하지 않더라도 List 안의 값에 순서가 변경되면 테스트가 실패한다. 0과 같은 매.. 2023. 7. 6.
이펙티브 자바 아이템 33 - 타입 안전 이종 컨테이너를 고려하라 - 핵심 정리 / 완벽 공략 아이템 33 - 타입 안전 이종 컨테이너를 고려하라 - 핵심정리 / 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 타입 토큰을 사용한 타입 안전 이종 컨테이너 컨테이너란 다른 어떤 오브젝트를 넣을 수 있는 Set, Map 을 의미한다. 우리가 여태 사용한 제네릭은 오직 한 가지 타입 만 넣을 수 있는 컨테이너를 만드는 것이었다. public class Favorites { List value; public static void main(String[] args) { Favorites names = new Favorites(); names.value.add("TEST"); } } 경우에 따라서는 이종(동족이 아닌, 서로 다른타입) 컨테이너 가 .. 2022. 12. 20.
이펙티브 자바 아이템 32 - 제네릭과 가변인수를 함께 쓸 때는 신중하라 - 완벽 공략 아이템 32 - 제네릭과 가변인수를 함께 쓸 때는 신중하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. ThreadLocal ThreadLocal 은 쓰레드 지역, 쓰레드 범위의 변수이다. ThreadLocal 의 개념없이 여러 쓰레드에서 어떤 객체가 가지고 있는 멤버 변수를 사용한다면 쓰레드 안전성을 신경써서 코딩을 해야한다. 그렇지 않으면 경합 또는 경쟁조건 (Race-Condition) , 교착상태 (deadlock) , Livelock 등이 발생할 수 있다. ThreadLocal 을 사용하면 쓰레드 전용 지역 변수 를 만들어 문제를 해결할 수 있다. import java.text.SimpleDateFormat; public cla.. 2022. 12. 20.
이펙티브 자바 아이템 32 - 제네릭과 가변인수를 함께 쓸 때는 신중하라 - 핵심 정리 아이템 32 - 제네릭과 가변인수를 함께 쓸 때는 신중하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 가변인수 ... 는 매서드를 사용하는 클라이언트에서 파라미터를 몇개 보낼지 선택하는 것이다. // 제네릭 varargs 배열 매개변수에 값을 저장하는 것은 안전하지 않다. (191-192쪽) public class Dangerous { // 코드 32-1 제네릭과 varargs를 혼용하면 타입 안전성이 깨진다! (191-192쪽) static void dangerous(List... stringLists) { List intList = List.of(42); Object[] objects = stringLists; objects[0] .. 2022. 12. 19.
이펙티브 자바 아이템 31 - 한정적 와일드카드를 사용해 API 유연성을 높이라 - 완벽 공략 아이템 31 - 한정적 와일드카드를 사용해 API 유연성을 높이라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 타입 추론 타입 추론은 타입을 추론하는 컴파일러의 기능이다. 자바에서는 타입 추론을 여러가지 형태로 지원하고 버전이 올라가면서 지원하는 범위와 용도가 늘고 있다. public class BoxExample { private static void addBox(U u, List boxes) { Box box = new Box(); box.set(u); boxes.add(box); } private static void outputBoxes(List boxes) { int counter = 0; for (Box box: boxes) .. 2022. 12. 17.
이펙티브 자바 아이템 31 - 한정적 와일드카드를 사용해 API 유연성을 높이라 - 핵심 정리 아이템 31 - 한정적 와일드카드를 사용해 API 유연성을 높이라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. Chooser 와 Union API 개선 // 와일드카드 타입을 이용해 대량 작업을 수행하는 메서드를 포함한 제네릭 스택 (181-183쪽) public class Stack { private E[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; // 코드 29-3 배열을 사용한 코드를 제네릭으로 만드는 방법 1 (172쪽) // 배열 elements는 push(E)로 넘어온 E 인스턴스만 담는다. // 따라서 타입 안.. 2022. 12. 17.
이펙티브 자바 아이템 30 - 이왕이면 제네릭 메서드로 만들라 - 핵심 정리 아이템 30 - 이왕이면 제네릭 메서드로 만들라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 매개변수화 타입을 배개변수로 받는 메서드 자바에서 지원하는 모든 컬렉션들을 사용하는 메서드들의 경우에는 제네릭한 유틸리티 메서드로 만드는 경우가 많다. 실제로 자바에서 제공하는 Collections 같은 클래스는 모든 유틸리티성 메서드가 전부 제네릭 메서드이다. 제네릭 메서드로 만들면 제네릭을 활용하는 장점과 일치한다. 컴파일 타임에 타입 안정성을 보장 할 수 있다. // 제네릭 union 메서드와 테스트 프로그램 (177쪽) public class Union { // 코드 30-2 제네릭 메서드 (177쪽) public static Set un.. 2022. 12. 15.
이펙티브 자바 아이템 29 - 이왕이면 제네릭 타입으로 만들라 - 완벽 공략 아이템 29 - 이왕이면 제네릭 타입으로 만들라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 한정적 타입 매개변수 한정적 타입 매개변수는 제네릭 타입을 특정 타입으로 한정지을 수 있는 기능이다. public class Stack { private E[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; // 코드 29-3 배열을 사용한 코드를 제네릭으로 만드는 방법 1 (172쪽) // 배열 elements는 push(E)로 넘어온 E 인스턴스만 담는다. // 따라서 타입 안전성을 보장하지만, // 이 배열의 런타임 타입은 E[]가.. 2022. 12. 14.
이펙티브 자바 아이템 29 - 이왕이면 제네릭 타입으로 만들라 - 핵심 정리 아이템 29 - 이왕이면 제네릭 타입으로 만들라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 어떤 클래스들을 만들다보면 그 클래스 안에 다른 객체들을 담는 역활을 하는 클래스를 만드는 경우가 많다. 대표적으로 Stack 같이 자료구조 안에 다른 객체들을 담는 역활을 하는 클래스를 작성하는 경우이다. 무언가 다른것들을 담는 역활을 하는 클래스들은 제네릭 타입 으로 만들면 유용하다. 특히 그 안에 Object 타입으로 무언가를 담고있다면 더더욱 명확하게 제네릭 타입 을 사용하도록 유도하면 런 타임 시에 ClassCastException 이 발생하는 것을 많이 줄일 수 있다. public class Stack { private Object[].. 2022. 12. 13.
이펙티브 자바 아이템 28 - 배열보다는 리스트를 사용하라 - 완벽 공략 아이템 28 - 배열보다는 리스트를 사용하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. @SafeVarags Varags 는 가변인자이다. 매서드 매개변수로 불특정 다수를 받을 수 있는 인자이다. 여기에 제네릭을 썻을 때 복잡한 문제가 생기게 된다. 제네릭과 배열 은 잘 어울리지 않지만 같이 사용할 수 있는 유일한 경우의 수가 가변 인자 이다. class Main { public static void main(String[] args) { List[] stringLists = new ArrayList[1]; // 컴파일 에러 } } 위의 코드처럼 제네릭 타입의 배열을 만들 수 없다. public class SafeVaragsExampl.. 2022. 12. 12.
이펙티브 자바 아이템 28 - 배열보다는 리스트를 사용하라 - 핵심 정리 아이템 28 - 배열보다는 리스트를 사용하라 - 핵심 정리 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 배열과 리스트는 잘 어울리지 않는다. 배열은 공변(covariant), 제네릭은 불공변 공변은 같이 변한다 라는 뜻이다. public class IntegerToString { public static void main(String[] args) { // 공변 Object[] anything = new String[10]; anything[0] = 1; // 컴파일러가 못잡는 버그, 런타임 에러 발생 } } 배열은 상속 관계 에 따라 같이 변한다. 위의 코드에서 String 은 Object 를 상속하고 있다. 때문에 String 의 타입을 Objec.. 2022. 12. 12.
이펙티브 자바 아이템 27 - 비검사 경고를 제거하라 - 완벽 공략 아이템 27 - 비검사 경고를 제거하라 - 완벽 공략 이 글은 백기선 님의 이펙티브 자바 강의와 이펙티브 자바 3 / E 편을 참고하여 작성하였습니다. 에너테이션 @Documented public @interface MyAnnotation { } @Documented 을 붙여주면 해당 애노테이션을 사용한 자바 코드의 javadoc 을 만들 때 해당 애노테이션 정보가 포함된다. @Retention @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { } @Retention 은 해당 애노테이션의 정보를 언제까지 참조할 수 있게 할 것이냐에 대한 설정이다. 총 3가지가 있다. Runtime 기본값이며 가장 폭이 넓다. 애노테이션을 사용한 코.. 2022. 12. 9.