
다형성(Polymorphism)
Java에서 제공하는 기능으로 슈퍼(부모) 클래스를 상속받은 서브 클래스의 객체가
슈퍼 클래스의 객체로도 사용되고 서브 클래스의 객체로도 사용되는 등
다양한 형태를 취할 수 있는 것이다.
상속 : is - a(~는 ~이다) 관계
ex) 그는 사람이다 (He is a Person) : "man 클래스의 객체 He"는 "Person 클래스의 일개 사람 p1"이다.
→ java 클래스 선언 및 상속 관계 : Class Man extends Person
슈퍼/서브(부모/자식) 클래스 형변환
따라서, java에서는 서브 클래스의 타입의 객체는 → 슈퍼 클래스 타입의 객체가 될 수 있다.
ex) 그는 사람이다 (He is a Person)
반대로, 슈퍼 클래스 타입의 객체는 서브 클래스의 타입의 객체가 될 수 없다.
* 정확히 말하면 슈퍼 클래스의 객체 타입을 서브 클래스 타입으로 형변환 시에는 명시적 형변환이 필요
ex) 사람은 그이다 (Person is him (x))
코드 작성
부모 클래스 Person
변수 2개(이름, 몸무게) / 메소드 2개(먹기, 자기, 몸무게 조회)를 가지고 있다.
class Person { String name; int weight; //생성자 정의, 메소드 오버로딩 Person(String name, int weight){ this.name = name; this.weight = weight; } Person(String name) { this.name = name; } Person(){} // 메소드 정의 void eat(){ System.out.println(this.name + " eats / + 1 weight"); this.weight += 1; } void sleep(){ System.out.println(this.name + " sleeps / - 1 weight"); this.weight -= 1; } void showWeight(){ System.out.println("Name / Weight : " + this.name + " / " + this.weight); } }
자식 클래스 Student, Workman
자식 클래스 Student : 변수 3개(이름, 몸무게, 학생번호) / 추가, 오버라이딩된 메소드 2개(먹기, 공부하기)
자식 클래스 Workman : 변수 3개(이름, 몸무게, 일련번호) / 오버라이딩된 메소드 1개(자기)
class Student extends Person{ int stuno; Student(String name, int weight, int stuno){ /* super class의 생성자를 활용한 sub class 생성자 정의 */ super(name, weight); /* Person(String name, int weight) {this.name = name; this.weight = weight;} */ this.stuno = stuno; } Student(){} @Override void eat() { /* 메소드 오버라이딩 : 서브 클래스에서 슈퍼 클래스의 메소드를 재정의, 서브 클래스의 메소드가 우선 */ super.eat(); System.out.println("student eats more! / + 1 weight"); this.weight += 1; } void study(){ System.out.println(this.name + " studies hard / - 1 weight"); this.weight -= 1; } }
class Workman extends Person{ int workno; Workman(String name, int weight, int workno){ /* 상속 클래스에서 super을 활용한 생성자 정의 */ super(name, weight); this.workno = workno; } Workman(){} @Override void sleep() { super.sleep(); System.out.println("workman is extremely tired.. / -1 weight"); this.weight -= 1; } }
main
public class Polytest { public static void main(String[] args) { Person p1 = new Student("Choi", 43, 21); /* 서브 클래스의 객체는 슈퍼 클래스의 객체가 될 수 있다. */ // Student p2 = new Person(); * 오류 : 슈퍼 클래스의 객체는 서브 클래스의 객체가 될 수 없다. Student s1 = (Student) p1; /* 슈퍼 클래스의 객체타입을 다시 서브 클래스 타입으로 형변환 */ p1.eat(); /* 오버라이딩된 메소드의 경우는 인스턴스의 메소드가 호출 */ p1.sleep(); /* 오버라이딩된 메소드의 경우는 인스턴스의 메소드가 호출 */ // p1.study(); /* 오류 : Student 타입에서는 가지고 있으나, 오버라이딩된 메소드가 아닌 경우는 호출 불가 */ Person people[] = {new Student(), new Workman()}; /* 배열로 슈퍼 클래스가 서브 클래스 객체 참조 가능 */\ } }
★ 주의할 점
1. 슈퍼 클래스 객체 타입으로 선언된 서브 클래스 인스턴스는 서브 클래스에서만 존재하는 메서드 호출 불가
→ 슈퍼 클래스의 객체 타입이기 때문
2. 슈퍼 클래스의 객체 타입을 서브 클래스 타입으로 형변환하려면 명시적 형변환이 필요하다. // ln 5
3. 슈퍼 클래스의 메소드를 오버라이딩한 인스턴스의 메서드는 호출 가능
→ java의 모든 메소드는 가상 메서드이기 때문 + 오버라이딩한 메소드는 기존 오리지널 슈퍼클래스와 별도로
주소값이 새롭게 매핑되므로 호출 가능
같이 보기 좋은 포스팅들
[java] 접근 제어자의 이해와 구현 예제(Access Modifier)
접근 제어자의 이해접근 제어자란?선언한 클래스와 클래스의 멤버(변수와 메서드 등)에 대해 외부에서 접근할 수 있는 범위를 제어하는 키워드입니다.객체 지향에서의 정보 은닉을 목적으로 각
doinitright.tistory.com
[java] java 객체의 직렬화와 역직렬화 (Serialization / Deserialization)
직렬화(Serialization) / 역직렬화(Deserialization) 1) 정의 : 객체를 바이트 배열의 데이터 타입으로 전송 가능한 형태로 만들어 전송하는 것을 의미한다. * 객체는 바이트 형
doinitright.tistory.com
[java] java 상속과 오버라이딩
오버로딩에 이어 Person이라는 클래스를 정의하였다. - 구성 변수 2개 (이름 / String, 체중 / name) - 메서드 2개(eat : 먹는 행위를 정의, sleep : 자는 행위를 정의) 1. 상속의 정의 : 어떤 클래스 A가 가
doinitright.tistory.com
'DEV > Java' 카테고리의 다른 글
[java] java 접근 제어자 final, static, private (0) | 2023.07.27 |
---|---|
[java] 접근 제어자의 이해와 구현 예제(Access Modifier) (0) | 2023.07.26 |
[java] java 상속과 오버라이딩 (0) | 2023.07.25 |
[java] java 클래스 정의, 객체의 생성 및 생성자 활용 (0) | 2023.07.24 |
IntelliJ 단축키 모음(윈도우) (0) | 2023.07.20 |