본문 바로가기
언어/java

[Java] 7. 상속 (4) - 10~11

by 젼젼39 2025. 5. 22.

7.10 추상 클래스

(1) 추상 클래스

    : 객체를 생성할 수 있는 실체 클래스들의 공통적인 필드나 메소드를 추출해 선언한 클래스; 실체 클래스의 부모 역할
    - 실체 클래스는 추상 클래스를 상속해 공통적인 필드나 메소드를 물려받을 수 있음

    - 추상 클래스는 실체 클래스의 공통되는 필드, 메소드를 추출했기 때문에 new 연산자를 사용해 객체를 직접 생성할 수 없음
    -> 추상 클래스는 새로운 실체 클래스를 만들기 위한 부모 클래스로만 사용됨(자식 클래스만 만들 수 있음); extends 뒤에만 올 수 있음

class Fish extends Animal {
	//
}

(2) 추상 클래스 선언

    - 클래스 선언에 abstract 키워드를 붙이면 추상 클래스 선언이 됨

    - 추상 클래스도 필드, 생성자, 메소드를 선언할 수 있음

    * 자식 객체가 생성될 때 super()로 추상 클래스의 생성자가 호출되기 때문에, 생성자도 반드시 있어야 함 

public abstract class 클래스명 {
	//필드
    //생성자
    //메소드
}

(3) 추상 메소드와 재정의

    - 자식 클래스들이 가지고 있는 공통 메소드를 뽑아내어 추상 클래스로 작성할 때,
        메소드 선언부(리턴타입, 메소드명, 매개변수)만 동일하고 실행 내용은 자식 클래스마다 달라야 하는 경우가 존재
    -> 추상 메소드 선언 

abstract 리턴타입 메소드명(매개변수, ...);

abstract void sound();

    - abstract 키워드 & 메소드 실행 내용인 중괄호 {} 없음 (실행 내용을 가지지 않음)

    -> ** 추상 메소드는 자식 클래스에서 반드시 재정의(오버라이딩)해서 실행 내용을 채워야 함!!

public abstract class Animal {
	//추상 메소드 선언
    public abstract void sound();
}

public class Dog extends Animal{
	//추상 메소드 재정의
    @Override
    public void sound(){
    	System.out.println("멍멍");
    }
}

public class Cat extends Animal {
	//추상 메소드 재정의
    @Override
    public void sound(){
    	System.out.println("야옹");
    }
}
public class AbstractMethodExample{
	public static void main(String[] args) {
    	Dog dog = new Dog();
        dog.sound();
        
        Cat cat = new Cat();
        cat.sound();
        
        //매개변수의 다형성
        animalSound(new Dog());
        animalSount(new Cat());
    }
    
    public static void animalSound(Animal animal) {  //Animal animal 부분 : 자동타입변환
    	animal.sound(); //재정의된 메소드 호출
    }
}

 

7.11 봉인된 클래스

    - java 15부터, 무분별한 자식 클래스 생성 방지 위해 봉인된(sealed) 클래스가 도입됨

    - 언급된 클래스들만 자식 클래스가 될 수 있고, 그 이외는 자식 클래스가 될 수 없도록 선언

public sealed class Person permits Employee, Manager { ... }

    - 봉인된 클래스를 상속하는 클래스들은 final 또는 non-sealed 키워드로 선언하거나,
        sealed 키워드를 사용해 또 다른 봉인 클래스로 선언해야 함

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

 

'언어 > java' 카테고리의 다른 글

[Java] 8. 인터페이스 (2) - 4~7  (0) 2025.05.25
[Java] 8. 인터페이스 (1) - 1~3  (0) 2025.05.22
[Java] 7. 상속 (2) - 5~6  (0) 2025.05.20
[Java] 7. 상속 (1) - 1~4  (0) 2025.05.20
[Java] 6. 클래스 (6) - singleton  (0) 2025.05.17