class SingletonClass {
private static SingletonClass Instance; //private한 Instance 객체를 static으로 생성
private SingletonClass() { //생성자 사용을 제한
Instance = new SingletonClass(); // 클래스 로딩중 생성
}
public static SingletonClass getInstance() { // public은 싱글톤 패턴의 규칙임
if(instance == null) instance = new SingletonClass;
return Instance;
}// 실제로 사용할 때 인스턴스를 생성하는 기법(Lazy Loading)
}
public class SingletonTest {
public static void main(String[] args) {
SingletonClass s1 = SingletonClass.getInstance();
SingletonClass s2 = SingletonClass.getInstance();
if(s1 == s2) System.out.println("같음");
}
}
다형성(Polymorphism)
- 하나의 객체가 많은 타입을 가질 수 있는 성질
- 상속 관계에 있을 때 조상 클래스의 타입으로 자식 클래스 객체를 참조할 수 있다.
public class ParentTest {
public static void main(String[] args) {
Object [] Obj = new Object[10];
Person [] P = new Person[10];
Obj[0] = new Person();
Obj[1] = new SpiderMan();
Obj[2] = 2; // Obj -> Inteager
P[0] = new Person();
P[1] = new SpiderMan();
}
}
class Person{
int n = 10;
}
class SpiderMan extends Person{
int n = 20;
}
- Object를 이용하여 배열을 간편하게 사용할 수 있음
- API에서 파라미터로 Object를 받는다는 것은 모든 객체를 처리하겠다는 뜻이다.(매개변수의 다형성)
public class AppropriateParameter {
public void useJump1(Object obj) {
if (obj instanceof Person casted) {
casted.jump();
}
}
public void useJump2(Person person) {
person.jump();
}
public void useJump3(SpiderMan spiderMan) {
spiderMan.jump();
}
public static void main(String[] args) {
Object obj = new Object();
Person person = new Person();
SpiderMan sman = new SpiderMan();
AppropriateParameter ap = new AppropriateParameter();
ap.useJump1(obj);
ap.useJump1(person);
ap.useJump1(sman);
System.out.println("=========================");
//ap.useJump2(obj); //에러 발생!
ap.useJump2(person);
ap.useJump2(sman);
System.out.println("========================");
//ap.useJump3(obj); // 에러 발생 !
//ap.useJump3(person); // 에러 발생!
ap.useJump3(sman);
// END
}
Person과 Spider는 상속 관계이다.
객체의 형변환
- 하위 타입에서 상위 타입으로 형변환 할 때는 묵시적 캐스팅이 가능하다
- 상위 타입을 하위 타입으로 형 변환 할 때는 명시적 캐스팅을 해야 한다
- 자손 타입의 객체를 조상 타입으로 참조? -> 형변환 필요 없음(자손의 조상정보가 메모리에 있음)
- Wrapper Class 들은 상속관계가 아니기 때문에 명시적 형변환이 필요
- 반대의 경우에는 메모리에 올라와있지가 않아 강제로 형 변환을 해도 자손 고유 메서드는 못씀