[JAVA] 55. Object & Generic 기본기

서회정's avatar
Feb 18, 2025
[JAVA] 55. Object & Generic 기본기

💡
모든 클래스의 부모 (생략되어 있다)

1. Object 타입 일치

package ex17; class Dog { String name = "강아지"; } class Cat { String name = "고양이"; } public class Ob01 { static void callName(Object u) { if (u instanceof Dog) { // instanceof =>u가 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=>Type의 약자 뭐든 적어도 상관무 T data; } public class Ge01 { public static void main(String[] args) { Box<String> b = new Box(); //객체가 만들어지면서 타입이 결정됨 - 제네릭 b.data = "Hello"; Box<Integer> i = new Box<Integer>(); //new 뒤에 있는 제네릭은 생략가능 i.data = 10; } }

3. 오브젝트와 제네릭 저장, 무슨차이일까?

⇒ 무엇이든 사용가능
package ex17; // A회사가 단순히 데이터를 저장하는 프로그램을 만든다. 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(); ac.save("문자열"); } }

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 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()); } }

5. new할 수 없다면, 오브젝트로 저장

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

clubnerdy