티스토리 뷰

개인공부/JAVA

JAVA - Abstract

날따라해봐요요롷게 2021. 3. 10. 22:08

출처 : DO IT! 자바프로그래밍 (저 : 박은종)

추상 클래스

  • 추상클래스
  • 템플릿 메서드
  • 템플릿 메서드 응용
  • final 예약어

 

### 추상 클래스

 : 클래스를 구현할 때 메서드 몸체를 구현하지 않고 선언만 하는 메서드를 포함한 클래스이다.

 

※abstract

 : 추상클래스나 메서드를 선언할 때 쓰는 예약어이다.

 

추상클래스는 상속과 깊은 관련이 있다. 추상 클래스를 사용하는 이유도 상속을 전제로 사용하기 때문이다.

 

Car , aiCar , AutoCar 클래스가 있다.

Car 클래스에는 drive, stop 메소드가 있다.

해당 메소드는 aiCar AutoCar 클래스에서 모두 사용되는 메소드이다.

하지만, 두 메소드는 각각의 클래스에서 표현하고자 하는게 다르다. 이를 위해서 각각의 클래스에서 추상 메소드를 클래스에 맞게 구현하도록 하기위해 추상클래스와 추상메소드를 사용한다.

aiCar , AutoCar 클래스는 Car 클래스를 상속받는다. -> Car 클래스의 메소드나, 멤버변수를 사용할 수 있다는 말.

여기서 중요한 것은 추상클래스를 상속받는 하위클래스는 추상메소드를 구현해야한다. 그렇지 않으면 에러가 발생한다.

 

추상클래스는 인스턴스로 생성을 할 수 없다. -> 이유 : 모든 메서드가 구현되지 않았기 때문에

 

-concrete method : 하위클래스에서 공통으로 사용할 구현코드 / 하위클래스에서 재정의 가능

-abstract method : 하위클래스가 어떤 클래스냐에 따라 구현코드가 달라짐

 

package abstract1;

public abstract class Car {
	
	public abstract void drive();
	public abstract void stop();
	
	public void startCar() {
		System.out.println("시동");
	}
	public void turnOff() {
		System.out.println("시동 멈춤");
	}
	final public void run() {
		startCar();
		drive();
		stop();
		turnOff();
	}
}

=====

package abstract1;

public class AiCar extends Car {

	@Override
	public void drive() {
		System.out.println("자율 주행");
	}

	@Override
	public void stop() {
		System.out.println("자동 멈춤");
	}
	
}

========
package abstract1;

public class ManualCar extends Car{

	@Override
	public void drive() {
		System.out.println("사람 운전");
		
	}

	@Override
	public void stop() {
		System.out.println("사람이 멈춤");
	}

}

========

package abstract1;

public class CarTest {

	public static void main(String[] args) {
		Car aiCar = new AiCar();
		Car manualCar = new ManualCar();
		
		aiCar.run();
		manualCar.run();
	}
}

### 템플릿 메서드

 : template 이란 틀, 견본 이라는 용어이다. 즉, 틀이 있는 메소드를 말한다.

final public void run(){
	startCar();
    drive();
    stop();
    turnOff();
}

위의 코드를 살펴보면 run 메소드는 네개의 메소드를 갖고 있다. 

자동차의 종류에 따라서 추상메소드를 활용하여 작동하는 방법은 다르게 하였지만,

자동차가 시동을 걸고 끄고 하는 과정은 똑같기에 과정을 하나의 틀로 만들어 메소드로 구현한 것이다.

이러한 메소드가 템플릿 메소드이다.

※ 템플릿 메소드를 활용시 final 예약어를 활용하여 하위 클래스에서 재정의 하지 못하게 해야한다.

 

### 템플릿 메소드 활용

 

package AbstractEx;

public abstract class PlayerLevel {
	public abstract void run();
	public abstract void jump();
	public abstract void turn();
	public abstract void showPlayerLevel();
	
	final public void go(int count) {
		run();
		for(int i=0; i<count; i++) {
			jump();
		}
		turn();
	}
}

추상 클래스 PlayerLevel을 만든다.

추상 메소드 선언 -> 템플릿 메소드 선언

package AbstractEx;

public class Player {
	private PlayerLevel level; //level을 PlayerLevel 자료형으로 선언하는 이유는 상속을 사용하여 객체의 특징을 활용하기 위함이다.
	
	public Player() {
		level = new Beginner();
		level.showPlayerLevel();
	}
	
	public PlayerLevel getLevel() {
		return level;
	}
	
	public void upgradeLevel(PlayerLevel level) {
		this.level = level;
		level.showPlayerLevel();
	}
	public void play(int count) {
		level.go(count);
	}
}

★매우 중요!!

우리는 해당 코드에서 객체의 특징과 상속, 추상 을 이용하는 이유를 이해해야한다.!

private PlayerLevel level;

 : 멤버 변수 level의 자료형을 PlayerLevel로 하여 선언하였다.

이는 앞으로 메인보드에서 객체를 이용해 멤버변수 level을 이용하기 위함이다. 

생성자 player를 만들면서 변수 level을 beginner로 초기선언한다.

멤버변수 level의 get/set 메소드를 생성한다.

set 메소드는 업그레이드된 레벨을 입력할 수 있도록 upgradeLevel 메소드로 이름을 바꾼다.

매개변수를 갖는 play 메소드를 만들어 level 참조변수가 입력받은 매개변수 만큼 go메소드를 실행한다.

package AbstractEx;

public class Beginner extends PlayerLevel{

	@Override
	public void run() {
		System.out.println("천천히 달립니다.");
	}

	@Override
	public void jump() {
		System.out.println("jump 할 줄 모름");
	}

	@Override
	public void turn() {
		System.out.println("턴 할 줄 모름");
	}

	@Override
	public void showPlayerLevel() {
		System.out.println("=======초보자=======");	
	}
	
	
}

===

package AbstractEx;

public class Advanced extends PlayerLevel{

	@Override
	public void run() {
		System.out.println("빨리 달립니다.");

	}

	@Override
	public void jump() {
		System.out.println("jump 합니다.");
	}

	@Override
	public void turn() {
		System.out.println("턴 할 줄 모름");
	}
	@Override
	public void showPlayerLevel() {
		System.out.println("=======중급자=======");	
	}

}

=====

package AbstractEx;

public class Super extends PlayerLevel{

	@Override
	public void run() {
		System.out.println("매우 빨리 달림");
		
	}

	@Override
	public void jump() {
			System.out.println("아주 높이 점프!!");
	}

	@Override
	public void turn() {
		System.out.println("한 바퀴 돌기~");
	}
	@Override
	public void showPlayerLevel() {
		System.out.println("=======고수=======");	
	}
}
package AbstractEx;

public class Game {

	public static void main(String[] args) {
		Player player = new Player();
		player.play(1);
		
		Advanced aLevel = new Advanced();
		player.upgradeLevel(aLevel);
		player.play(2);
		
		Super sLevel = new Super();
		player.upgradeLevel(sLevel);
		player.play(3);
	}

}

Player 인스턴스를 생성한다.

처음 플레이어의 레벨은 beginner 이다. 

Advanced 인스턴스를 생성하여 플레이어의 레벨이 업그레이드 되게 set메소드(upgradeLevel)에 aLevel을 넘겨준다.

넘겨줌으로써 player의 레벨은 Advanced이다.

Super 인스턴스를 생성하여 플레이어의 레빙을 업그레이드 시켜준다.

 

출처 : DO IT! 자바프로그래밍 (저 : 박은종)

'개인공부 > JAVA' 카테고리의 다른 글

JAVA - Inner Class, Lambda , Stream  (0) 2021.03.21
JAVA - CLASS  (0) 2021.03.16
JAVA - INTERFACE  (0) 2021.03.12
JAVA - Class 와 Object - 2  (0) 2021.03.08
JAVA - Class와 Object (1)  (0) 2021.03.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함