본문 바로가기
프로그래밍 언어/java

[java] 추상클래스

by m2162003 2021. 3. 11.

추상 클래스

추상 메서드를 포함한 클래스. 추상 메서드는 구현 코드가 없이 선언부만 있는 메서드를 의미한다.

추상 메서드가 없어도 abstract를 붙이면 추상클래스이다.

 

(추상 메서드나 추상 클래스 정의 시엔 예약어 abstract를 사용한다.)

 

public abstract class Computer {
	
	public abstract void display(); //추상 메서드1
	public abstract void typing(); // 추상메서드2
	public abstract void wash();
	public void notAbstractMethod() {}; //추상메서드 아님
	
	public void turnOn() {
		System.out.println("turn on");
	}
	
	public void turnOff() {
		System.out.println("turn off");
	}
}

 

중괄호가 없는 display()와 typing()만 추상 메서드이다.

 

추상 클래스는 new(인스턴스화)가 불가능하다. body가 없기 때문이다. 

대신, 추상 클래스는 상위 클래스로서 역할을 하기 위해 주로 사용한다.

추상 클래스를 상속받은 하위 클래스는 abstrct로 선언된 추상 메서드에 대해 구현 책임이 있기 때문이다.

추상메서드로 선언되지 않은 메서드들은 @override로 재선언가능하기 때문에 편하다!

 

 

추상 메서드 구현

추상 클래스를 상속받은 하위 클래스에서 추상 메서드를 구현하지 않으면 에러가 발생한다.

구현 시엔 @Override를 붙여서 구현한다.

public class Desktop extends Computer {

	@Override
	public void typing() {
		System.out.println("typing");

	}

	@Override
	public void display() {
		System.out.println("display");
	}

	@Override
	public void wash() {
		System.out.println("washing");
	}

}

 

상위 클래스 -> 하위 클래스 -> 하위 클래스로 이어지는 계층 구조라면

하위 클래스 둘 중 어느 한 곳에만 추상 메서드가 구현되면 에러가 발생하지 않는다.

//Computer를 상속받은 NoteBook
public abstract class NoteBook extends Computer{
	@Override
	public void typing() {
		System.out.println("NoteBook typing");
	}
}


//NoteBook을 상속받은 MyNoteBook
public class MyNoteBook extends NoteBook {
	@Override
	public void display() {
		System.out.println("MyNotebook displaying");
	}

	@Override
	public void wash() {
		// TODO Auto-generated method stub

	}
}

 

만약 wash()를 지운다면

추상메서드인 wash()를 지울 경우 발생하는 에러

 

메인에서 살펴보자

public class ComputeTest {
	public static void main(String[] args) {
		
		//Computer computer = new Computer(); //에러 발생 인스턴스화 될수 없기 때문
		
		Computer computer = new Desktop();
		computer.display();//desktop에서 정의한 메서드
		computer.turnOff();//상위 클래스 메서드
		
		NoteBook myNote = new MyNoteBook(); //상위클래스 notebook은 하위클래스 인스턴스로 선언 가능
		myNote.wash();
	}
}

잘 출력된다.

 

 

댓글