티스토리 뷰

반응형

 

1. 다형성(polymorphism)

  • 하나의 객체가 여러 자료형 타입을 가질수 있는 것을 다형성(polymorphism)이라고 한다.
  • 부모클래스의 참조변수로 자식클래스 타입의 인스턴스를 참조할 수 있다.
  • 오버라이딩은 상속을 통해 '같은 이름의 메소드를 서로 다른 내용으로 구현'한다는 점에서 객체 지향의 다형성을 실현한다고 볼 수 있다.

 

참조변수의 다형성

 

  • 자바에서는 부모클래스의 참조변수로 자식클래스 타입의 인스턴스를 참조할수 있는데
    이때 참조 변수가 사용할 수 있는 멤버의 개수가 실제 인스턴스의 멤버 개수보다 같거나 적어야 가능하다.
  • 자식클래스의 참조변수로 부모클래스의 인스턴스를 참조할 수 없다.
    • 자식클래스에서 사용할 수 있는 멤버의 개수는 부모클래스와 같거나 많기 때문에 참조 할 수 없다.
class Parent { 
	... 
}

class Child extends Parent {
	... 
}

public class Ex01 {

    public static void main(String[] args) {
    
        Parent a = new Parent(); // 가능

        Child b = new Child();   // 가능

        Parent c = new Child();  // 가능

        Child d = new Parent();  // 오류. 자식클래스의 참조변수로 부모클래스 인스턴스 참조 불가

}

 

 

참조변수의 타입변환

 

  • 서로 상속 관계에 있는 클래스 사이에서만 타입변환을 할 수 있다.
  • 자식클래스에서 부모클래스로 타입변환(업캐스팅)생략가능하다.
  • 부모클래스에서 자식클래스로 타입변환(다운캐스팅)반드시 명시해야한다.

 

 

 

2. 업캐스팅(Upcasting)

  • 자식 클래스의 객체 주소부모클래스 타입으로 변환하는 것을 업캐스팅(upcastion)이라고 한다.
class Super {

	public void makeBing() {
		System.out.println("빙수 만들기");
	}
}

class Sub1 extends Super {

	public void 인절미토스트() {
		System.out.println("인절미 토스트 만들기");
	}

}

public class Ex02 {

	public static void main(String[] args) {

		Super store1 = new Super();
		store1.makeBing();
		
		Sub1 store2 = new Sub1();
		store2.makeBing();
		store2.인절미토스트();
		
		Super store3 = new Sub1();	//업캐스팅
		store3.makeBing();
		//store3.인절미토스트();	//컴파일 오류		

	}

}
  • 업캐스팅한 레퍼런스로는 객체 내에 모든 멤버에 접근할 수 없고 부모클래스의 멤버만 접근할 수 있다.
  • Sub1 객체가 Super 타입으로 업캐스팅되면, Super 타입의 객체로 취급되며 Sub1 클래스의 필드나 메소드는 접근할 수 없게 된다.

 

 

 

 

3. 다운캐스팅(DownCasting)

  • 업캐스팅과 반대로 캐스팅하는 것이다.
  • 다운캐스팅은 명시적으로 타입 변환을 지정해야한다.
class Super {

	public void makeBing() {
		System.out.println("빙수 만들기");
	}
}

class Sub1 extends Super {

	public void 인절미토스트() {
		System.out.println("인절미 토스트 만들기");
	}

}

class Sub2 extends Super{

	public void 떡볶이() {
		System.out.println("떡볶이 만들기");
	}
}

public class Ex03 {

	public static void main(String[] args) {

		Super store1 = new Super();
		store1.makeBing();
		
		Sub1 store2 = new Sub1();
		store2.makeBing();
		store2.인절미토스트();
		
		Sub2 store3 = new Sub2();
		store3.떡볶이();
		
		Super store4 = new Sub1();	//업캐스팅
		store4.makeBing();
		//store4.인절미토스트();	//컴파일 오류
		
		Super store5 = new Sub2();
		store5.makeBing();
		
		((Sub1)store4).인절미토스트(); //다운캐스팅. 명시적 타입변환
		//((Sub2)store4).makeBing();	// 컴파일오류. sub1을 sub2로 다운캐스팅할수 없음

	}

}
반응형

 

 

 

 

 

4. instance of연산자

  • 자바에서는 참조변수가 참조하고 있는 인스턴스가 어떤 클래스인지 구분하기 위해 instance of 연산자를 사용한다.
  • instanceof는 다음과 같이 사용된다.
참조변수 instanceof 클래스명
  • 왼쪽의 참조변수가 참조하고 있는 인스턴스 타입이 오른쪽의 클래스와 같으면 true를 반환하고,
    아니면 false를 반환한다.
  • 만약 참조변수가 null을 가리키면 false를 반환한다.

 

instance of 예제

 

class Parent { }

class Child extends Parent { }

class Brother extends Parent { }

 

public class Ex04 {

    public static void main(String[] args) {

        Parent a = new Parent();

        System.out.println(a instanceof Object); //a가 Object의 인스턴스인가? true

        System.out.println(a instanceof Parent); //a가 Parent의 인스턴스인가?  true

        System.out.println(a instanceof Child);  //a가 Child의 인스턴스인가? false

        System.out.println();

 

        Parent b = new Child(); //업캐스팅

        System.out.println(b instanceof Object); //b가 Object의 인스턴스인가? true

        System.out.println(b instanceof Parent); //b가 Parent의 인스턴스인가? true

        System.out.println(b instanceof Child);  //b가 Child의 인스턴스인가? true

    }

}

 

 

반응형
댓글
반응형
공지사항