[Java] 상속과 다형성 2

C____JIN·2022년 6월 23일
0

Java

목록 보기
5/9
post-thumbnail

다형성

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

다형성 테스트

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

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

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

public class AnimalTest {
	public static void main(String[] args) {
        AnimalTest aTest = new AnimalTest();
        aTest.moveAnimal(new Human());
        aTest.moveAnimal(new Tiger());
    }
    
    public void moveAnimal(Animal animal) {
    	animal.move();
	}
}
  • 결과
    사람이 두 발로 걷습니다.
    호랑이가 네 발로 뜁니다.

상속은 언제 사용할까?

  • IS-A 관계 : 일반적인 개념과 구체적인 개념의 관계
    ex) 사람포유류 이다.

    상속은 IS-A 관계에서 사용하는 것이 가장 효율적

  • HS-A 관계 : 한 클래스가 다른 클래스를 소유한 관계
    ex) 모든 학생전공과목을 가지고 있다.


다운 캐스팅과 instanceof

다운캐스팅이란?

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

Animal hAnimal = new Human();
if(hAnimal instanceof Human) {
	Human human = (Human)hAnimal;
}
  • hAnimal은 원래 Human형으로 생성 되었는데, Animal형으로 형변환됨

  • instanceof 예약어를 통해서 왼쪽에 있는 변수의 원래 인스턴스형이 오른쪽 클래스 자료형인가를 확인

  • 그 후 Human human = (Human)hAnimal;문장을 통해 명시적으로 형 변환

    • 상위 클래스로는 묵시적으로 형 변환이 되지만, 하위 클래스로 형변환할 때는 명시적으로 해야함

    주의)

    Animal ani = new Tiger();
    Human h = (Human)ani;
    • 컴파일 오류는 발생하지 않지만, 코드를 실행 할 때 오류 발생
      이유) TigerHuman과 상속 관계가 아니기 때문에
profile
개발 블로그🌐 개발일지💻

0개의 댓글