generic
-
제네릭 - Item 31. 한정적 와일드카드를 사용해 API 유연성을 높이라Study/Effective Java 2023. 1. 10. 15:36
한정적 와일드카드를 사용해 API 유연성을 높이라 한정적 와일드카드 사용의 필요성 매개변수화 타입은 불공변이다. 즉, 서로 다른 타입 Type1과 Type2가 있을 때 List은 List의 하위 타입도 상위 타입도 아니다. 예를 들어, List은 List의 하위 타입이 아니다. 그 이유는 List이 List가 하는 일을 제대로 수행하지 못하기 때문이다. 이는 리스코프 치환원칙을 위배한다. 이렇게 매개변수화 타입은 불공변이지만, 때로는 유연하게 API를 설계해야 하는 상황이 있다. 대표적으로 public API를 설계할 때 필요하다. 한정적 와일드카드를 사용하지 않은 경우(1) - pushAll() public class Stack { private List list = new ArrayList(); pu..
-
제네릭 - item 30. 이왕이면 제네릭 메서드로 만들라Study/Effective Java 2023. 1. 5. 17:43
이왕이면 제네릭 메서드로 만들라 제네릭 메서드 public static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; } 클래스와 마찬가지로, 메서드도 제네릭으로 만들 수 있다. 제네릭 메서드 작성법은 제네릭 타입 작성법과 비슷하다. 위 메서드는 두 집합의 합집합을 반환하는 문제가 있는 메서드이다. 위 메서드는 컴파일은 되지만, 문제가 있는 메서드이다. 경고를 없애려면 이 메서드를 타입 안전하게 만들어야 한다. 메서드 선언에서의 세 집합(입력 2개, 반환 1개)의 원소 타입을 타입 매개변수로 명시하고, 메서드 안에서도 이 타입 매개변수만 사용하게 수정하면 된다. public static ..
-
제네릭 - 아이템 29. 이왕이면 제네릭 타입으로 만들라Study/Effective Java 2023. 1. 5. 14:07
이왕이면 제네릭 타입으로 만들라 제네릭 타입의 필요성 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) { throw new EmptyStackException(); } Object result = elements[--si..
-
Java - 제네릭(Generic)의 제한 - extends, super, ?Language/Java 2022. 12. 28. 14:57
제네릭(Generic)의 제한 - extends, super, ? 개요 이전 게시글에서는 제네릭의 가장 일반적인 사용법과 특성에 대해서 알아보았다. 예를 들어, 타입을 T라고 하고 외부에서 Integer로 지정하면 T는 Integer가 되고, String으로 지정하면 T는 String이 된다. 만약, Student 클래스를 만들고 T를 Student를 지정한다면 T는 Student가 된다. 즉, 제네릭은 이 처럼 참조 타입 모두가 될 수 있다. 만약, 이러한 T를 특정 범위 내로 좁혀서 제한하고 싶다면 어떻게 해야 할까? 이때 필요한 것이 바로 extends, super, ?이다. extends와 super이라는 키워드는 많이 보았을 것이다. ?는 와일드카드라고 해서 쉽게 말해 알 수 없는 타입이라는 의..
-
Java - 제네릭(Generic)의 특성Language/Java 2022. 12. 28. 09:50
제네릭(Generic)의 특성 복수의 제네릭 사용 class EmployeeInfo { public int rank; EmployeeInfo(int rank) { this.rank = rank }; } class Person { public T info; public S id; Person (T info, S id) { this.info = info; this.id = id; } } public class GenericDemo { public static void main(String[] args) { Person p = new Person(new EmployeeInfo(1), 1); } } 클래스 내에서는 여러 개의 제네릭을 필요로 하는 경우가 있을 것이다. 위 코드는 이러한 경우의 예이다. 위 코드는..
-
Java - 제네릭(Generic)을 사용하는 이유Language/Java 2022. 12. 27. 17:26
제네릭(Generic)을 사용하는 이유 제네릭을 사용하지 않을 경우의 문제점 - 타입 안전성 class StudentInfo { public int grade; public StudentInfo(int grade) { this.grade = grade; } } class StudentPerson { public StudentInfo studentInfo; public StudentPerson(StudentInfo studentInfo) { this.studentInfo = studentInfo; } } class EmployeeInfo { public int rank; public EmployeeInfo(int rank) { this.rank = rank; } } class EmployeePerson {..