일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 반복문
- 스프링 빈
- 코딩테스트
- 카카오
- JavaScript
- 문자열
- 자바
- 백준 java
- Kotlin
- Memoir
- 백준 javascript
- 고잉버스
- 프로그래머스
- 리눅스
- java 백준 1차원 배열
- map
- 자바스크립트 코딩의 기술
- 연습문제
- toCharArray
- 개발자 회고록
- 월간코드챌린지
- 리눅스마스터 3과목
- GoingBus
- 스프링 컨테이너
- Java
- 리눅스마스터1급
- 명령어
- 리눅스마스터 1급 정리
- Linux
- 코테
- Today
- Total
hoon's bLog
Java generic 자바 다양한 제네릭 표현 본문
안녕하세요.
이번 시간엔, 저번시간에 이어 제네릭에 대한 예제를 다양하게 알아보도록 하겠습니다.
타입 변수의 제한
제네릭은 'T'와 같은 타입 변수(type variable)를 사용하여 타입을 제한합니다.
이때 extends 키워드를 사용하면 타입 변수에 특정 타입만을 사용하도록 제한할 수 있습니다.
class AnimalList<T extends LandAnimal> { ... }
위와 같이 클래스의 타입 변수에 제한을 걸어 놓으면 클래스 내부에서 사용된 모든 타입 변수에 제한이 걸립니다.
이때 클래스가 아닌 인터페이스를 구현할 경우에도 implements 아닌, extends 사용해야만 합니다.
interface WarmBlood { ... }
...
class AnimalList<T extends WarmBlood> { ... } // implements 키워드를 사용해서는 안됨.
이건 저도 찾으면서 알게 된건데,
클래스와 인터페이스를 동시에 상속받고 구현해야 한다면 앰퍼센드(&) 기호를 사용하면 됩니다.
이렇게 구현한건 또 처음봅니다..ㅎㅎㅎ(실무에서도 잘 안쓰는듯...?)
class AnimalList<T extends LandAnimal & WarmBlood> { ... }
import java.util.*;
class LandAnimal { public void crying() { System.out.println("육지동물"); } }
class Cat extends LandAnimal { public void crying() { System.out.println("냐옹냐옹"); } }
class Dog extends LandAnimal { public void crying() { System.out.println("멍멍"); } }
class Sparrow { public void crying() { System.out.println("짹짹"); } }
class AnimalList<T extends LandAnimal> {
ArrayList<T> al = new ArrayList<T>();
void add(T animal) { al.add(animal); }
T get(int index) { return al.get(index); }
boolean remove(T animal) { return al.remove(animal); }
int size() { return al.size(); }
}
public class Generic02 {
public static void main(String[] args) {
AnimalList<LandAnimal> landAnimal = new AnimalList<>(); // Java SE 7부터 생략가능함.
landAnimal.add(new LandAnimal());
landAnimal.add(new Cat());
landAnimal.add(new Dog());
// landAnimal.add(new Sparrow()); // 오류가 발생함.
for (int i = 0; i < landAnimal.size() ; i++) {
landAnimal.get(i).crying();
}
}
}
//실행결과
//육지동물
//냐옹냐옹
//멍멍
위의 예제는 타입 변수의 다형성을 이용하여 AnimalList 클래스의 선언부에 명시한
'extends LandAnimal' 구문을 생략해도 제대로 동작합니다.
하지만 코드의 명확성을 위해서는 위와 같이 타입의 제한을 명시하는 편이 더 좋습니다.
제네릭 메서드(Generic Method)
다음은 제네릭 메서드 입니다.
제네릭 메서드란 메서드의 선언부에 타입 변수를 사용한 메소드를 의미합니다.
이때 타입 변수의 선언은 메서드 선언부에서 반환 타입 바로 앞에 위치합니다.
public static <T> void sort( ... ) { ... }
다음 예제의 제네릭 클래스에서 정의된 타입 변수 T와 제네릭 메소드에서 사용된 타입 변수 T는
전혀 별개의 것임을 주의해야 합니다.
class AnimalList<T> {
...
public static <T> void sort(List<T> list, Comparator<? super T> comp) {
...
}
...
}
와일드카드 사용
와일드카드(wild card)란 이름에 제한을 두지 않음을 표현하는 데 사용되는 기호를 의미합니다.
자바의 제네릭에서는 물음표(?) 기호를 사용하여 이러한 와일드카드를 사용할 수 있습니다.
<?> // 타입 변수에 모든 타입을 사용할 수 있음.
<? extends T> // T 타입과 T 타입을 상속받는 자손 클래스 타입만을 사용할 수 있음.
<? super T> // T 타입과 T 타입이 상속받은 조상 클래스 타입만을 사용할 수 있음.
음...
역시 이렇게만 봐서는 잘 모르겠죠?ㅎㅎㅎ
다음 예제는 클래스 메서드(static method)인 cryingAnimalList() 메소드의 매개변수의 타입을
와일드카드를 사용하여 제한하는 예제입니다.
import java.util.*;
class LandAnimal { public void crying() { System.out.println("육지동물"); } }
class Cat extends LandAnimal { public void crying() { System.out.println("냐옹냐옹"); } }
class Dog extends LandAnimal { public void crying() { System.out.println("멍멍"); } }
class Sparrow { public void crying() { System.out.println("짹짹"); } }
class AnimalList<T> {
ArrayList<T> al = new ArrayList<T>();
public static void cryingAnimalList(AnimalList<? extends LandAnimal> al) {
LandAnimal la = al.get(0);
la.crying();
}
void add(T animal) { al.add(animal); }
T get(int index) { return al.get(index); }
boolean remove(T animal) { return al.remove(animal); }
int size() { return al.size(); }
}
public class Generic03 {
public static void main(String[] args) {
AnimalList<Cat> catList = new AnimalList<Cat>();
catList.add(new Cat());
AnimalList<Dog> dogList = new AnimalList<Dog>();
dogList.add(new Dog());
AnimalList.cryingAnimalList(catList);
AnimalList.cryingAnimalList(dogList);
}
}
//실행결과
//냐옹냐옹
//멍멍
이렇게 장장 두번(?)의 포스팅으로 제네릭 설명을 마치겠습니다.
역시 코딩을 직접 했을 때, 머릿 속에도 잘 남고, 눈에도 잘 익는 것 같습니다 ㅎㅎㅎ
그럼, 오늘도 수고하셨습니다:)
'IT > Java' 카테고리의 다른 글
Java Stack, Queue Collection Class, 자바 큐 스택 선언 및 생성 (0) | 2023.07.31 |
---|---|
Java List Collection Class 자바 리스트 컬렉션 클래스 (2) | 2023.07.28 |
Java Generic 자바 제네릭 선언 및 생성 (0) | 2021.01.11 |
Java Wrapper class 자바 래퍼클래스 (0) | 2021.01.06 |
Java String class 자바 스트링 클래스 (0) | 2021.01.06 |