[JAVA] 17. 제네릭 & Wrapper & 컬렉션 & 오브젝트 Ⅰ. Object & Generic 기본기

최재원's avatar
Feb 18, 2025
[JAVA] 17. 제네릭 & Wrapper & 컬렉션 & 오브젝트 Ⅰ. Object & Generic 기본기
모든 클래스의 부모(생략됨)

1. 기본기

1. 타입 일치

Object로 타입 일치 → instance of 로 데이터 확인 → 다운캐스팅해서 사용
package ex17; class Dog { String name = "강아지"; } class Cat { String name = "고양이"; } public class Ob01 { static void CallName(Object u) { if (u instanceof Dog) { Dog d = (Dog) u; System.out.println(d.name); } else if (u instanceof Cat) { Cat d = (Cat) u; System.out.println(d.name); } } public static void main(String[] args) { CallName(new Dog()); CallName(new Cat()); } }

2. 제네릭 기본기

new 할 때 타입을 결정할 수 있다.
package ex17; // T를 정하지 않으면 부모타입으로 정해짐 class Box<T> { T data; } public class Ge01 { public static void main(String[] args) { // new 할때 <>사용해 타입을 결정! Box<Integer> b = new Box(); b.data = 10; Box<String> i = new Box(); i.data = "Hello"; } }

3. 오브젝트 or 제네릭. 어떤 방식으로 저장하든 무슨 차이가 있지?

기본 자료형 데이터를 찾을 때는 데이터를 찾는 과정이 비슷하다.
package ex17; class ACom<T> { void save(T data) { System.out.println(data + "가 저장되었습니다."); } } class BCom { void save(Object data) { System.out.println(data + "가 저장되었습니다."); } } // 타입일치? -> 동적바인딩이 더 좋은게 아닌가? // 1. Object를 쓸수밖에 없는 경우 // 2. 제네릭을 써야되는 경우(무조건 제네릭으로 저장하는게 유리하다) public class Ob02 { public static void main(String[] args) { ACom<String> ac = new ACom(); ac.save("가능하죠"); BCom bc = new BCom(); bc.save(123); } }
notion image

4. 데이터 저장은 제네릭이 무조건 유리하다

메서드를 사용해 데이터를 찾을 때
new할 수 있다면!!
package ex17; class Teacher extends Object { private String name = "선생님"; public String getName() { return name; } } class Student extends Object { private String name = "학생"; public String getName() { return name; } } class FCom { Object data; void save(Object u) { data = u; } } class KCom<T> { T data; void save(T u) { data = u; } } // 왜 제네릭이 유리한가? -> 다운캐스팅을 안해도 되니까 public class Ge02 { public static void main(String[] args) { FCom fc = new FCom(); fc.save(new Teacher()); Teacher t1 = (Teacher) fc.data; System.out.println(t1.getName()); KCom<Student> kc = new KCom(); kc.save(new Student()); System.out.println(kc.data.getName()); } }

5. new 할 수 없다면 오브젝트로 저장해야한다.

가령 싱글톤 패턴일때!
미리 클래스를 메모리에 올려놔야 할 때
무슨 타입이 들어올지 모르겠으면 오브젝트 타입으로 저장한다.
package ex17; class Banana extends Object { private String name = "바나나"; public String getName() { return name; } } class Apple extends Object { private String name = "사과"; public String getName() { return name; } } // 저장소 -> 한개만!! class Session { // 싱글톤으로 생성 private static Session session = new Session(); private Session() { } public static Session getSession() { return session; } private Object attribute; public void setAttribute(Object attribute) { this.attribute = attribute; } public Object getAttribute() { return attribute; } } public class Ob03 { public static void main(String[] args) { Session session = Session.getSession(); session.setAttribute(new Banana()); Banana ob = (Banana) session.getAttribute(); System.out.println(ob.getName()); } }
Share article

jjack1