모든 클래스의 부모 (생략되어 있다)
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());
    }
}

Share article