본문 바로가기

Language/Java

[JAVA] 추상화와 추상화 클래스

1. 객체지향 언어에서 추상화란?

(1)추상화 뜻

*미술에서의 추상화 뜻

실제 자연계에 존재하는 사물의 대략적인 특징들을 추출하여 점,선,면 으로 단순화하여 표현하는 것

*'추상화 하다.'의 뜻

알고는 있지만, 정확하게 설명하기 어려운 사물을 그것의 중요한 부분이나 특징을 중점 잡아 설명하는 것.

 

*객체지향에서의 추상화 

클래스를 만들 때 굳이 알 필요 없거나 불 필요한 부분을 숨기거나 지우고, 중요한 속성에만 중점을 두어  내용을 추려 만드는 것. 

추상화에는 2 가지 종류가 있는데, 제어 추상화와 데이터 추상화 이다.

(2) 제어 추상화 

사용자가 매소드의 복잡한 부분은 몰라도 사용할 수 있게 만드는 것이다. 매소드의 로직 부분은 숨기고, 사용자가 직접 써야하는 파트만 남기는 것이다.

예를 들어 우리가 컴퓨터 킨다고 생각해보자. 우리가 해야할 일은 컴퓨터의 전원 버튼을 누르는 것 밖에 없다. 만약 사람들이 컴퓨터를 키기 위해서는 컴퓨터 내부의 회로, 펜이 돌아가는 원리를 다 알아야 했다면, 컴퓨터를 사용할 수 있는 이가 극히 적었을 것이다. 따라서 사용자가 알 필요 없는 부분은 숨기고 직접 써야하는 파트만 남겨놓은 컴퓨터 본체는 제어 추상화의 원리를 따른 것이다. 

 

제어 추상화의 장점은, 프로그래밍을 빠르게 설계 및 구현 할 수 있게 해준다는 것이다. 

사실 우리가 사용하는 for문과 While문도 제어 추상화의 원리가 들어가 있다. 우리는 for while의 문법만 알고 있으면 사용할 수 있다. for while이 어떻게 루프를 구현하는지, 내부 CPU 동작이 어떻게 이루어져야 하는지 알 필요가 없다. 

따라서 제어 추상화 덕분에 프로그래밍에 생산성이 증가하고 가독성이 증가하고, 에러가 줄고 유지 보수 시 기간이 단축된다.

(3) 데이터 추상화

대상을 간단한 개념으로 일반화 하는 것이다. 

아이폰이란 객체에 대해 데이터 추상화를 거친다고 생각해보자. 

그러면 아이폰 > 휴대폰 > 통신 기기 > 전자 제품 으로 일반화 할 수 있을 것이다. 일반화 시킬수록 단순화 되어서 더 큰 범주를 그리니까 우리는 이를 java에서 상속의 개념으로 표현 할 수 있을 것이다. 

//코드로 구현

public class electronic_Device {
//...
}

class communication_equipment extends electronic_Device{
//...
}

class cellphone extends communication_equipment{
//...
}

class iphone extends cellphone{
//...
}

데이터 추상화의 좋은 점? 

1. 위와 같이 계속 추상화를 해나가면, 객체의 디테일함은 사라지고 공통적인 특성만 남는다. 이렇게 되면 상위요소에서 공통된 기능들은 다 구현이 되기 떄문에, 하위요소에서는 각 고유 기능에 집중하여 개발을 하면 된다. 

> 매소드, 변수들이 카테고리화 되어 있어 코드 가독성이 좋아지고, 에러를 빨리 파악해, 유지보수가 편해진다. 

예를 들어 설명하면, 

//기능들의 카테고리화

public class electronic_Device {
	전원기능(){//...}
}

class communication_equipment extends electronic_Device{
	통화기능() {//...}
}

class cellphone extends communication_equipment{
	카메라기능() {//...}
    게임기능() {//...}
}

class iphone extends cellphone{
 	apple_app_사용할 수 있는 기능() {//...}
}

2. 데이터 추상화는 객체들이 늘어날수록 장점으로 작용한다. 왜냐하면, 새로 들어온 객체들을 맞는 클래스 계층에 편입시키면, 우리는 객체들을 트리구조로 한 눈에 볼 수 있다. 또한 해당 객체의 위치를 통해 어떤 내용을 포함하고 있는지 대략적으로 파악이 가능해 관리가 용이하다.

예를 들자면, 

이와 같이 새로운 객체들이 들어오면 카테고리화 시켜서 어디에 속하는지, 무슨 내용을 담고 있을지 빠르게 파악이 가능하다.

 

2. 추상화 클래스란? 

(1)추상화 클래스 

추상화 클래스는 완성이 되지 않은 클래스이다. 따라서 해당 클래스를 상속한 자식 클래스에서 그 내용들을 구체화 시켜야한다. 

추상화 클래스는 완성이 되지 않은 클래스 이므로 고유의 객체를 생성할 수 없다. 

추상화 클래스가 왜 쓰이는가?

이유는 이와 같다. 부모 클래스에 선언된 공통 기능 매소드의 로직, 사용법이 자식 클래스마다 다 다를 수 있기 떄문이다. 이 경우 부모 클래스의 매소드에 있는 내용들은 무의미하다. 그저 해당 매소드가 무엇을 뜻하는지만 표현하면 될 것이다. 

따라서 부모 클래스가 스스로 객체를 만들 일이 없고, 그저 자식 클래스를 묶는 하나의 범주로서의 역할을 할 경우 추상화 클래스가 적합하다.

+ 추상화 매소드 

추상화 클래스는 추상화 매소드를 가지고 있다. 

추상화 매소드란, 내용이 빈, 껍데기만 있는 매소드 이다. 해당 매소드의 내용은 자식 클래스에서 구체화 시켜야 한다. 

추상화 매소드는 추상화 클래스에서만 쓰인다.

abstract class 전자제품 {
    abstract void 전원기능();
}
 
abstract class 통신기기 extends 전자제품 {
    abstract void 통화기능();
}
 
abstract class 휴대폰 extends 통신기기 {
    abstract void 카메라기능();
    abstract void 게임기능();
}
 
// 상위 클래스가 모두 추상화 클래스, 아이폰 클래스에서 모두 구체화 
class 아이폰 extends 휴대폰 {
    전원기능() { ... }
    통화기능() { ... }
    카메라기능() { ... }
    게임기능() { ... }
    애플 제품 연동기능() { ... }
}

 

3. 점검

추상화란? 

제어 추상화란? 

-제어 추상화의 좋은 점 

데이터 추상화란?

-데이터 추상화의 좋은점(2)

 

추상화 클래스란? 

추상화 매소드란?

 

 

'Language > Java' 카테고리의 다른 글

[JAVA] Generics  (0) 2023.02.02
[JAVA] Interface (인터페이스)  (0) 2023.02.02
[JAVA]열거형  (0) 2023.01.29
[JAVA]final  (0) 2023.01.29
Chap07_13 참조(reference)  (0) 2023.01.29