- 추상 클래스의 문법
추상 클래스는 항상 추상 메서드를 포함한다.
추상 메서드는 구현 코드가 없기 때문에 몸체(body)를 가지고 있지 않다.
ex) 몸체가 있는 메서드
int add(int x, int y){
return x+y; // {} 안의 내용이 함수 몸체
}
추상 메서드는 몸체(구현부) 없이 선언만 하며 abstract 예약어를 사용하고 { } 대신 ;를 쓴다.
abstract int add(int x, int y);
* 빈 { }는 추상 메서드라고 안한다. { }를 쓴것만으로도 메서드를 구현한 셈이 되어버림
- 추상 메서드 구현
아래와 같이 구현부를 작성하지 않은 메서드인 display(), typing()은 추상 메서드라는 의미의 abstract를 붙여줘야 오류가 발생하지 않음. 두 메서드에 abstract를 붙여주면 클래스가 추상 메서드를 포함하게 되기 때문에
Computer 클래스를 추상 클래스로 지정해줘야 한다. 따라서 클래스 앞에도 abstract를 추가해 추상 클래스로 만듦.
package first_project;
public abstract class Computer {
public abstract void display();
public abstract void typing();
public void turnOn() {
System.out.println("전원을 킵니다.");
}
public void turnOff() {
System.out.println("전원을 끕니다.");
}
}
- 추상 클래스 상속받기
Computer 클래스를 상속받는 DeskTop 클래스를 다음과 같이 만들어보자.
package first_project;
public class DeskTop extends Computer{
}
그럼 빨간 밑줄이 그어지며 오류가 발생한다. Computer가 추상 클래스이기 때문에 이 상속받은 클래스에 추상 메서드가 포함되어 있기 때문이다. 이를 해결하기 위해서는
1. 추상 메서드를 모두 구현하던가(반드시 전부해야 함)
2. DeskTop 클래스도 추상 클래스로 만들던가 해야된다.
여기서는 1번 방법을 택해보자. 마우스 우클릭->source->implement method를 클릭하면 다음과 같은 코드가 생성됨.
@Override
public void display() {
// TODO Auto-generated method stub
}
@Override
public void typing() {
// TODO Auto-generated method stub
}
여기에 몸체 코드를 작성해주면 된다.
package first_project;
public class DeskTop extends Computer{
@Override
public void display() {
System.out.println("DeskTop display()");
}
@Override
public void typing() {
System.out.println("DeskTop typing()");
}
}
- 만약 아래와 같이 모든 추상 메서드를 구현하지 않을 거면 그 클래스 역시 추상 클래스로 만들어주어야 함
package first_project;
public abstract class NoteBook extends Computer {
@Override
public void display() {
System.out.println("NoteBook display()");
}
}
- 아래와 같이 모든 추상 메서드가 구현된 클래스는 abstract를 사용하지 않아도 됨
package first_project;
public class MyNoteBook extends NoteBook {
@Override
public void typing() {
System.out.println("MyNoteBook typing()");
}
}
- 아래와 같이 코드를 작성하면 Computer()와 NoteBook() 부분에 밑줄이 그어지며 오류가 발생한다.
Computer 클래스와 NoteBook 클래스는 추상 클래스이기 때문에 인스턴스를 생성할 수 없기 때문이다.
package first_project;
public class ComputerTest {
public static void main(String[] args) {
Computer c1 = new Computer();
Computer c2 = new DeskTop();
Computer c3 = new NoteBook();
Computer c4 = new MyNoteBook();
}
}
- 그렇다면 이런 추상 클래스는 왜 만드는 걸까?
추상 클래스는 상속을 하기 위해 만든 클래스다. 어떤 메서드를 구현하고 어떤 메서드를 추상 메서드로 남겨두는 걸까?
구현된 메서드 -> 하위 클래스에서 공통으로 사용할 구현 코드. 하위 클래스에서 재정의할 수도 있음
추상 메서드 -> 하위 클래스가 어떤 클래스냐에 따라 구현 코드가 달라짐
댓글