모든 클래스의 부모(생략됨)
1. 기본기
1. 타입 일치
Object로 타입 일치 → instance of 로 데이터 확인 → 다운캐스팅해서 사용
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) {
Cat d = (Cat) u;
System.out.println(d.name);
}
}
public static void main(String[] args) {
CallName(new Dog());
CallName(new Cat());
}
}
2. 제네릭 기본기
new 할 때 타입을 결정할 수 있다.
package ex17;
// T를 정하지 않으면 부모타입으로 정해짐
class Box<T> {
T data;
}
public class Ge01 {
public static void main(String[] args) {
// new 할때 <>사용해 타입을 결정!
Box<Integer> b = new Box();
b.data = 10;
Box<String> i = new Box();
i.data = "Hello";
}
}
3. 오브젝트 or 제네릭. 어떤 방식으로 저장하든 무슨 차이가 있지?
기본 자료형 데이터를 찾을 때는 데이터를 찾는 과정이 비슷하다.
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를 쓸수밖에 없는 경우
// 2. 제네릭을 써야되는 경우(무조건 제네릭으로 저장하는게 유리하다)
public class Ob02 {
public static void main(String[] args) {
ACom<String> ac = new ACom();
ac.save("가능하죠");
BCom bc = new BCom();
bc.save(123);
}
}

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 fc = new FCom();
fc.save(new Teacher());
Teacher t1 = (Teacher) fc.data;
System.out.println(t1.getName());
KCom<Student> kc = new KCom();
kc.save(new Student());
System.out.println(kc.data.getName());
}
}
5. new 할 수 없다면 오브젝트로 저장해야한다.
가령 싱글톤 패턴일때!
미리 클래스를 메모리에 올려놔야 할 때
무슨 타입이 들어올지 모르겠으면 오브젝트 타입으로 저장한다.
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;
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