나 java봐랏 7일차(상속과 다형성)

김혜성·2021년 7월 22일
0

나 java봐랏

목록 보기
7/7

"Inheritance"

상속과 다형성

상속을 통해서 다형성 구현 가능

프로그램의 유연성, 간결성, 유지보수의 유용성 등에 대한 그런 내용!

상속: 클래스를 정의할 때 이미 구현된 클래스를 상속(inheritance)받아서 속성이나 기능이 확장되는 클래스를 구현함

  • 상속하는 클래스: 상위 클래스, parent class, base class, super class

    일반적인 의미(포유류)

  • 상속받는 클래스: 하위 클래스, child class, derived class, subclass

    구체적인 의미(인간)

  • 클래스 상속 문법
class B extends A {

}

상속 ≠ 재사용

상속(is-a) ≠ 합성(has-a)

13:29 고객관리 프로그램 코드 참고

  • protected: 상속관계에서만 public, 외부관계에서는 private으로 보이도록 함

    패키지가 달라도 상속관계라면 public

    참고!

하위 클래스 생성시 상위 클래스가 먼저 생성됨

  • this: 자기 자신의 주소 가르킴
  • super: 자신의 상위 클래스의 주소를 가르킴(상위 클래스의 default constructor)
    • 모든 클래스의 최상위 클래스는 Object()
    • super()만 쓰면 상위클래스의 default constructor
    • 만약 상위클래스의 생성자를 따로 명시했다면 그에 맞는 인수를 super()안에 표기해야함

업캐스팅

: 상위 클래스로의 묵시적 형 변환

  • 상위 클래스 형으로 변수 선언 후 하위 클래스 인스턴스 생성 가능

  • 하위 클래스는 상위 클래스의 타입 내포하기에 가능함

    Customer vc = new VIPCustomer();
    //상위클래스형 = 하위클래스형 인스턴스

    이 경우 메모리는 하위클래스까지 다 할당되지만 타입이 상위클래스이기에 하위클래스에서 추가된 메소드는 사용 못하고 상위클래스의 메소드까지만 사용가능(VIP 전용 메소드 이용 불가)

오버라이딩과 다형성

오버라이딩

상위클래스에 존재하는 메소드를 수정하거나 추가하기 위해서 하위클래스에서 메소드를 재정의하는 행위이다

가상메소드

앞에서 소개한 업캐스팅을 사용하는 경우 하위클래스형의 인스턴스를 상위클래스의 타입으로 생성할 수 있었다. 이 때 만약 메소드 중에서 하위클래스에서 재정의한(오버라이딩한) 메소드가 있다면 해당하는 메소드는 상위클래스이 아닌 하위클래스의 재정의된 메소드가 실행된다

다형성

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

  • 객체지향 프로그래밍의 유연성, 재활용성, 유지보수성에 중요한 역할
  • 같은 이름이지만 재정의되어 기능이 조금 다른 메소드(Animal코드 참고)
public class AnimalTest {
	public static void main(String[] args) {
		
		AnimalTest test = new AnimalTest();
		test.moveAnimal(new Human());
		test.moveAnimal(new Tiger());
		test.moveAnimal(new Eagle());
		//이렇게 표현도 되고
		//Animal animal = new Human();
		//이런식으로도 되고
		//이처럼 다양하게 표현할 수 있다는 점이 다형성이다
	}
	
	public void moveAnimal(Animal animal) {
		animal.move();
	}
	
}

디컴파일 과정

  1. cmd에서 cd로 java project 파일 경로 중 bin으로 이동
  2. jdk/bin을 path로 설정(path C:\Program Files\Java\jdk-10.0\bin)
  3. 다시 java project의 bin으로 이동
  4. javaP -verbose inheritance.VIPCustomer >a.out
  5. a.out이라는 out파일이 생성됨

Annotation

마우스 오른쪽 클릭 → source → override

@override로 주석과 함께 재정의할 메소드 생성됨

단순한 주석이 아니라 컴파일시 오버라이드 됨을 알려줌

다형성 활용과 다운캐스팅

casting == 형변환

다운캐스팅: 자신의 고유한 특성을 잃은 서브 클래스의 객체를 다시 복구 시켜주는 것

: instance of

하위클래스 → 상위클래스 형변환은 묵시적

but

상위클래스 → 하위클래스는 명시적으로 다운캐스팅이 필요!

  • 업캐스팅을 하고 다시 다운캐스팅을 하는 것은 권장되는 방법은 아님!
  • 가능하면 override로 처리하기!

ex) 독수리라는 클래스에서 상위인 동물 클래스로 업캐스팅을 했는데, fly라는 독수리의 메소드를 쓰고 싶을 경우 다시 독수리 클래스로 다운캐스팅해주어야 함

profile
똘멩이

0개의 댓글