다형성 = 상속 + 오버라이딩

Trilly·2023년 1월 16일
0

Java 잡아!

목록 보기
1/3
post-thumbnail

상속 Inharitance

상속이란 새로운 클래스를 정의 할 때 기존에 있던 클래스를 확장extends시켜서 만드는 것을 의미한다. 이때 상속하는 클래스를 상위 클래스(parent, base, super), 상속받는 클래스를 하위 클래스(child, derived, sub)라고 한다. 기호로는 아래와 같이 속이 빈 삼각형이 하위클래스에서 상위클래스로 가리키는 모양이다. 상위클래스는 일반적인 개념과 기능을, 하위 클래스는 구체적인 개념과 기능을 갖는다. 또한 자바는 단일 상속만 지원한다. (c++은 다중 상속 지원)
코드 재사용의 효과가 있으나, 단순히 코드를 재사용하는 목적으로는 쓰이지 않는다.

protected

클래스의 멤버 변수를 선언할 때 사용할 수 있는 예약어이다.다른 외부 클래스에서는 참조할 수 없지만 하위클래스에서는 사용가능하다. 패키지가 달라도 가능하다. 참고로 public, protected, (default), private 순으로 점점 숨어들어간다

제어자같은 클래스같은 패키지하위 클래스외부 클래스
publicOOOO
protectedOOOX
(default)OOXX
privateOXXX

상속 받은 하위 클래스의 생성과정

하위 클래스가 생성 될 때는 상위 클래스가 먼저 생성된다. 즉, 상위 클래스의 생성자가 호출되고 하위 클래스의 생성자가 호출 된다. 그러므로 하위 클래스의 생성자에는 반드시 상위 클래스의 생성자가 있어야한다. 만약 없다면 컴파일러에서 자동으로 super()을 추가한다. 단, 상위 클래스의 기본생성자가 없다면(매개변수만 있는 생성자만 존재) 하위 클래스는 명시적으로 상위 클래스의 생성자를 호출해야 한다.

super

상위 클래스를 가리키는 참조변수, super()는 상위 클래스의 기본 생성자를 의미한다.

메모리 상태

상위 클래스의 인스턴스가 먼저 생성되고, 하위 클래스의 인스턴스가 생성된다.

업캐스팅(Up Casting)

형변환(Casting): 변수 또는 상수의 타입을 다른 타입으로 변환 하는 것

int intNum = 1;
double doubleNum = intNum; // 업캐스팅
intNum = (int)doubleNum; // 다운캐스팅

변수형: 상위 클래스, 인스턴스: 하위 클래스
하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로 묵시적 형 변환이 가능하다.

하위 클래스의 생성자가 호출 되었으므로 인스턴스는 하위 클래스의 멤버 변수까지 모두 생성되었다. 하지만 이 경우 변수 vc는 상위 클래스의 멤버 변수와 메서드만 접근 가능하다.

오버라이딩(Overriding)

상위 클래스에서 정의된 메서드를 하위 클래스에서 달리 사용하고 싶으면 하위 클래스에서 동일한 이름의 메서드를 재정의 하는 것을 말한다. 재정의된 메서드라는 의미의 @Override 어노테이션을 사용한다.

<오버라이딩의 조건>
1. 선언부가 상위 클래스의 메서드와 일치해야한다.
2. 접근 제어자(access modifier)를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다. (protected -> public X)
3. 예외는 조상 클래스의 메서드보다 많이 선언 할 수 없다.

오버로딩(Overloading) vs. 오버라이딩(Overriding)

오버로딩(Overloading): 기존에 없는 새로운 메서드를 정의하는 것 (new)
오버라이딩(Overriding): 상속받은 메서드의 내용을 변경하는 것(change, modify)

class Parent {
	parentMethod() {}
}

class Child extends Parent {
	void parentMethod() {} // 오버라이딩
    void parentMethod(int i) {} // 오버로딩
    
    void childMethod() {}
    void childMethod(int i) {} // 오버로딩
}

형 변환과 오버라이딩 메서드 호출

아래 코드에서 Customer 은 상위클래스이자 변수형, VIPCustomer은 하위클래스이자 인스턴스이다.
calcPrice는 오버라이딩된 메서드이다.

Customer vc = new VIPCustomer();
vc.calcPrice(10000);

위 코드에서 CustomercalcPrice() 메서드가 호출 될 것인가, VIPCustomercalcPrice()메서드가 호출 될 것인가?
업캐스팅에서 살펴본대로라면, CustomercalcPrice() 메서드가 호출되야하는 것 같으나, 자바에서는 항상 인스턴스(VIPCustomer)의 메서드가 호출된다. 즉 하위 클래스에 오버라이딩된 메서드(부모 클래스 O, 자식 클래스 O)는 자식 클래스의 메서드가 호출된다. 하지만 당연하게도, 자식클래스에만 존재하는 메서드(부모 클래스 X, 자식 클래스 O)는 접근할 수 없다.

가상 메서드 (vertual method)

재정의 된 메서드는 다른 메서드 주소, 영역을 가지고 재정의 되지 않은 메서드는 당연하게도 같은 주소, 영역을 가진다.

다형성 (Polymorphism)

하나의 코드가 여러 자료형으로 구현되는 성질을 뜻한다. 같은 코드에서 여러 실행결과가 나온다. 객체지향 프로그래밍의 유연성, 재사용성, 유지보수성에 유리하고 각 자료형 마다 다른 메서드를 호출 할 필요가 없다. 같은 부모 클래스를 상속하고, 메서드 오버라이딩을 했기 때문에 각 자식 클래스 별로 다형성을 가질 수 있다.

상속 관계 vs. 포함(composition) 관계

class Car extends Vehicle { // Car 은 Vehicle을 상속 받았다.
	...
	Wheel wheel = new Wheel(); // Car 은 바퀴를 포함한다.
    ...
 }

상속: IS-A

일반적인(general) 개념과 구체적인(specific) 개념간 관계.
Car is a vehicle.

포함: HAS-A

한 클래스가 다른 클래스를 소유한 관계
Car has a wheel.

포함(Composition): 클래스 간의 포함관계를 맺는다는 것은 한 클래스의 멤버 변수로 다른 클래스 타입의 참조변수를 선언하는 것

다운 캐스팅(Down Casting)

업캐스티의 반대 개념. 업캐스팅된 인스턴스가 원래자료형(하위클래스)으로 변환되어야 할 때 다운캐스팅한다. 하위 클래스로의 형 변환은 명시적이다.

Customer vc = new VIPCustomer(); // 업캐스팅, 묵시적
VIPCustomer vCustomer = (VIPCustomer)vc; // 다운캐스팅, 명시적

Instanceof

다운캐스팅을 할 때는 오류 방지를 위해 인스턴스의 실제 타입을 체크해보는 것이 필수적이다. true/false를 반환하는 boolean 타입으로, 주로 조건문에 들어간다.

Animal hAnimal = new Human();
Animal tAnimal = new Tiger();

Human human = (Human)tAnimal // Tiger(Animal형)를 Human으로 캐스팅했다. 컴파일 에러가 나지 않는다.

if(hAnimal instanceof Human) {
	Human human = (Human)hAnimal;
}
profile
노력하는 삶을 즐기는 천재

0개의 댓글