본문 바로가기
스프링

SPRING(6) - 객체 지향의 4대특성 2

by 고유빙글 2021. 7. 28.

우선 추상화 ( Abstraction ) : 모델링 이다.


그림에서 추상화를 보면 피카소등이 있다. 눈에 보이는 그대로가 아닌 대상의 특징 더욱 정확하게 묘사하기 위해 추상적인 방법으로 표현하는 기법이다. 

사전적으로 추상의 의미는 이러하다. 여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용. 

여기서 공통 특성 / 공통 속성 추출이라는 부분에 주목하여 보자.



추상화는 모델링이다. 관심있는 특성만 가지고 재조합하는 것.

객체 지향의 4대 특성은 클래스를 통해 구현된다. 또는 객체라고 할 수도 있다. 그래서 클래스와 객체에 대해 먼저 이야기해 보자. 



클래스는 실존하는 것이 아니기 때문에, 객체부터 살펴보는 편이 이해에 좋다.

 

우선 저자에 따르면, 객체보다는 개체가 실제의 개념과 더 유사하다 한다. 

Object의 사전적 의미를 보면 객체보다는 개체에 가깝다는 것이 주요골자이며, 개체의 국어사전적 의미를 보면.

 

1. 전체나 집단에 상대하여 하나하나의 낱개를 이르는 말

2. <생물> 하나의 독립된 생물체, 살아가는 데에 필요한 독립적인 기능을 갖고있다.

3. <철학> 단일하고 독립적인 통일적 존재, 철학 사상의 발전 과정에서 이 통일성은 물질적, 양적 측면 또는 정신적, 질적 측면 따위의 여러 관점에서 고찰되었다.

 

이러하다. 완벽하지는 않아 저자가 추가적인 설명을 첨언한다.

객체 : 세상에 존재하는 유일무이한 사물

 

또 이러한 객체는 생물이건 무생물이건 속성과 기능을 가지고 있다고 볼 수 있다. 무생물인 경우는 의인화해서 생각해 보면 속성과 기능을 가지고 있다는 말을 이해하기 쉬울 것이다. 

 

이에 대히반 클래스의 정의를 알아 보자.

 

클래스 : 분류, 집합. 같은 속성과 기능을 가진 객체를 총칭하는 개념.

 

세상에 존재하는 유일무이한 객체들 특성( 속성 + 기능 ) 에 따라 분류해보니 객체를 통칭할 수 있는 집합적 개념, 즉 클래스( 분류 ) 가 나오게 된다.

 

클래스를 반, 학급, 모임과 같은 뜻으로 이해하는 것과 같은 맥락이다. 객체들을 특성에 따라 분류했다는 의미가 된다.

 

만약 새로운 사람이 태어났다고 가정하고, 이걸 객체 지향 언어인 자바로 표현하면 이렇게 된다.

 

사람 홍길동 = new 사람();

사람 줄리엣 = new 사람();

 

사람이라는 클래스 ( 분류 ) 를 이용해 유일무이하고 새로운 하나의 사람 ( 객체 ) 을 만들어 홍길동 ( 객체 참조 변수 ) 이라는 이름을 지어준 것이다.

 

클래스는 영어로 class

객체는 영어로 object

 

그런데 클래스를 이용해 object를 만들었다는 것을 강조할 때는 object라는 표현보다는 클래스의 인스턴스 ( instacne ) 라는 표현을 쓴다. 

 

클래스를 객체의 설계도라고 설명하는 말은 이러한 과정에서 나왔다고 보면 된다. 붕어빵틀과 붕어빵은 이런 일면만 설명하는 메타포인데, 그걸 클래스와 객체 관계의 전부를 표현하는 것으로 착각하는 폐해가 계속되고 있다고 한다.

 

마치 창조론에서 

인간은 객체를 먼저 인식하고 클래스를 인식하게 되지만, 창조주인 하나님은 객체를 만들기 전에 클래스라는 개념을 갖고 있었을 것이다. 아담과 이브라는 객체를 만들기전에 사람이라는 클래스 개념을 갖고 있었을 것이다.

 

이처럼 개발자는 해당 애플리케이션의 창조자가 된다. 객체 지향 프로그래밍을 할 때 클래스를 먼저 설계하게 된다. 이러한 클래스를 만들기위해 특성 ( 속성 + 기능 ) 을 찾아보면 수도없이 많이 나오게 된다.

이러한 상황에서 새로운 개념이 나오게 되는데, 이를 애플리케이션 경계라 한다. 컨텍스트 ( Context )라고도 한다.

애플리케이션 경계를 알기위해서는 하나의 질문만 던져보면 된다.

" 내가 창조하려는 세상은 어떤 세상인가? "

 

조금 더 프로그래밍적으로 질문을 변경하면 

" 내가 만들고자 하는 애플리케이션은 어디에서 사용될 것인가? "

가 되겠다.

 

추상화란 구체적인 것을 분해해서 관심 영역에 대한 특성만을 가지고 재조합하는것으로

it용어를 이용해 변경하면

추상화란 구체적인 것을 분해해서 관심영역 ( 애플리케이션 경계, Application Boundary, Context ) 에 있는 특성만 가지고 재조합 하는 것 = 모델링

이 되겠다.

 

실제 사물을 정확히 복제하는 게 아니라 목적에 맞게 관심 있는 특성만을 추출해서 표현하는 것이다. 지구본을 보면 굴곡도 기후도 없으며 표현할 필요도 없다. 하지만 지구본은 지구를 모델링한다는 것이 와닿는 메타포일 것이다.

 

추상화에대해 설명이 길어졌는데, 추상화는 이러한 것이며 객체 지향에서 클래스를 설계할 때 필요한 기법이고, 데이터베이스의 테이블을 설계할때 필요한 기법으로 어떻게 모델링하느냐가 얼마나 중요한 부분인지 그렇기에 객체지향의 4대 요소중 하나인지에 방향을 잃지않고 접근하는 것이 중요하다 할 것이다. 

 

추상화의 개념을 넓게보자면 

상속을 통한 추상화, 구체화

인터페이스를 통한 추상화

다형성을 통한 추상화

역시 포함되며 이는 다음 부분들을 설명할때 같이 설명하도록 하겠다. 

 

중요한 부분을 다시 강조해서 살펴보자.

OOP의 추상화는 모델링이다.

클래스 : 객체 = 팽귄 : 뽀로로

클래스 설계에서 추상화가 사용된다.

클래스 설계를 위해서는 애플리케이션 경계부터 정해야 한다.

객체 지향에서 추상화의 결과는 클래스이다. 

 

자바는 개체 지향의 추상화를 어떻게 지원하고 있을까? 바로 class 키워드를 통해 지원하고 있다.

클래스와 객체 관계를 자바에서는 어떻게 표현할까? 클래스 객체_참조_변수 = new 클래스(); 로 표현한다.

 

클래스 = 객체_참조_변수의 자료형 ( Type )

객체_참조_변수 = 생성된 객체를 참조할 수 있는 변수

"=" = 할당문

new = 새로운

클래스 = 만들고자 하는 객체의 분류, 클래스의 인스턴스 즉, 객체를 생성하기 위해 객체 생성자를 호출

() = 메서드