제네릭

Jan 28, 2024
제네릭

1. 제네릭이란?

일반적으로 두루두루 쓰이는 프로그램. 다양한 종류의 데이터를 두루두루 처리할 수 있음. 여러가지 데이터 타입 관리 가능 > 사용하는 애가 데이터 타입을 결정함!
💡
* 제네릭은 new할때 타입이 결정되기 때문에 new할 때만 제네릭 사용 가능
* 메인 시작 전에 타입이 결정되는 static엔 쓰지 못한다! (다만, object에는 사용 가능)
* <> 안에는 클래스(랩핑하라)만 받을 수 있다. (2. 제네릭 사용 예시에서 자세히 설명)
💡
즉, 제네릭은 랩핑해서만 받는다. (int → Integer / double → Double)
 

2. 제네릭 사용법

💡
class Box<T> : 제네릭 문법. < > 이거 클래스 안에서 사용되는 자료형(타입)을 구체적으로 명시하지 않고 T 등과 같이 기호로 적어놓는 것. 보통 T (대문자)라고 많이 씀
notion image
Box 클래스를 <T> 제네릭 시켜주고, main 메소드에서 new로 띄울 때! 사용하는 애가 데이터 타입을 결정함! (= 데이터 타입이 결정되는 시기는 new 했을 때)
제네릭을 사용해서 받았기 때문에 Box 객체는 String 타입도 되고, Integer 타입도 된다. (9, 10번 라인) 따라서, 해당 필드값을 지정할 때, 각 타입에 맞춰서 String과 Integer 타입으로 써줬다. (12, 13번 라인)
💡
원시자료형은 받을 수 없으니 랩핑해서 쓸 것. (int 못씀. Integer) why? <> 안에 클래스를 받기 때문! (인터페이스도 제네릭을 사용할 수 있다.)
 

3. Object 사용법 및 단점

제네릭을 사용하지 못할 때, 어쩔 수 없을때, 이것 말곤 방법이 없을때 사용한다. > 싱글톤 패턴이나, static을 가지고 떠야만 할 때.
notion image
static이니까 제네릭 못 받고 Object로 받음
💡
Object = 최상위 객체. 모든 데이터 타입을 받을 수 있다.
 

<Object의 단점>

notion image
Dog와 Cat은 타입이 다르니 Object로 받았다. 그래서 단점이!!!
notion image
오브젝트가 speak 메소드를 들고 있지 않으니 메소드 호출이 불가하다는 단점이 발생!!!
notion image
그래서!!! 오브젝트 타입으로 메소드를 사용하려면 이렇게 형변환-다운캐스팅을 해줘야만 메소드를 사용할 수 있다는 번거로움이!!!
💡
변수로 선언할 땐 오브젝트가 가능한데… 메소드는 다운캐스팅 하지 않는 한 불가!
 

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 타입을 쓸 수밖에 없다
 
notion image
 

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(); } }
notion image
💡
Model<User> m = new Model<>(); = Model 클래스를 User 타입으로 사용한다 제네릭을 사용하면 User 클래스의 메소드 뿐만 아니라 필드값들을 자유롭게 이용할 수 있다.
 

[ 왜 제네릭인가 ]

notion image
 
 

 
  • FileReader 클래스 : 파일을 읽어올 수 있음
 
Share article

codingb