[JAVA] 53. Object vs Generic

문정준's avatar
Feb 18, 2025
[JAVA] 53. Object vs Generic
제네릭을 사용해야 할 때 vs Object를 사용해야 할 때
 

1. Generic = Object?

  • 아래 예시에서는 제네릭과 오브젝트를 동일하게 사용 가능
package ex17; class ACom<T> { void save(T data) { System.out.println(data + "가 저장되었습니다."); } } class BCom { void save(Object data) { System.out.println(data + "가 저장되었습니다."); } } // 동적 바인딩 vs 타입 일치 // 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("문자열"); } }
 

2. Generic > Object

Object 형이 클래스를 받으면, 무조건 Downcasting이 필요
  • 클래스 종류가 다양해지면, Downcasting 해야 할 경우가 증가, 코드 길어짐
그에 반해 Generic은 new할 때 타입을 정할 수 있으므로 편리 > Object보다 유리
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; } } // 왜 제네릭이 유리한가? : Downcasting 불필요 public class Ge02 { public static void main(String[] args) { FCom f1 = new FCom(); f1.save(new Teacher()); Teacher t1 = (Teacher) f1.data; System.out.println(t1.getName()); KCom<Student> k1 = new KCom(); k1.save(new Student()); System.out.println(k1.data.getName()); } }
 

메모리 구조

  1. A 클래스는 new 될 시 A 클래스와 부모 클래스인 Object 클래스가 동시에 heap에 뜸
  1. Object를 받을 수 있는 메서드에 B 클래스를 받을 시, A의 name에는 B가 저장
      • 이때, name의 타입은 B 클래스 형이 아닌 Object 형
  1. A.name에 B를 받았지만 타입은 Object형이기 때문에 B 클래스 내의 getName() 사용이 불가
      • Downcasting이 필요
  1. A.name을 B 클래스 형으로 Downcasting함으로써 B 클래스에 접근 가능
  1. getName() 메서드 호출
notion image
notion image

3. Singleton : Object

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; } } // 싱글톤(Singleton, 유일객체)의 경우 // 제네릭을 사용할 경우 new가 불가능 : 타입 설정 불가능 // Object로만 지정 가능함 class Session { private static Session session = new Session(); // Singleton private Session() { } public static Session getSession() { return session; } private Object attribute; // 속성 : Property 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()); } }
Singleton과 같이 유일 객체로 선언되어 new 할 수 없을 경우
  • 제네릭 클래스로는 타입 선언 불가
  • Object로만 받을 수 있음 (Downcasting)
Share article

sxias