[자바 (JAVA)] 45. Object & Generic 기본

귤's avatar
Feb 18, 2025
[자바 (JAVA)] 45. Object & Generic 기본
💡
모든 클래스의 부모 (생략되어 있다)

1. Object 타입 일치

💡
타입 일치 instanceof (다운 캐스팅)
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) { // else if를 쓰면 위에 꺼가 정상일 때만 실행 함 Cat c = (Cat) u; System.out.println(c.name); } } public static void main(String[] args) { callName(new Dog()); callName(new Cat()); } }

2. Generic 기본기

💡
new 할 때 타입을 결정할 수 있다.
package ex17; class Box<T> { T data; // T의 타입은 new 할 때 타입이 결정 됨 / 안 정하면 오브젝트임 } public class Ge01 { public static void main(String[] args) { Box<String> b = new Box(); b.data = "Hello"; Box<Integer> i = new Box(); i.data = 10; } }

3. Object로 저장하든, Generic으로 저장하든 무슨 차이가 있는 거지??

💡
기본 자료형을 저장하는 것은 동일하다 (뭐든 써도 된다)
package ex17; class ACom<T> { void save(T data) { System.out.println(data + "이 저장되었습니다"); } } class BCom<T> { void save(Object data) { System.out.println(data + "이 저장되었습니다"); } } // 타입 일치? 동적 바인딩이 더 좋은거 아닌가? // 1. Object를 쓸 수 밖에 없는 경우 // 2. Generic을 써야 되는 경우 (무조건 제네릭으로 저장하는게 유리하다) public class Ob02 { public static void main(String[] args) { ACom<String> ac = new ACom(); ac.save("문자열"); BCom<String> bc = new BCom(); bc.save("문자열"); } }

4. 데이터 저장은 Generic은 무조건 유리하다

💡
new 할 수 있다면 Generic으로 설계할 수 있다.
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 f1 = new FCom(); f1.save(new Teacher()); Teacher t1 = (Teacher) f1.data; System.out.println(t1.getName()); KCom<Student> k1 = new KCom(); System.out.println(k1.data.getName()); } }

5. new할 수 없다면 Object로 저장

💡
기본 싱글 톤 패턴일 때 !!
✅ 미리 클래스를 메모리에 올려놔야 할 때, 무슨 타입이 들어올지 모르겠으면 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; } } //저장소 -> 한개만!! class Session { private static Session session = new Session(); private Session() { } public static Session getSession() { return session; } private Object attribute; // 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()); } }
notion image
Share article

gyul