티스토리 뷰

Java/문법

9. 추상화 : abstraction

알 수 없는 사용자 2018. 10. 11. 21:27


이번 포스팅에서는 추상화에

대해서 다루겠습니다.

추상화는 차후에 다룰 인터페이스와

 매우 비슷한 개념을 가지고

있기 때문에 구별하여

어떤 목적으로 사용되는지

알아두면 좋을 것 같습니다.


=============================================================


추상화 : abstraction




1. Abstraction : What?


 추상이라 하면 미술용어로 추상화를 많이 생각하실 것입니다. 미술에서 추상화는 어떤 물체를 사실적으로 완벽하게 그리는 것이 아니라 점, 선, 면, 색채에 의한 표현을 목표로 한 그림을 뜻합니다. 이러한 미술에서의 추상화 의미를 추상 클래스에도 적용하면 언제 사용해야 하고 어떤 기능을 위해 사용하는지 이해하기 쉬울 것 같습니다.

 앞선 포스팅에서 클래스는 설계도라고 비유했습니다. 일반적인 클래스의 메소드는 모두 조건에 맞게 기능이 정의되어있어야 합니다. 하지만 추상 클래스의 경우 기능이 완벽하게 정의되어 있지 않아도 클래스로 취급이 가능한 것입니다.

 



2. Abstraction : When, Why?


 그렇다면 이런 추상화(abstract)는 언제, 왜 사용할까요?

추상화는 상속 관계에서의 오버라이드를 통해 사용 목적을 찾을 수 있습니다.


간단한 예시를 하나 들어보겠습니다.

동물을 여러 종류로 분류하면 간단하게 다음 그림처럼 표현할 수 있습니다.



만약 이러한 동물을 객체로 만든다면 동물은 포유류, 파충류, 조류 등의 부모 클래스가 될 것입니다.

이때 동물들의 행동을 메소드로 정의한다면 동물 클래스에서 메소드를 생성한 후 자식 클래스에서는 오버라이드를 통해 재정의하게 될 것입니다.

이렇게 한다면 자식 클래스의 재정의까지는 문제가 없죠. 하지만 부모클래스인 동물 클래스에서는 메소드를 정의할 수 없다는 것입니다.

예로 들어 동물의 분류에 따라 우는 동작을 다르게 하고 싶어서 String 타입의 반환형을 가진 cry() 메소드를 정의하고 오버라이드 했다 한다면 부모 클래스에서는 딱히 뭐라고 정의할 수가 없다는 것입니다. 억지로 프로그래머가 실질적으로 호출하지 않는 동물 클래스의 cry() 메소드를 기능 구현해야 한다는 것이죠.


이럴 경우 추상화를 통해 동물 클래스(부모 클래스)에는 추상 메소드로 cry()를 선언하고 자식 클래스에서는 부모 클래스의 추상 메소드를 오버라이드할 수 있습니다.




3. Abstraction : How?


 추상 클래스, 추상 메소드의 구현은 아주 간단합니다. 

추상 클래스의 경우 클래스 명 앞에 abstract 키워드만 붙여주면 되고, 추상 메소드의 경우도 마찬가지지만 메소드 정의 부분은 하지 않고 세미클론으로 마무리해주면 됩니다.


 - 클래스 : abstract 클래스 명 { ...}

 - 메소드 : abstract 리턴타입 메서드이름();


abstract class Animal {
...
abstract String cry();
...
}

class Mammalia extends Animal{
...
String cry(){
return "Mammalia cry...";
}
...
}

class Reptilia extends Animal{
...
String cry(){
return "Reptilia cry...";
}
...
}


위의 동물 예제로 간단하게 구현한다면 Animal 클래스에 abstract cry() 메소드를 생성해놓고 사용할 수 있습니다.



4. Abstraction : Character?


- 추상 클래스는 추상 메소드를 포함하는 것을 제외하고는 일반 클래스와 같습니다.

- 추상 클래스에도 생성자가 있으며, 멤버 변수와 일반 메소드도 가질 수 있습니다.

- 추상 메소드를 한 개라도 가진 클래스는 추상 클래스로 구현해야 합니다.

- 추상 클래스를 상속받은 자식 클래스는 반드시 추상 클래스의 추상 메소드를 오버라이딩해야 합니다. 

- 만약 자식 클래스에서 추상 클래스의 추상 메소드를 오바라이딩하지 않는다면 자식 클래스 또한 추상 클래스가 되어야 합니다.

- 상속 관계가 아니라면 추상화는 의미가 없습니다.

- 상속받은 자식 클래스로는 객체가 생성할 수 있지만 추상 클래스로는 new 연산자로 객체 생성이 불가능합니다.



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함