제네릭, 오브젝트

Jan 04, 2024
제네릭, 오브젝트
 

1. 제네릭(Generic)

 
💡
클래스를 정의할 때, 클래스 안에서 사용되는 자료형을 구체적으로 명시하지 않고 다양한 데이터를 처리할 수 있는 방법
 
class 클래스명 <영어 대문자> { 영어대문자 변수명 } class Box<T> { T data; }
 
클래스에 <대문자> 를 사용하면 변수 타입을 정하지 않아도 사용할 수 있다.
 
class Box<T> { T data; } public class GenericEx01 { public static void main(String[] args) { Box<String> box1 = new Box(); Box<Integer> box2 = new Box(); box1.data = "1"; box2.data = 1; } }
 
제네릭을 사용하면 new 할 때 자료형이 정해진다.
 
 

2. 오브젝트(Object) vs 제네릭

 
💡
다형성을 이용하면, 모든 객체는 Object 타입형으로 처리할 수 있다.
 
class Box { private Object data; public void set(Object data) { this.data = data; } public Object get() { return data; } } public class Generic5 { public static void main(String[] args) { Box b = new Box(); b1.set(1); int i = b1.get(); } }
 
자료형을 Object 로 처리했다. set 메서드를 통해 변수를 입력받고 get 메서드를 통해 값을 리턴한다.
변수형은 사용자가 메인 메서드에서 정할 수 있다.
notion image
 
하지만 Object 를 사용하면 문제가 있다. Object 값을 저장할 때 오류가 발생한다. 리턴되는 값이 Object 형이기 때문에 사용할 int 나 String 보다 더 큰 자료형이기 때문이다. 그래서 다운캐스팅을 사용해서 값을 저장해야 한다.
 
int i = (Integer) b1.get(); // Object 형을 Integer 형으로 다운캐스팅
 
notion image
 
 
 
이때 제네릭을 이용하면 문제를 쉽게 해결할 수 있다.
 
class Box<T> { private T data; public void set(T data) { this.data = data; } public T get() { return data; } } public class Generic5 { public static void main(String[] args) { Box<String> b1 = new Box(); b1.set("hello"); int i = b1.get(); } }
 
같은 코드를 제네릭을 이용해 만들었다. Object 를 대문자 T로 자료형을 변경했다.
제네릭을 이용해면 객체를 생성할 때 타입을 정할 수 있다.
 
 
notion image
 
정수형을 사용하기 원한다면 int 가 아니라 Integer 를 이용하면 된다.
Box<Integer> b1 = new Box();
notion image
 
Share article

{CODE-RYU};