본문 바로가기
JAVA

[JAVA(자바)] 추상 클래스(abstract)와 봉인된 클래스(sealed)

by 초이사 2023. 1. 20.

추상클래스

  • 추상 메소드를 포함하는 클래스 또는 추상메소드가 없지만 abstract로 선언한 클래스
  • 클래스 선언시 반드시 abstract 키워드를 사용해서 선언해주어야 한다.
  • 실체 클래스의 부모 역할로 추상클래스에는 실체 클래스의 공통된 필드나 메소드를 가지고 있고, 실체 클래스에서 이를 오버라이딩해 실행 가능한 코드로 작성한다.  
    • 즉, 미완성인 코드가 존재할 수 있다. ->  객체 생성 불가
  • 실체 클래스에서 실행 가능한 코드로 구현할 때만 사용하는 게 목적이므로 extands 뒤에만 올 수 있다.
  • 자식클래스에서 객체생성시 super()로 부모클래스의 생성자를 호출하기 때문에, 생성자도 있어야 한다.
abstract class 클래스명 { //추상클래스 선언
	
}
// 1. 추상메소드를 포함하는 추상클래스

abstract class Animal { //추상클래스 선언
	//abstract public 순서 바뀌어도 됨
	abstract public void cry(); //추상 메소드 선언
	public abstract void crying(); //추상 메소드 선언
}

// 2. 추상메소드는 없지만 abstract롤 선언된 추상클래스

abstract class Animal { //추상클래스 선언
	public void cry(){
    	System.out.println("울음소리");
    }
}

 

 

추상메소드

  • 선언은 되었지만 코드가 미완성인 메소드 (보통 자식 클래스들의 공통된 메소드지만 실행 내용이 다를 때, 사용)
  • abstract 키워드를 붙여서 작성해야 한다.
  • 추상 메소드는 자식 클래스에서 오버라이딩을 통해 실행 가능한 코드를 작성해줘야 한다.
  • private로 선언불가
abstarct 리턴타입 메소드이름();

 

 

추상클래스 작성

abstract class Animal { //추상클래스 선언
	
	abstract public void cry(); //추상 메소드 선언
	
	public void print() { //메소드 선언
		System.out.println("울음소리");
	}
}

class Dog extends Animal {
	//추상 매소드 오버라이딩
	@Override
	public void cry() {
		System.out.println("멍멍");
	}
}

class Cat extends Animal{
	//추상 매소드 오버라이딩
	@Override
	public void cry() {
		System.out.println("야옹");
	}
}

class Tiger extends Animal{
	//추상 매소드 오버라이딩
	@Override
	public void cry() {
		System.out.println("어흥");
	}
}

public class Solution {
	public static void main(String[] args){
		Dog dog = new Dog(); //Dog 객체 생성
		Cat cat = new Cat(); //Cat 객체 생성
		Tiger tiger = new Tiger(); //Tiger 객체 생성
		
		dog.print(); //울음소리
		dog.cry(); //멍멍
		cat.cry(); //야옹
		tiger.cry(); //어흥
		
	}
}

추상 메소드는 자식 메소드에서 메소드 오버라이딩을 해야하기 때문에 같은 클래스내에서만 접근할 수 있는 private로 선언하면 안된다.

 

 

 

 

 

봉인된 클래스

  • Java 15부터 사용 가능
  • 상속을 제한하기 위해 도입되었다.
  • sealed 키워드로 선언된 클래스는 permits 키워드 다음에 오는 클래스들에만 상속이 가능하다.
  • 봉인된 클래스를 상속받은 자식클래스는 sealed나 non-sealed, final 키워드를 사용해서 선언해야 한다.
    • non-sealed :  자식 클래스에게 상속이 가능하다.
    • final : 더이상 상속할 수 없다.
    • sealed : 봉인 클래스로 선언

상속 예시

//봉인된 클래스 선언
sealed class Animal permits Dog {
	//메소드 선언
    public void cry(){
    	System.out.println("소리");
    }
}
//봉인된 클래스 상속 - final 선언 더이상 상속 불가
final class Dog extends Animal {
	@Override
    public void cry(){
    	System.out.println("멍멍");
    }
}

//봉인된 클래스 상속 - non-sealed 선언 상속 가능
non-sealed class Cat extends Animal {
	@Override
    public void cry(){
    	System.out.println("야옹");
    }
}

//봉인해제 클래스 상속 - sealed, non-sealed, final 중 하나로 선언x
class Tiger extends Cat {
	@Override
    public void cry(){
    	System.out.println("어흥");
    }
}

 

 

 

댓글