본문 바로가기
Programming Language/Java

[자바] 추상 클래스 - (1) 사용법과 구현

by ggyongi 2021. 10. 24.
반응형

- 추상 클래스의 문법

추상 클래스는 항상 추상 메서드를 포함한다.

추상 메서드는 구현 코드가 없기 때문에 몸체(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();
		

	}

}

 

- 그렇다면 이런 추상 클래스는 왜 만드는 걸까?

추상 클래스는 상속을 하기 위해 만든 클래스다. 어떤 메서드를 구현하고 어떤 메서드를 추상 메서드로 남겨두는 걸까?

구현된 메서드 -> 하위 클래스에서 공통으로 사용할 구현 코드. 하위 클래스에서 재정의할 수도 있음

추상 메서드 -> 하위 클래스가 어떤 클래스냐에 따라 구현 코드가 달라짐

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글