티스토리 뷰
Generic이란, 메소드에서 사용할 데이터 타입을 나중에 확정하는 기법이다.
메소드나 클래스를 선언할 때가 아니라, 인스턴스를 생성하거나 메소드를 호출할 떄, 즉 "사용할 때" 정한다는 의미이다.
Generic을 사용하면 type을 지정하기 때문에, casting 등을 통한 타입 변환이 필요 없어 프로그램 성능이 향상되는 효과를 얻을 수 있다.
예제를 통해 쉽게 알아보자.
Apple.java
package test.mypac;
public class Apple {
}
Orange.java
package test.mypac;
public class Orange {
}
Banana.java
package test.mypac;
public class Banana {
}
사과를 담을 FruitBox 클래스를 만들어보자.
FruitBox.java
package test.mypac;
public class FruitBox {
//필드
private Apple item;
//과일을 담는 메소드
public void push(Apple item) {
this.item = item;
}
//과일을 빼내는 메소드
public Apple pull() {
return item;
}
}
바나나와 오렌지를 담고 싶다면 다음 두가지 방법을 생각해 볼 수 있다.
1. 바나나를 담을 박스와 오렌지를 담을 박스, 총 두개의 클래스를 더 만들기
2. FruitBox에서 전달받는 매개변수 타입을 Object 타입으로 변경하기
1번의 경우, 과일의 갯수가 많으면 매우 번거로울 것이고, 2번의 경우 역시, Object 타입을 전달받는 다면 모든 타입이 들어갈 수 있겠지만 후에 casting을 해야하는 등의 불편함이 있을 것이다.
2번의 경우를 코드로 살펴보자.
FruitBox2.java
package test.mypac;
public class FruitBox2 {
private Object item;
//과일을 담는 메소드
public void push(Object item) {
this.item = item;
}
//과일을 빼내는 메소드
public Object pull() {
return item;
}
}
main()
FruitBox2 box = new FruitBox2();
box.push(new Apple());
Apple item = (Apple)box.pull();
push에는 Object 타입으로 되어 있어 모든 타입, 즉 Apple타입이 들어가는 모습을 확인할 수 있지만, pull() 메소드가 리턴한 값을 Apple에 넣고 싶다면 위와 같이 casting 해야 하는 모습을 확인할 수 있다.
하지만, Generic을 사용하면, 객체를 생성하고 지역변수에 담을 때, 지역변수의 < > 안에 type을 지정함으로써 원하는 타입의 객체를 받을 수 있고, casting이 불필요하다.
사과를 담을 박스를 만들고 싶다면 다음과 같이 코드를 작성할 수 있다.
FruitBox<Apple> box1 = new FruitBox<Apple>();
box1.push(new Apple());
Apple item1 = box1.pull();
마찬가지로 오렌지, 혹은 바나나를 담고 싶다면 아래와 같이 작성할 수 있다.
전체 코드
MainClass01.java
package test.main;
import test.mypac.Apple;
import test.mypac.FruitBox;
import test.mypac.FruitBox2;
import test.mypac.Orange;
public class MainClass01 {
public static void main(String[] args) {
FruitBox2 box = new FruitBox2();
box.push(new Apple());
Apple item = (Apple)box.pull();
FruitBox<Apple> box1 = new FruitBox<Apple>();
box1.push(new Apple());
//Orange 객체를 담을 FruitBox 객체를 생성해서 참조값을 box2라는 지역변수에 담아보세요.
FruitBox<Orange> box2 = new FruitBox<Orange>();
//box2에 Orange객체를 담아보세요.
box2.push(new Orange());
//Generic 클래스로 지정한 type 객체가 리턴된다.
Apple item1 = box1.pull();
Orange itme2 = box2.pull();
}
}
"객체 생성 시에는 Generic 클래스를 생략할 수 있다."
MainClass02.java
package test.main;
import java.util.List;
import test.mypac.Apple;
import test.mypac.Banana;
import test.mypac.FruitBox;
import test.mypac.Orange;
//ctrl + shift + o => 일괄 import 단축키
public class MainClass02 {
public static void main(String[] args) {
//객체를 생성할 때 Generic 클래스는 생략이 가능하다. (new 뒤에 <>)
FruitBox<Apple> box1 = new FruitBox<>();
FruitBox<Orange> box2 = new FruitBox<>();
FruitBox<Banana> box3 = new FruitBox<>();
List<Apple> list = null;
}
}
객체를 생성할 때는 Generic 클래스를 생략할 수 있는 모습을 확인할 수 있다.
★추가
Ctrl + Shilt + o는 일괄 import 단축키이다.
'WEB > Java BackEnd' 카테고리의 다른 글
[WEB-jsp/servlet] jsp에 jsp 삽입하기 (0) | 2021.11.24 |
---|---|
[WEB] DBcpBean(DataBase Connection Pool Bean) (0) | 2021.11.24 |
[WEB-jsp/servlet] jsp (0) | 2021.11.24 |
[WEB] Get, Post (0) | 2021.11.23 |
[WEB-jsp/servlet] 서블릿 Servlet / Get, web.xml, servlet.java (0) | 2021.11.23 |
- Total
- Today
- Yesterday
- 정렬
- 브루트 포스
- R
- baekjoon
- append
- python
- 장고
- 큐
- Case When
- jQuery
- 파이썬
- web
- 자바
- 단계별로풀어보기
- Django
- brute force
- html
- Java
- 스프링
- javascript
- 자바스크립트
- 백준
- jsp
- 프로그래머스
- 덱
- 고득점 키트
- 문자열
- bootstrap
- CSS
- Oracle
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |