Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 인프런
- 자바의정석
- 스프링MVC
- Spring
- Secure Coding
- 제네릭
- 불친절한SQL프로그래밍
- 계층 쿼리
- docker
- JPA
- 불친절한 SQL 프로그래밍
- 이것이자바다
- 김영한
- 스프링 핵심원리
- 분석함수
- 서블릿
- java
- 스프링
- inflearn
- 스프링입문
- REGEXP_SUBSTR
- 자바의정석 연습문제
- 자바공부
- Java의정석
- 시큐어코딩
- Numpy
- 스프링 부트와 JPA
- 자바연습문제
- DispatcherServlet
- Python
Archives
- Today
- Total
Continuous Challenge
[이것이 자바다] 제네릭 타입 본문
728x90
728x90
제네릭 타입은 결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.
public class 클래스명<A, B, ...> {...}
public interface 인터페이스명<A, B, ...> {...}
제네릭 타입은 선언부에 '<>' 부호가 붙고 그 사이에 타입 파라미터들이 위치한다.
타입 파라미터는 변수명과 동일한 규칙에 따라 작성할 수 있지만 일반적으로 대문자 알파벳 한 글자로 표현한다.
외부에서 제네릭 타입을 사용하려면 타입 파라미터에 구체적인 타입을 지정해야 한다. 만약 지정하지 않으면 Object 타입이 암묵적으로 사용된다.
클래스에서의 사용 예제
//제네릭 타입
public class Product<K, M> {
//필드
private K kind;
private M model;
//메소드
public K getKind() { return this.kind; }
public M getModel() { return this.model; }
public void setKind(K kind) { this.kind = kind; }
public void setModel(M model) { this.model = model; }
}
타입 파라미터를 사용하는 이유는 Product에 다양한 종류와 모델 제품을 저장하기 위해서이다.
public class Tv {
}
public class Car {
}
public class GenericExample {
public static void main(String[] args) {
//K는 Tv로 대체, M은 String으로 대체
Product<Tv, String> product1 = new Product<>();
//Setter 매개값은 반드시 Tv와 String을 제공
product1.setKind(new Tv());
product1.setModel("스마트Tv");
//Getter 리턴값은 Tv와 String이 됨
Tv tv = product1.getKind();
String tvModel = product1.getModel();
//------------------------------------------------------------------------
//K는 Car로 대체, M은 String으로 대체
Product<Car, String> product2 = new Product<>();
//Setter 매개값은 반드시 Car와 String을 제공
product2.setKind(new Car());
product2.setModel("SUV자동차");
//Getter 리턴값은 Car와 String이 됨
Car car = product2.getKind();
String carModel = product2.getModel();
}
}
인터페이스에서의 사용 예제
public interface Rentable<P> { //타입 파라미터 P 정의
P rent(); //타입 파라미터 P를 리턴 타입으로 사용
}
다양한 대상을 렌트하기 위해 rent() 메소드의 리턴 타입을 타입 파라미터로 선언한다.
public class Home {
public void turnOnLight() {
System.out.println("전등을 켭니다.");
}
}
public class Car {
public void run() {
System.out.println("자동차가 달립니다.");
}
}
public class HomeAgency implements Rentable<Home> {
@Override
public Home rent() {
return new Home();
}
}
public class CarAgency implements Rentable<Car>{
@Override
public Car rent() {
return new Car();
}
}
HomeAgency와 CarAgency는 집과 자동차를 렌트해주는 대리점 클래스이다. 타입 파라미터를 각각 Home과 Car로 대체하였다.
public class GenericExample {
public static void main(String[] args) {
HomeAgency homeAgency = new HomeAgency();
Home home = homeAgency.rent();
home.turnOnLight();
CarAgency carAgency = new CarAgency();
Car car = carAgency.rent();
car.run();
}
}
전등을 켭니다.
자동차가 달립니다.
타입 파라미터의 Object 메소드 호출
public class Box<T> {
public T content;
//Box의 내용물이 같은지 비교
public boolean compare(Box<T> other) {
boolean result = content.equals(other.content);
return result;
}
}
타입 파라미터는 기본적으로 Object 타입으로 간주되므로 Object가 가지고 있는 메소드를 호출할 수 있다.
위 예제에서는 Box의 내용물을 비교하기 위해 타입 파라미터로 Object의 equals() 메소드를 호출한다.
public class GenericExample {
public static void main(String[] args) {
Box box1 = new Box();
box1.content = "100";
Box box2 = new Box();
box2.content = "100";
Box box3 = new Box();
box3.content = 100;
boolean result1 = box1.compare(box2);
System.out.println("result1: " + result1);
boolean result2 = box1.compare(box3);
System.out.println("result2: " + result2);
}
}
result1: true
result2: false
728x90
728x90
'Study > 이것이 자바다' 카테고리의 다른 글
[이것이 자바다] 와일드카드 타입 파라미터 (0) | 2023.04.03 |
---|---|
[이것이 자바다] 제한된 타입 파라미터 (0) | 2023.04.03 |
[이것이 자바다] 제네릭 메소드 (0) | 2023.04.03 |
[이것이 자바다] 제네릭이란? (0) | 2023.03.15 |
[이것이 자바다] 문자열 클래스 (String, StringBuilder, StringBuffer) (0) | 2023.03.08 |
Comments