[이것이 자바다] 상속 (Chapter. 7)

hhyeong_0·2023년 9월 9일
0
post-thumbnail

Super()

: 부모의 기본 생성자를 호출하는 메소드

부모 클래스를 상속받은 자식 클래스를 생성할 시에 부모 객체가 먼저 생성된 다음에 자식 객체가 생성된다.
이러한 흐름이 가능한 이유는 자식 생성자가 실행될때 컴파일 과정에서 부모의 기본 생성자를 호출하는 super()이 자동으로 추가되기 때문 !
=> Super()은 부모의 "기본" 생성자를 호출하기 때문에
부모 클래스에 기본 생성자가 없고 매개변수를 갖는 생성자만 있다면 super(매개값, ...) 코드를 직접 넣어야한다.


메소드 오버라이딩

: 상속된 메소드를 자식 클래스에서 재정의하는 것

메소드 오버라이딩 시 주의해야하는 규칙

  • 부모 메소드의 선언부(리턴 타입, 메소드 이름, 매개변수)와 동일해야 한다.
  • 접근 제한을 더 강하게 오버라이딩할 수 없다. (public -> private으로 변경 불가)
  • 새로운 예외를 throw할 수 없다.
public class Calculator {
    public double areaCircle(double r) {
    	System.out.println("Calculator 객체의 areaCircle() 실행");
    	return 3.14159 * r * r; 
    }
}
public class Computer extends Calculator {
	@Override // 컴파일 시 정확히 오버라이딩이 되었는지 체크해줌 (생략 가능)
    public double areaCircle(double r) { 
        System.out.println("Computer 객체의 areaCircle() 실행");
    	return PI * r * r; 
    }
}
Calculator cal = new Calculator();
Computer comp = new Computer();
System.out.println(cal.areaCircle(10);
System.out.println(comp.areaCircle(10);
>>> 
Calculator 객체의 areaCircle() 실행
314.159
Computer 객체의 areaCircle() 실행
314.1592653589793

메소드 재정의

: 메소드를 재정의하면, 부모 메소드는 숨겨지고 자식 메소드만 사용되기 때문에 비록 부모 메소드의 일부만 변경된다 하더라도 중복된 내용을 자식 메소드도 가지고 있어야한다.

이러한 중복된 내용을 해결하기 방법 !
: "super.부모클래스의 메소드명()" 을 사용하면 숨겨진 부모 메소드를 호출하여 해결할 수 있다.
=> 부모 메소드를 재사용함으로써 자식 메소드의 중복된 작업 내용을 없애는 효과를 얻을 수 있음!

public class Airplane {
    public void fly() { System.out.println("일반 비행합니다.");
}
public class SupersonicAirplane extends Airplane {
	public static final int NORMAL = 1;
	public static final int SUPERSONIC = 2;	
    
    public int flyMode = NORMAL;
    
    @Override
    public void fly() { 
   		if(flyMode == SUPERSONIC) { 
    		System.out.println("초음속 비행합니다.");
    	} else {
        	super.fly();
        }
   }
}
SupersonicAirplane sa = new SupersonicAirplane();
sa.fly();
sa.flyMode = SupersonicAirplane.SUPERSONIC;
sa.fly();
sa.flyMode = SupersonicAirplane.NORMAL;
sa.fly();
>>>
일반 비행합니다.
초음속 비행합니다.
일반 비행합니다.

final 클래스와 final 메소드

final 클래스와 final 메소드는 상속과 관련이 있다.

  • 클래스를 선언할때 final 키워드를 class 앞에 붙이면 최종적인 클래스이므로 더 이상 상속할 수 없는 클래스가 된다.
    => 즉, final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다.
  • 메소드를 선언할 때 final 키워드를 붙이면 이 메소드는 최종적인 메소드이므로 오버라이딩할 수 없는 메소드가 된다.

자동 타입 변환

자동 타입 변환은 다음과 같은 조건에서 일어난다.

부모타입 변수 = 자식타입객체

자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다.
따라서 아래와 같은 케이스가 가능하다.

class Animal{...} 
class Cat extends Animal{...}

Cat cat = new Cat();
Animal animal = cat;
( = Animal animal = new Cat(); )
  • 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 가능하다.
  • 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.

강제 타입 변환 (캐스팅)

: 자식 타입은 부모 타입으로 자동 변환되지만, 반대로 부모 타입은 자식 타입으로 자동 변환되지 않는다.
대신 다음과 같이 캐스팅 연산자로 강제 타입 변환(Casting)을 할 수 있다.

자식타입 변수 = (자식타입) 부모타입객체;
  • 그렇다고해서 부모 타입 객체를 무조건 강제 변환할 수 있는 것은 아니다 !
    자식 객체가 부모 타입으로 자동 변환된 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.

다형성

: 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질

다형성 구현을 위해서는 자동 타입 변환과 메소드 재정의(메소드 오버라이딩)가 필요하다.

  • 필드의 다형성

    필드 타입은 동일하지만(사용 방법은 동일하지만), 대입되는 객체가 달라져 실행결과가 다양하게 나올 수 있는 것
    Ex. 메소드 재정의(오버라이딩)
  • 매개변수의 다형성

    메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할 때 동일한 타입의 객체를 제공하는 것이 정석이지만 자식 객체를 제공할 수 있는데 여기서 다형성 발생






참조:
이것이 자바다 교육 현장에서 가장 많이 쓰이는 JAVA 프로그래밍의 기본서 [ 개정판 ] - 신용권, 임경균 저 | 한빛미디어

profile
배우고 기록하자 !

0개의 댓글