일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
31 |
Tags
- ubuntu 패스워드
- 스키마 설계
- char to int
- Spring
- Spring MVC
- RestControllerAdvice
- git workflow
- root passwd
- git 설정
- http 응답코드
- 배열 탐색
- 리눅스 사용권한
- 자료구조
- set-version
- ubuntu
- file i/o
- O(log n)
- ubuntu passwd
- 탐욕 알고리즘
- Java
- AOP
- JAVA 재귀함수
- N:N
- REST HTTP API
- Spring 예외처리
- 코드스테이츠
- mapstruct
- 함수형 인터페이스
- 스키마 디자인
- custom exception
Archives
- Today
- Total
개발소설
[JAVA] 제네릭 (Generic) 본문
제네릭(Generic)
- 타입을 구체적으로 지정하는 것이 아니라, 추후에 지정 할 수 있도록 일반화 해두는것 - Generic(일반적인)
- 클래스 또는 메서드가 특정 데이터 타입에 얾매이지 않도록 해둔것
제네릭 클래스
class Basket <T>{ // 제네릭 클래스, T라는 타입 매겨변수 선언, 임의의 문자로 지정가능 T,K,V (Type, Key, Value) 등 사용
private T item;
// static T item; // 클래스 변수에는 사용 불가 - 클래스 변수의 타입이 인스턴스 별로 달라 지게 된다.
// 클래스 변수는 공통적으로 사용해야 하는데 인스턴스별로 타입을 다르게 생성하면 같은 타입이 아니게 된다.
public Basket(T item) {
this.item = item;
}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
// 제네릭 클래스 인스턴스화
Basket<String> basket1 = new Basket<String>("Ipad"); // String으로 생성
Basket<Integer> basket2 = new Basket<Integer>(340); // Interger로 생성
// 타입 매개변수에 치환될 타입으로 기본 타입 사용 불가
// int -> Integer, double -> Double (래퍼클래스 사용)
// getter
System.out.println(basket1.getItem()); // Ipad
System.out.println(basket2.getItem()); // 340
// setter
basket1.setItem("Galaxy Tab");
System.out.println(basket1.getItem()); // Galaxy Tab
/*
Ipad
340
Galaxy Tab
*/
제한된 제네릭
- extends로 지정한 클래스의 하위 클래스들만 인스턴스 가능
- 인터페이스도 가능, 인터페이스를 구현한 클래스들만 인스턴스
- 다형성 적용 가능, 하위 클래스의 객체의 타입을 사용 할 수 있다.
class LimitBasket <T extends Phone>{ // 제한된 제네릭, 인스턴스화 할때 Phone의 하위 클래스만 지정 가능
// 인터페이스도 가능 구현한 클래스만 사용가능
// 특정클래스를 상속받으면서 인터페이스를 구현한 클래스 타입도 지정 가능
// <T extend 부모클래스명 & 인터페이스명>
private T item;
public LimitBasket(T item) {
this.item = item;
}
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
class Phone{ }
class Iphone extends Phone{}
class Ipad{}
Basket<Phone> phoneBasket = new Basket<>(new Iphone());
phoneBasket.setItem(new Iphone()); // Phone의 자식 클래스 이므로 다형성 가능
// phoneBasket.setItem(new Galaxy()); // Phone과 아무사이도 아니기 때문에 에러
// 제한된 클래스 사용
LimitBasket<Phone> phoneLimitBasket = new LimitBasket<>(new Phone()); // Phone 자신
LimitBasket<Iphone> iphoneLimitBasket = new LimitBasket<>(new Iphone()); // Phone의 자식클래스
//LimitBasket<Galaxy> galaxyLimitBasket = new LimitBasket<new Galaxy>(); // 에러 Phone의 자식클래스가 아님
제네릭 메서드
- 메서드 타입 미지정 가능
- 제네릭 클래스와 제네릭 메서드의 매개변수는 서로 다른값
- 제네릭 메서드는 static 사용 가능
class GenericMethod<T>{ // 1. 제네릭 클래스의 타입 매개변수
private T result;
public GenericMethod(T result) {
this.result = result;
}
public T getNum() {
return result;
}
public void setNum(T result) {
this.result = result;
}
public <T> void print(T element){ // 2. 제네릭 메소드의 타입 매겨변수, 1과 2는 서로 다르다.
System.out.println(element);
//System.out.println(element.length()); // 타입이 지정안됬기 때문에 특정클래스 메서드 사용 불가
}
public static <T> void print2(T elemnet){ // 제네릭 메서드는 static 사용가능
System.out.println("static 메서드");
}
}
GenericMethod<String> genericMethod = new GenericMethod<>("test");
genericMethod.<Integer>print(123); // 제네릭 메서드
genericMethod.print(1234); // 타입 지정 생략 가능
/*
123
1234
*/
와일드카드
- 어떠한 타입으로도 대체될 수 있는 타입 피라미터
<? extends T> // 상한 제한, T와 T를 상속받는 하위 클래스 타입만 타입 피라미터로 사용
<? super T> // 하한 제한, T와 T의 상위 클래스 타입만 타입 피라미터로 사용
<?> // <? extends Object> 와 같다.
** 래퍼 클래스
- 8개의 기본 타입에 해당하는 데이터를 객체로 포장해 주는 클래스를 래퍼 클래스(Wrapper class)
기본 타입래퍼 | 래퍼 클래스 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
'자바' 카테고리의 다른 글
[JAVA] 람다 (Lambda) (0) | 2023.03.08 |
---|---|
[JAVA] 애너테이션 (Annotation) (0) | 2023.03.08 |
[JAVA] 컬렉션 프레임 워크 (Collection Framework) (0) | 2023.03.08 |
[JAVA] 예외 처리(Exception Handling) (0) | 2023.03.07 |
[JAVA] 열거형(enum) (0) | 2023.03.07 |
Comments