Programming/Java, Spring

[JAVA] 추상 클래스란? / 추상 메서드란?? / 추상 클래스의 작성

Juun 2022. 6. 2. 23:32
반응형

추상 클래스가 뭔지 알기 전에 추상 클래스를 왜 사용하는지부터 알아보자

추상화라는 뜻은 불명확하고 애매하다라는 의미를 가지고 있다.

왜 우리는 이런 불명확하고 애매한 추상 클래스를 사용할까??

바로 변경에 유리하기 때문이다.

추상 클래스란(abstract class)?

  • 클래스가 설계도라면 추상 클래스는 '미완성 설계도'
  • 추상 메서드를 포함하고 있는 클래스
abstract class Player {
	int currentPos; // 현재 Play 되는 위치를 저장하기 위한 변수
    
    Player() {	//	 추상클래스도 생성자가 필요
    	currentPos = 0;
    }
}

abstract void play(int pos); // 추상메서드
abstract void stop();	// 추상메서드

void play() {	
	play(currentPos); // 추상메서드를 사용할 수 있다
}
  • 일반 메서드가 추상 메서드를 호출 할 수 있다.
  • 완성된 설계도가 아니므로 인스턴스를 생성할 수 없다.
  • 다른 클래스를 작성하는데 도움을 줄 목적으로 작성됨. (인스턴스 생성불가)

추상 메서드란?(abstract method)

  • 선언부만 있고 구현부(몸통, body)가 없는 메서드, 미완성 메서드
  • 자손마다 다르게 구현될 것으로 예상될 경우 사용한다.
  • 추상클래스는 상속을 통해 완성해야 객체 생성이 가능하다.
abstract class Player {

abstract void play(int pos); // 추상메서드
abstract void stop();	// 추상메서드
}

class AudioPlayer extends Player { // 추상메서드 몸통 만들기
	void play(int pos){ }
    void stop() { }	// 구현
}

abstract class AbstractPlayer extends Player {
	void play(int pos) { }
}

위 예제를 보면 추상 클래스 Player를 상속 받고 있는 클래스 AudioPlayer와 AbstractPlayer가 있다

 

먼저 AudioPlayer는 추상클래스 Player의 추상메서드인 play()와 stop() 을 구현을 해서 완성된 설계도라 할 수 있다!!

반면에 클래스 AbstractPlayer는 Player의 추상메서드 play()만 구현했고 나머지 하나인 stop()은 구현하지 않았다!!

이런 경우는 완성했다고 할수 없어서 꼭 abstract 를 붙혀줘야한다!!!


그럼 추상 클래스와 추상 메서드에 대해서 알아봤으니 

어떤 경우에 사용하면 좋은지 알아보자!

추상 클래스의 작성

  • 추상 클래스는 여러 클래스의 공통적인 부분을 뽑아서 추상클래스로 만든다!!

 

abstract class Unit {
	int x, y;
	abstract void move(int x, int y);
	void stop() { /* 현재 위치에 정지 */ }
}

class Marine extends Unit { // 보병
	void move(int x, int y) {
		System.out.println("Marine[x=" + x + ",y=" + y + "]");
	}
	void stimPack() { /* 스팀팩을 사용한다. */ }
}

class Tank extends Unit { // 탱크
	void move(int x, int y) {
		System.out.println("Tank[x=" + x + ",y=" + y + "]");
	}
	void changeMode() { /* 공격모드를 변환한다. */ }
}

class Dropship extends Unit { // 수송선
	void move(int x, int y) {
		System.out.println("Dropship[x=" + x + ",y=" + y + "]");
	}
	void load()   { /* 선택된 대상을 태운다. */ }
	void unload() { /* 선택된 대상을 내린다. */ }
}

위 예제처럼 모든 유닛에는 움직일 수 있는 기능이 있다!

이럴때 추상클래스 Unit에 move() 라는 추상메서드를 만들어 다른 유닛에 상속 시키면 된다!

만약 모든 유닛에 다른 기능을 추가하고 싶다면??

추상 클래스 Unit에 추상메서드를 추가하면 하나하나씩 추가하지 않아도 모든 유닛에 상속 시킬 수 있다!!!

 

그러니 추상 클래스는 여러 클래스의 공통적인 부분만 따로 뽑아내서 추상 클래스로 만들어주자!!!

반응형