[JAVA] 48. Object & Generic 기본기

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

1. 타입일치

💡
타입 일치. 다운캐스팅과 instance of
package ex17; class Dog { String name = "강아지"; } class Cat { String name = "고양이"; } public class Ex01 { static void callName(Object u) { if (u instanceof Dog) { Dog d = (Dog) u; //(다운캐스팅) System.out.println(d.name); } else if (u instanceof Cat) { Cat c = (Cat) u; //(다운캐스팅) System.out.println(c.name); } } public static void main(String[] args) { callName(new Dog()); callName(new Cat()); } }

2. 제네릭 기본기

💡
객체를 새로 만들 때(new) 타입을 결정 할 수 있다.
package ex17; class Box<T> { T data; // T 정의 안하면 Object 타입 } public class Ge01 { public static void main(String[] args) { Box<String> b = new Box(); b.data = "hello"; System.out.println(b.data); Box<Integer> i = new Box(); // new Box<Interger>(); = new Box에 <Interger> 는 생략 가능 i.data = 10; System.out.println(i.data); } }

3. 오브젝트로 저장과 제네릭으로 저장의 차이점은?

💡
오브젝트를 저장 할 때는 저장이 편하지만 출력을 할 때에 다운 캐스팅을 해야하기 때문에 출력이 불편하다.
제네릭저장 할 때에 조금 불편하지만 출력 할 때에 매우 편리하기 때문에 제네릭이 유용하다.
package ex17; class Teache 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 Teache()); Teache t1 = (Teache) f1.data; System.out.println(t1.getName()); KCom<Student> k1 = new KCom(); k1.save(new Student()); System.out.println(k1.data.getName()); } }
 

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

💡
객체 생성이 가능하다
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를 쓸 수 밖에 없는 경우 // 클래스를 저장할 떄에 Object를 쓰면 instanceof을 사용해야해서 복잡해짐 //2.제네릭을 써야 되는 경우 = 무조건 제네릭으로 저장하는게 유리 public class Ob02 { public static void main(String[] args) { ACom<String> ac = new ACom(); ac.save("문자열"); BCom bc = new BCom(); bc.save("문자열"); } }
 

5. 객체 생성을 할 수 없다면 오브젝트로 저장

💡
가령 싱글톤 패턴일 때
미리 클래스를 메모리에 생성해야 할 때, 무슨 타입이 들어올지 모르겠으면 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; // 속성 = 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()); } }

6. 메서드 활용

Share article

YunSeolAn