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