관심쟁이 영호
[JAVA]추상클래스와 추상메서드에 대해서! ㅣ Abstract 본문
오늘은 추상클래스와 추상메서드에 대해서 공부를 해볼 계획이다.
추상클래스?
추상클래스는 완성하지않은 메서드를 가지고 있는 클래스를 말한다!
한마디로, 몸통부분인 "{}"가 없는 것을 말한다.
클래스에는 "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);
이렇게 사용해야 한다!
단점인지는 모르겠다.
'학교공부 > 자바의 왕!' 카테고리의 다른 글
[#0 오브젝트 - 코드로 이해하는 객체지향 설계] 정주행 시작! (0) | 2021.09.13 |
---|---|
[JAVA] 인터페이스 ㅣ Interface (1) | 2021.05.22 |
JAVA ㅣPrivate? ㅣ변수에 Private를 설정하는 이유? (0) | 2021.04.03 |
[Callback Method] 콜백함수? ㅣ 자바에서는 어떻게 써야할까? (0) | 2021.03.24 |
JAVA - int to String ㅣ double to String ㅣ float to String ㅣ 정수 -> 문자열 ㅣ double -> 문자열 ㅣ float -> 문자열 (0) | 2020.12.01 |