관심쟁이 영호

[JAVA]추상클래스와 추상메서드에 대해서! ㅣ Abstract 본문

학교공부/자바의 왕!

[JAVA]추상클래스와 추상메서드에 대해서! ㅣ Abstract

관심쟁이 영호 2021. 5. 21. 15:57
반응형

오늘은 추상클래스와 추상메서드에 대해서 공부를 해볼 계획이다.

 

추상클래스?

추상클래스는 완성하지않은 메서드를 가지고 있는 클래스를 말한다!

한마디로, 몸통부분인 "{}"가 없는 것을 말한다.

클래스에는 "abstract"라는 키워드가 필요하다.

추상메서드?

추상메서드 또한 같다. 몸통부분 "{}"이 없는 메서드를 말한다.

메서드에는 "abstract"라는 키워드가 필요하다.

 

아래 코드를 통해서 살펴보자.

abstract class MyClass{
	abstract void go(int num);
	abstract void stop(int result);
}

여기서 보았듯이, 몸통부분이 없는 것을 볼 수 있다.

 

왜 사용하는 걸까?

  • 다른 클래스를 작성하는데 도움을 주기 위해서 사용한다!

- 다음 코드를 살펴보자.

abstract class MyClass{
	abstract void go(int num);
	abstract void stop(int result);
	
}

class Student extends MyClass{

	@Override
	void go(int num) {
		// 이 부분을 통해서 구현을 완성해야 한다.
	}

	@Override
	void stop(int result) {
		// 이 부분을 통해서 구현을 완성해야 한다.
	}
	
}

 

위의 코드를 보면 "MyClass"라는 추상클래스를 상속받아서 MyClass에 존재하는 추상메서드를 오버라이드하여 구현한 것을 볼 수 있다. 이런 식으로 추상클래스를 사전에 작성해놓으면 다른 클래스 작성을 하는데 도움을 줄 수 있다.

 

추상클래스의 필요성-1

그럼 추상클래스가 왜 필요한지 실제 코드로 살펴보자!

class Car{
	String engine;
	int x, y;
	int wiper; // 와이퍼
	void move(int x, int y) {
		// x, y로 이동하라!
	}
	void stop() {
		//현재 위치 정지
	}
}
class Motorcycle{
	String engine;
	int x, y;
	void move(int x, int y) {
		// x, y로 이동하라!
	}
	void stop() {
		//현재 위치 정지
	}
}
class cycle{
	int x, y;
	void move(int x, int y) {
		// x, y로 이동하라!
	}
	void stop() {
		//현재 위치 정지
	}
}

 

위의 코드를 살펴보면,

자동차, 오토바이, 자전거 클래스가 있다. 각 클래스에는 중복되는 코드가 있다. 

추상클래스를 이용하면 해당 코드들의 중복을 없앨 수 있다!!

 

그럼 아래 코드를 통해서 코드의 중복을 없애보자!

abstract class Vehicle{
	String engine;
	int x, y;
	abstract void move(int x, int y);
	void stop() {
		//현재 위치 멈추기
	}
}
class Car extends Vehicle{
	String engine;
	int wiper; // 와이퍼
	@Override
	void move(int x, int y) {
	}
}
class Motorcycle extends Vehicle{
	String engine;
	@Override
	void move(int x, int y) {
	}
}
class cycle extends Vehicle{
	@Override
	void move(int x, int y) {	
	}
}

 

공통적으로 존재하는 부분은 추상클래스로 밀어넣고

전부 Vehicle을 상속받았다.

아주 편해졌다!

 

※ stop 메서드는 몸통부분이 구현되어 있어서, 그냥 호출하면 바로 불러질 것이다.

 

추상클래스의 필요성-2

여러가지의 객체 타입을 하나의 배열로 다루기 위해서이다.

아래 코드를 보자.

public class AbstractClass{
	public static void main(String[] args) {
		ArrayList<Vehicle> arr = new ArrayList<Vehicle>();
		
		arr.add(new cycle());
		arr.add(new Motorcycle());
		arr.add(new Car());
	}
}

 

위와 같이 코드를 짤 경우에! 각자 다른 객체를 다룰 수 있다.

 

※ 단점은 없을까..?

- 당연히 있다. 위 배열을 다룰 때에는 Vehicle에 존재하는 함수와 변수만 사용할 수 있을 것이다.

그래서 객체 형변환을 하고 사용해야 cycle, Motocycle, Car만의 고유 기능을 사용할 수 있다.

 

ex) arr.get(0).engine은 없을 것이다!!

		Car c = (Car)arr.get(2);
		System.out.println(c.engine);

 

이렇게 사용해야 한다!

 

단점인지는 모르겠다.

300x250
Comments