본문 바로가기
프로그래밍 언어/Java

상속과 다형성

by 진진리 2023. 9. 18.
728x90

상속(Inheritance)

  • 클래스 B가 클래스 A를 상속받는다: extends 예약어 사용
class B extends A {
}

 

이때 상위 클래스에서 private로 선언한 변수를 하위 클래스에서 사용하고 싶은 경우: protected 예약어 사용

-> 외부 클래스에서 사용할 수 없지만 상속받은 하위 클래스에서는 public처럼 사용 가능!

 

private, protected 변수는 외부에서 사용하기 위해 클래스 내부에 따로 get, set 함수를 생성해둬야 함

 

하위 클래스 인스턴스가 생성될 때: 상위 클래스 생성자 호출 --> 하위 클래스 생성자 호출 순서!

 

  • 예약어 super
    • 하위 클래스에서 상위 클래스로 접근할 때 사용
    • super가 가지고 있는 값이 상위 클래스의 주소(참조 값)
      1. 상위 클래스의 생성자 호출: super();
      2. 상위 클래스의 매개변수가 있는 생성자 호출: super(매개변수1, ...);
      3. 상위 클래스의 멤버 변수나 메서드를 참조: super.메서드명();

 

 

  • 하위 클래스가 상위 클래스로: 묵시적 클래스 형 변환
상위클래스 인스턴스명 = new 하위클래스();

선언된 클래스형: 상위 클래스

생성된 인스턴스의 클래스형: 하위 클래스

-> 선언된 클래스형(상위 클래스)에 기반하여 멤버 변수와 메서드에 접근 가능

 


메서드 오버라이딩

 

  • 상위 클래스 메서드 재정의: 반환형, 메서드 이름, 매개변수 개수, 매개변수 자료형이 반드시 같아야 함

 

  • 묵시적 클래스 형 변환과 메서드 재정의
상위클래스 vc = new 하위클래스;
vc.재정의된_메서드();

어떤 메서드를 호출?  상위 클래스의 메서드가 아닌 하위 클래스에서 재정의된 메서드를 호출

재정의된 메서드가 있을 경우: 선언된 클래스형이 아닌 생성된 인스턴스의 메서드를 호출

-> 가상 메서드


다형성

하나의 코드가 여러 자료형으로 구현되어 실행되는 것

 

package polymorphism;

public class Animal {
    public void move() {
        System.out.println("동물이 움직입니다.");
    }
}

public class Human extends Animal {
    public void move() {
        System.out.println("사람이 두 발로 걷습니다.");
    }
}

public class Tiger extends Animal {
    public void move() {
        System.out.println("호랑이가 네 발로 뜁니다.");
    }
}

public class Eagle extends Animal{
    public void move() {
        System.out.println("독수리가 하늘을 납니다.");
    }
}

public class AnimalTest1 {
    public static void main(String[] args){
        AnimalTest1 aTest = new AnimalTest1();
        aTest.moveAnimal(new Human());
        aTest.moveAnimal(new Tiger());
        aTest.moveAnimal(new Eagle());
    }

    public void moveAnimal(Animal animal){
        animal.move();
    }
}

moveAnimal 메서드는 어떤 매개변수가 넘어와도 모두 Animal 형으로 변환됨

가상 메서드의 원리에 따라 animal.move()가 호출하는 메서드는 Animal의 move()가 아닌 넘어온 실제 인스턴스의 메서드


다운 캐스팅

상위 클래스로 형 변환되었던 하위 클래스를 다시 원래 자료형으로 형 변환하는 것

  • instanceof: 상위 클래스로 형 변환된 인스턴스의 원래 자료형을 확인하는 예약어
Animal hAnimal = new Humal();
if(hAnimal instanceof Human) {    // 원래 자료형이 Human형이라면
	Human human = (Human)hAnimal;    // 다운 캐스팅
}

 

'프로그래밍 언어 > Java' 카테고리의 다른 글

자료형 String  (0) 2023.09.21
ArrayList 클래스  (0) 2023.09.18
객체지향  (0) 2023.09.13
배열  (0) 2023.09.13
조건문과 반복문  (0) 2023.09.13