제네릭을 사용해야 할 때 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());
}
}
메모리 구조
- A 클래스는 new 될 시 A 클래스와 부모 클래스인 Object 클래스가 동시에 heap에 뜸
- Object를 받을 수 있는 메서드에 B 클래스를 받을 시, A의 name에는 B가 저장
- 이때, name의 타입은 B 클래스 형이 아닌 Object 형
- A.name에 B를 받았지만 타입은 Object형이기 때문에 B 클래스 내의 getName() 사용이 불가
- Downcasting이 필요
- A.name을 B 클래스 형으로 Downcasting함으로써 B 클래스에 접근 가능
- getName() 메서드 호출


3. Singleton : Object
- Singleton : 4. 접근 제어
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