[Java] Java의 정석 정리 (추상클래스)

송병훈·2022년 9월 29일
0

자바의 정석

목록 보기
12/15
post-thumbnail

추상 :
여러 가지 사물이나 개념에서 공통되는
특성이나 속성 따위를 추출하여 파악하는 것

하지만, 객체지향개념에서는 이런 느낌으로 많이 쓰여요.

추상(미완성) <-> 구현(완성)

Java에서 추상클래스를 쉽게 말하면 "미완성 설계도" 에요.
미완성 설계도라서 객체를 생성할 수 없어요.
이 설계도를 완성하여 객체를 생성하려면
추상클래스의 멤버들을 자손클래스에서 구현해야 돼요.

근데, 무엇이 미완성인 걸까요?
자손클래스에서 무엇을 구현하는 걸까요?


추상클래스 (abstract class)

메소드가 미완성입니다.

abstract void play(int pos);
abstract void stop();

이렇게 abstract 키워드가 붙고, 구현부 { } 가 없는 메소드를
추상메소드 라고 불러요.

그리고 추상메소드를 지닌 클래스를
추상클래스 라고 부르고, 마찬가지로 앞에 abstract 키워드를 붙입니다.

그럼 자손클래스에서는 추상클래스를 상속받아서
메소드의 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) {/* 지상에서 지정된 위치로 이동 */}
    void stimpack() {/* 생략 */}
}

class Tank extends Unit {
	void move(int x, int y) {/* 지상에서 지정된 위치로 이동 */}
    void cahngeMode() {/* 생략 */}
}

class Dropship extends Unit {
	void move(int x, int y) {/* 공중에서 지정된 위치로 이동 */}
    void load() {/* 생략 */}
    void unload() {/* 생략 */}
}

Unit[] group = new Unit[4];
group[0] = new Marine();
group[1] = new Tank();
group[2] = new Marine();
group[3] = new Dropship();

for(int i=0; i < group.length; i++){
	group[i].move(100, 200);
}

여기서 move() 메소드를 보면
Unit클래스(부모)에서 추상메소드로 있고,
각각의 자손클래스에서 구현되었어요.

그럼 마지막 줄의 group[i].move(100, 200); 를 하면
부모클래스의 move() 가 호출될까요,
자손클래스의 move() 가 호출될까요?

당연히 자손클래스에서 구현된 메소드가 호출됩니다.
인스턴스가 자손클래스의 인스턴스 잖아요?
그리고 부모클래스의 추상메소드에는 내용이 없어요.

언제나 우리가 호출하는 것은
생성된 인스턴스의 멤버라는 것을 기억하자구요!!
참조변수의 클래스는 상관없어요!!

참조변수는 그저 리모콘으로서
각 리모콘마다 다룰 수 있는 버튼의 개수가 다를 뿐이에요.


고생하셨어요 : )

profile
성실하고 꼼꼼하게

0개의 댓글