티스토리 뷰
반응형
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
}
}
반응형
'JAVA' 카테고리의 다른 글
[Java] 인터페이스 (0) | 2022.04.06 |
---|---|
[Java] 추상클래스, 추상메소드 (0) | 2022.04.01 |
[Java] 상속(Inheritance) - (2)super, super(), 오버라이딩 (0) | 2022.03.30 |
[Java] 상속(Inheritance) - (1)상속 개념, 상속 특징 (0) | 2022.03.24 |
[Java] 메소드(methond)와 생성자(constructor) (0) | 2022.03.23 |
댓글
반응형
공지사항