티스토리 뷰
이번에 설명할 내용은 abstract class(추상 클래스)입니다. 추상 클래스는 일반적인 클래스와 크게 다르진 않습니다. 변수를 가질 수 있고 메소드를 선언할 수 있습니다. 차이점은 다른 일반적인 클래스와 다르게 추상 메소드를 선언할 수 있다는 점과 추상 클래스라는 설계도로 만들어낸 제품, 즉 인스턴스를 가질 수 없다는 점입니다. 그렇다면 추상 메소드는 무엇일까요? 추상 메소드는 몸통을 가질 수 없는 단지 메소드명만 선언 된 메소드입니다. 일단 아래 코딩부터 보겠습니다.
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 |
package blog;
public class Ex_abstract {
public static void main(String[] args) {
}
}
abstract class blueprint {
public int num;
public int num2;
public int num3;
public void setNumber(int num,int num2) {
this.num = num;
this.num2 = num2;
}
public void plus() {
this.num3 = num + num2;
}
public void minus() {
this.num3 = num - num2;
}
public abstract void result(); //추상 메소드
} |
cs |
위 코딩을 살펴보면 일반적인 클래스 선언과 다르게 class 앞에 abstract가 들어간 것을 볼 수 있습니다. 그리고 구현부를 살펴보면 일반적인 클래스와 별 다르지 않음을 알 수 있습니다. 맨 마지막 줄의 추상 메소드를 제외하면 말이죠. 추상 메소드는 다른 일반적인 메소드들과 다르게 몸통을 가질 수 없습니다. 단지 선언만 가능하죠. 그럼 이 추상 메소드는 도대체 어디에 쓰이는 걸까요?
추상 메소드 사용 목적
추상 클래스의 사용 목적은 추상 클래스를 상속 받는 클래스에서 추상 메소드를 강제로 구현하도록 하는 것입니다. 먼저 아래 코딩부터 보겠습니다.
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
31
32
33 |
package blog;
public class Ex_abstract {
public static void main(String[] args) {
calculator cal = new calculator();
cal.setNumber(4, 5);
cal.plus();
cal.result();
}
}
abstract class blueprint {
public int num;
public int num2;
public int num3;
public void setNumber(int num,int num2) {
this.num = num;
this.num2 = num2;
}
public void plus() {
this.num3 = num + num2;
}
public void minus() {
this.num3 = num - num2;
}
public abstract void result();
public abstract void multiple();
public abstract void divide();
}
class calculator extends blueprint {
} |
cs |
위 코딩은 추상 클래스를 상속 받는 calculator 클래스를 선언한 모양입니다. 저렇게 코딩을 작성한 후 실행시켜보면 다음과 같은 오류 메시지를 확인할 수 있습니다.
내용을 해석해보면 calculator 클래스가 추상 메소드인 blueprint의 result 메소드를 구현하지 않았다고 되어있네요. 물론, multiple, divide 메소드도 구현되지 않은 상태입니다. 그럼 다음 메소드들을 구현해 보도록 하겠습니다.
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
31
32
33
34
35
36
37
38
39
40
41 |
package blog;
public class Ex_abstract {
public static void main(String[] args) {
calculator cal = new calculator();
cal.setNumber(4, 5);
cal.plus();
cal.result();
}
}
abstract class blueprint {
public int num;
public int num2;
public int num3;
public void setNumber(int num,int num2) {
this.num = num;
this.num2 = num2;
}
public void plus() {
this.num3 = num + num2;
}
public void minus() {
this.num3 = num - num2;
}
public abstract void result();
public abstract void multiple();
public abstract void divide();
}
class calculator extends blueprint {
public void result() {
System.out.println("결과값은 " + num3 + "입니다.");
} //추상 메소드 재정의
public void multiple() {
this.num3 = num * num2;
} //추상 메소드 재정의
public void divide() {
this.num3 = num / num2;
} //추상 메소드 재정의
} |
cs |
위 내용은 blueprint 추상 클래스를 상속 받은 calculator 클래스에서 result와 mutiple, divide를 재정의한 모습입니다. 실행시켜보면 아무런 오류없이 잘 실행되는 것을 확인할 수 있습니다. 추상 클래스를 상속 받는 클래스는 강제로 추상 메소드를 구현해야 한다는 것을 확인할 수 있습니다. 그럼 이 추상 메소드를 어디에 활용할 수 있을까요?
추상 메소드 사용 이유
추상 메소드의 사용 이유를 풀어쓰자면 다음과 같습니다. 추상 메소드의 사용 이유는 커플링(Coupling)과 확장성입니다. 커플링은 물론 다 아시겠지만, 우리가 아는 그 링이 아닌 결합을 의미합니다. 공통 된 이름으로 지어진 메소드를 사용하자는 의미입니다. 이를 비유하자면 전체적인 큰 나무에서 너무 가지가 뻗쳐가지 않도록 쳐내는 것과 마찬가지로 생각할 수 있습니다. 큰 틀을 짜야하는 설계자(또는 설계를 맡은 개발자)가 프로젝트가 너무 자유분방해지지 않도록 공통 된 규칙을 만들어놓고 진행하자는 의미입니다. 이를 통해서 똑같은 기능을 하는 여러 이름이 다른 메소드들이 난립하는 상황을 막을 수 있다는 것이죠.
그 다음으론 확장성입니다. 미리 확장할 여지를 남겨둠으로 설계자가 의도한 방향으로 프로젝트가 나아갈 수 있도록 할 수 있는 것이죠. 커플링이 가지가 뻗쳐가지 않도록 규제를 한다면, 확장성은 올바르게 자란 가지가 더 뻗쳐나갈 수 있도록 하는 행위입니다. 물론, 우리나라 SI업체의 상황에서 별 쓸모가 없다고 느껴질 수 있습니다. 왜냐하면 설계가 언제 바뀔 지 모르기 때문입니다. 하지만, 잘 짜여진 틀 안에서 설계자가 의도한 대로 올바르게 프로젝트가 나아간다면 의미가 클 것이라 생각합니다.
처음엔 추상 클래스의 사용 이유를 개발자들끼리 서로 프로젝트를 이어 받을 시에 좋다고 썼으나, 다음에 설명할 인터페이스를 공부하고자 구글의 바다를 떠돌아다닌 결과 다음과 같이 내용이 바뀌게 되었습니다. 단순히 개발자들끼리 프로젝트를 이어받기 위해 사용한다고 하기에는 이유가 너무 빈약하다고 생각했기 떄문입니다. 그럼 다음에는 인터페이스에 대해 설명하도록 하겠습니다.
'IT > Java' 카테고리의 다른 글
Java - enum (0) | 2017.03.05 |
---|---|
Java - Interface(인터페이스) (0) | 2017.03.05 |
Java - Overloading(오버로딩)과 Overriding(오버라이딩) (0) | 2017.03.05 |
Java - 상속(Inheritance) (0) | 2017.03.05 |
Java - Class와 instance (0) | 2017.02.26 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday