티스토리 뷰
다형성
다형성은 같은 타입이지만, 실행 결과를 다양한 객체에서서 이용할 수 있는 성질을 뜻한다.
다형성은 객체 지향 프로그래밍에서 굉장히 중요한 성질 중 하나이다.
자바에서는 다형성을 보장하기 위해 타입 변환을 허용한다.
타입 변환
타입 변환은 총 두가지가 존재한다.
자동 타입 변환(Promotion), 강제 타입 변환 (Casting)
1. 자동 타입 변환(Promotion)
자동 타입 변환은 말그대로 프로그램 실행 도중 자동적으로 타입이 변환되는 것을 말한다.
자동 타입 변환은 보통 부모 타입에 자식 객체가 대입되는 것을 뜻한다.
자식은 부모의 특징과 기능을 상속 받았기 때문에 동일 취급 될 수 있다는 것이 자동 타입 변환의 개념이다.
<----자동타입 변환----
부모 클래스 변수 = 자식 클래스 타입;
자동 타입 변환된 클래스는 큰 특징이 있다.
바로 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다는 것이다.
변수는 자식 객체를 참조하지만 변수로 접근 가능한 멤버는 부모 클래스 멤버로 한정된다.
자동 타입 변환의 예외가 하나 있다.
다형성을 보장하기 위하여 메소드가 자식 클래스에서 오버라이딩 되었다면 자식 클래스의 메소드가 부모 클래스의 메소드 대신 호출된다.
다음은 자동 타입 변환의 예시이다.
Person.java
public class Person {
String name = "사람";
int age = 44;
public void method1() {
System.out.println("Person클래스의 method1입니다.");
}
public void method2() {
System.out.println("Person클래스의 method2입니다.");
}
}
Student.java
public class Student extends Person{
String name = "학생";
String school = "고등학교";
@Override
public void method2() {
System.out.println("Student클래스의 method2입니다.");
}
public void method3() {
System.out.println("Student클래스의 method3입니다.");
}
}
StudentEx.java
public class StudentEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person promotion = new Student(); //자동 타입 변환
System.out.println("name: "+promotion.name);
System.out.println("name: "+promotion.age);
// System.out.println("name: "+promotion.school); Error!!! (더 이상 student 필드 사용 불가)
promotion.method1();
promotion.method2(); //Student에서 method2를 오버라이딩 -> 자동타입 변환해도 오버라이딩 된 메소드 호출
// promotion.method3(); Error!!!!! (더 이상 student 메소드 사용 불가)
}
}
2. 강제 타입 변환 (Casting)
강제 타입 변환은 부모타입을 자식 타입으로 변환하는 것을 말한다.
하지만, 모든 부모 타입을 자식 클래스 타입으로 강제 변환할 수 있는 것은 아니다.
자식 타입이 부모 타입으로 자동변환 된 후, 그것을 자식 타입으로 다시 변환할 때만 사용가능하다.
<----------강제타입 변환------------
자식 클래스 변수 = (자식 클래스)부모 클래스 타입;
강제 타입 변환은 자식 타입이 부모 타입으로 자동변환 된 후, 그것을 자식 타입으로 다시 변환할 때만 사용가능하므로, 타입이 제대로 맞지 않으면 예외가 발생한다.
그러므로, 객체 타입을 확인 한후, 강제 타입 변환을 해야만 한다.
객체 타입을 확인할 때는 instanceof 연산자를 사용한다.
instanecof 연산자는 매개값을 타입을 조사할 때 쓰이는 연산자이다.
강제 타입 변환이 필요할 때는 반드시 매개값이 어떤 객체 인지 instanceof연산자로 확인하고 안전하게 강제 타입 변환을 해야한다.
instanceof 연산자는 다음과 같이 사용된다.
boolean result = 객체 instanceof 타입
객체가 해당 타입으로 변환 가능하면 result에는 true 값이 대입되고, 그렇지 않으면 false 값이 대입된다.
다음은 강제 타입 변환의 예시이다.
(Student 클래스와 Person 클래스는 위와 동일하다.)
public class StudentEx2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person casting = new Student(); //자동 타입 변환
//Student castingError = new Person(); //강제 타입 변환은 자동 타입 변환 후,다시 자식 클래스로 변환할 때만 사용가능
if(casting instanceof Student) {
Student castingSuccess = (Student) casting; //강제 타입 변환
//강제 타입 변환 성공!
System.out.println("name "+castingSuccess.name);
System.out.println("age "+castingSuccess.age);
System.out.println("school "+castingSuccess.school);
castingSuccess.method1();
castingSuccess.method2();
castingSuccess.method3();
}
else
System.out.println("Casting 오류!"); //강제 타입 실패
}
}
'JAVA' 카테고리의 다른 글
인터페이스(Interface) (0) | 2019.09.20 |
---|---|
추상클래스(Abstract Class) (0) | 2019.09.19 |
final 클래스와 메소드 (0) | 2019.09.17 |
상속(Inheritance) (0) | 2019.09.17 |
Getter와 Setter (0) | 2019.09.17 |