Notice
Recent Posts
Recent Comments
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

SYDev

[혼자 공부하는 자바] Chapter 7. 상속 본문

Programming Lang/Java

[혼자 공부하는 자바] Chapter 7. 상속

시데브 2025. 1. 27. 19:09

1. 클래스 상속

  • Java에서는 이중 상속 허용 X
public class 자식클래스 extends 부모클래스 {
}

 

2. 부모 생성자 호출

  • 자식 객체 생성 시에, 부모 객체 생성 후에 자식 객체 생성
  • 자식 생성자의 맨 첫 줄에 숨겨진 super()에 의해서 부모 생성자 호출
    • super()는 컴파일 과정에서 자동 추가
    • 만약 부모 클래스에 기본 생성자 X -> 자식 생성자 선언에서 컴파일 에러 발생
    • 부모 클래스에 기본 생성자가 없고, 매개변수 갖는 생성자만 존재한다면 -> super(매개값, ..) 코드를 직접 추가해야 함

 

3. method 재정의

3.1. method overriding

  • method overriding: 상속된 method를 자식 클래스에서 재정의
    • 부모 메소드는 숨겨지고, 자식 메소드가 우선적으로 사용됨
  • method overriding 규칙
    • 부모 메소드의 선언부(return type, method name, parameters)와 동일해야 함
    • 접근 제한을 더 강하게 오버라이딩할 수 없음 
    • 새로운 예외를 throws 불가
package sec4;

public class Airplane {
	public void land() {
		System.out.println("착륙합니다.");
	}
	
	public void fly() {
		System.out.println("일반 비행합니다.");
	}
	
	public void takeOff() {
		System.out.println("이륙합니다.");
	}
}

package sec4;

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();
		}
	}
}

package sec4;

public class SupersonicAirplaneExample {
	public static void main(String[] args) {
		SupersonicAirplane sa = new SupersonicAirplane();
		sa.takeOff();
		sa.fly();
		sa.flyMode = SupersonicAirplane.SUPERSONIC;
		sa.fly();
		sa.flyMode = SupersonicAirplane.NORMAL;
		sa.fly();
		sa.land();
	}
}

 

4. final 클래스와 final 메소드

4.1. final 클래스

  • 클래스 선언 시에 final을 붙이면 더이상 상속이 불가능
public final class 클래스 { ... }

 

4.2. final 메소드

  • 메서드 선언 시에 final을 붙이면 overriding 불가능
public final 리턴타입 메소드( 매개변수, ... ) { ... }

 

5. protected 접근 제한자

접근 제한자 제한 대상 제한 범위
protected 필드, 생성자, 메소드 같은 패키지이거나, 자식 객체만 사용 가능

 

6. 타입 변환

6.1. 자동 타입 변환

  • 비록 변수는 자식 객체를 참조하지만, 접근 가능한 멤버는 부모 클래스 멤버로 한정
  • but, 자식 클래스에서 오버라이딩된 method가 존재하면 부모 메소드 대신 overriding method 호출
부모타입 변수 = 자식타입 객체;

 

 

6.2. 강제 타입 변환

  • 자동 변환으로 자식 객체를 부모 타입으로 변환한 경우, 부모 타입 필드와 메소드만 사용 가능 -> 강제 타입 변환을 통해 자식 타입으로 변환
자식타입 변수 = (자식타입) 부모타입 객체;

 

 

7. 다형성

  • 다형성(polymorphism): 사용 방법은 동일하지만, 실행 결과가 다양하게 나오는 성질
  • 자동 타입 변환 + 메소드 오버라이딩 -> 다형성

7.1. 필드 다형성

  • 필드 다형성: 필드 타입은 동일하지만, 대입되는 객체가 달라져서 실행 결과가 달라지는 것
package ch7.sec8;

public class Tire {
	public void roll() {
		System.out.println("회전합니다.");
	}
}

package ch7.sec8;

public class HankookTire extends Tire {
	@Override
	public void roll() {
		System.out.println("한국 타이어가 회전합니다.");
	}
}

package ch7.sec8;

public class KumhoTire extends Tire {
	@Override
	public void roll() {
		System.out.println("금호 타이어가 회전합니다.");
	}
}

package ch7.sec8;

public class Car {
	public Tire tire;
	
	public void run() {
		tire.roll();
	}
}

package ch7.sec8;

public class CarExample {
	public static void main(String[] args) {
		Car myCar = new Car();
		
		myCar.tire = new Tire();
		myCar.run();
		
		myCar.tire = new HankookTire();
		myCar.run();
		
		myCar.tire = new KumhoTire();
		myCar.run();
	}
}

 

7.2. 매개변수 다형성

  • 매개변수 다형성: 메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할 때 동일한 타입의 객체를 제공하는 것이 정석이지만, 자식 객체를 제공할 수도 있음
public class Driver {
    public void drive(Vehicle vehicle) {
        vehicle.run();
    }
 }

 

-> Vehicle vehicle = bus; 형태로 매개변수의 다형성 발생

 

8. 객체 타입 확인

boolean result = 객체 instanceof 타입

 

9. 추상 클래스

  • 사전적 의미의 추상(abstract): 실체 간에 공통되는 특성을 추출한 것
  • abstract class: 실체 클래스(객체 생성 가능 클래스)들의 공통적인 필드나 메소드를 추출해서 선언한 클래스
  • 추상 클래스는 new 연산자를 사용해서 객체 직접 생성 불가능
public abstract class 클래스명 {
    // 필드
    // 생성자
    // 메소드
}

9.1. 추상 메소드와 재정의

abstract 리턴타입 메소드명( 매개변수, ... );
public abstract class Animal {
    abstract void sound();
}

 

10. 봉인된 클래스

  • 기본적으로 final 클래스를 제외한 모든 클래스는 부모 클래스가 될 수 있음
  • 무분별한 자식 클래스 생성을 방지하기 위해 Java15부터 봉인된(sealed) 클래스 도입
public sealed class Person permits Employee, Manager { ... }

-> Employee, Manager만 자식클래스가 될 수 있음

public final class Employee extends Person { ... }
public non-sealed class Manager extends Person { ... }

-> sealed class를 상속하는 클래스는 fianl 혹은 non-sealed 키워드로 선언하거나, sealed 키워드를 사용하여 또 다른 봉인 클래스로 선언해야 함


참고자료