DEV/Java

[java] java 다형성, 슈퍼/서브(부모/자식) 클래스 형변환

Bi3a 2023. 7. 26. 07:25

목차
반응형

java 다형성, 슈퍼/서브(부모/자식) 클래스 형변환
java 기초 깨부시기

 


 

다형성(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개(먹기, 자기, 몸무게 조회)를 가지고 있다.
java
닫기
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개(자기) 

java
닫기
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;
}
}
java
닫기
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

java
닫기
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

 

 

반응형