추상클래스
- 추상 메소드를 포함하는 클래스 또는 추상메소드가 없지만 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("어흥");
}
}
'JAVA' 카테고리의 다른 글
[JAVA(자바)] 인터페이스 (feat. 인터페이스와 추상클래스 비교) (0) | 2023.01.22 |
---|---|
[JAVA(자바)] 배열 복사, 배열 특정 구간 복사(copyOf, copyOfRange) (0) | 2023.01.21 |
[JAVA(자바)] 업캐스팅과 다운캐스팅 (feat. 다형성, instanceof) (0) | 2023.01.19 |
[JAVA(자바)] 메소드 오버라이딩 (feat. 오버로딩) (0) | 2023.01.18 |
[JAVA(자바)] 상속과 생성자(super()) (0) | 2023.01.17 |
댓글