1. 제네릭이란?
일반적으로 두루두루 쓰이는 프로그램. 다양한 종류의 데이터를 두루두루 처리할 수 있음. 여러가지 데이터 타입 관리 가능 > 사용하는 애가 데이터 타입을 결정함!
* 제네릭은 new할때 타입이 결정되기 때문에 new할 때만 제네릭 사용 가능
* 메인 시작 전에 타입이 결정되는 static엔 쓰지 못한다! (다만, object에는 사용 가능)
* <> 안에는 클래스(랩핑하라)만 받을 수 있다. (2. 제네릭 사용 예시에서 자세히 설명)
즉, 제네릭은 랩핑해서만 받는다. (int → Integer / double → Double)
2. 제네릭 사용법
class Box<T> : 제네릭 문법. < > 이거
클래스 안에서 사용되는 자료형(타입)을 구체적으로 명시하지 않고
T 등과 같이 기호로 적어놓는 것. 보통 T (대문자)라고 많이 씀
Box 클래스를 <T> 제네릭 시켜주고, main 메소드에서 new로 띄울 때! 사용하는 애가 데이터 타입을 결정함! (= 데이터 타입이 결정되는 시기는 new 했을 때)
제네릭을 사용해서 받았기 때문에 Box 객체는 String 타입도 되고, Integer 타입도 된다. (9, 10번 라인) 따라서, 해당 필드값을 지정할 때, 각 타입에 맞춰서 String과 Integer 타입으로 써줬다. (12, 13번 라인)
원시자료형은 받을 수 없으니 랩핑해서 쓸 것. (int 못씀. Integer)
why? <> 안에 클래스를 받기 때문! (인터페이스도 제네릭을 사용할 수 있다.)
3. Object 사용법 및 단점
제네릭을 사용하지 못할 때, 어쩔 수 없을때, 이것 말곤 방법이 없을때 사용한다. > 싱글톤 패턴이나, static을 가지고 떠야만 할 때.
static이니까 제네릭 못 받고 Object로 받음
Object = 최상위 객체. 모든 데이터 타입을 받을 수 있다.
<Object의 단점>
Dog와 Cat은 타입이 다르니 Object로 받았다. 그래서 단점이!!!
오브젝트가 speak 메소드를 들고 있지 않으니 메소드 호출이 불가하다는 단점이 발생!!!
그래서!!! 오브젝트 타입으로 메소드를 사용하려면 이렇게 형변환-다운캐스팅을 해줘야만 메소드를 사용할 수 있다는 번거로움이!!!
변수로 선언할 땐 오브젝트가 가능한데… 메소드는 다운캐스팅 하지 않는 한 불가!
4. Object 예시 (싱글톤 패턴) ✓ 이해못함
싱글톤 패턴 : 메모리에 딱 한번밖에 못 띄우니까 Object를 통해 다운캐스팅해서 사용 이렇게 2차 개발자 입장에서 객체를 못만들때 Object를 사용
package ex13.example4; //싱글톤 패턴 - Object class Model { private Object data; public void setData(Object data) { this.data = data; } public Object getData() { return data; } private static Model instance = new Model(); public static Model getInstance() { return instance; } private Model() { } } class User { public int id = 1; public String name = "홍길동"; public String email = "ssar@nate.com"; public void hello() { System.out.println("안녕하세요"); } } public class GenericEx04 { public static void main(String[] args) { Model m = Model.getInstance(); User u = new User(); m.setData(u); User ob = (User) m.getData(); // 다운캐스팅!!!!!!!! ob.hello(); } }
싱글톤 패턴이나 static은 Object 타입을 쓸 수밖에 없다
5. 제네릭 사용 예시 (제네릭 사용 가능하면 무조건 제네릭 써라!) ✓ 이해못함
package ex13.example5; class Model<T> { private T data; public void setData(T data) { this.data = data; } public T getData() { return data; } } class User { public int id = 1; public String name = "홍길동"; public String email = "ssar@nate.com"; public void hello() { System.out.println("안녕하세요"); } } public class GenericEx05 { public static void main(String[] args) { Model<User> m = new Model(); m.setData(new User()); User u = m.getData(); u.hello(); } }
Model<User> m = new Model<>();
= Model 클래스를 User 타입으로 사용한다
제네릭을 사용하면 User 클래스의 메소드 뿐만 아니라
필드값들을 자유롭게 이용할 수 있다.
[ 왜 제네릭인가 ]
- FileReader 클래스 : 파일을 읽어올 수 있음
Share article