JAVA/ETC

[객체 지향 4대 특성 - 캡!상추다] 1.추상화:모델링

자이구 2023. 11. 23. 15:21

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

 

객체 지향의 추상화와 그림으로서의 추상화, 그리고 사전적 의미로서의 추상화는 같은 의미이다. 

특히 공통 특성 / 공통 속성 추출에 주목해 보자.

  • OOP의 추상화는 모델링이다.
  • 클래스 : 객체 = 펭귄 : 뽀로로
  • 클래스 설계에서 추상화가 사용된다. 
  • 클래스 설계를 위해서는 어플리케이션 경계부터 정해야 한다. 
  • 객체 지향에서 추상화의 결과는 클래스이다. 

추상화는 모델링이다. 

추상화라 구체적인 것을 분해해서 관찰자가 관심 있는 특성만 가지고 재조합하는 것이라 정리할 수 있다.

객체 지향의 4대 특성은 클래스/객체를 통해 구현되므로 클래스와 객체에 대해 먼저 자세히 알아보자.

 

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

객체는 생물이건 무생물이건 속성과 기능을 가지고 있다고 볼 수 있다. 

 

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

세상에 존재하는 유일무이한 객체를 특성에 따라 분류해 보니 객체를 통칭할 수 있는 집합적 개념이 나오게 된다.

사람 박지성 = new 사람();
사람 김연아 = new 사람();

 

사람이라는 클래스(분류)를 이용해 유일무이하고 새로운 하나의 사람(객체)을 만들어 박지성/김연아(객체 참조 변수)이라는 이름을 지어준 것이다. 클래스를 이용해 object를 만들었다는 것을 강조할 때는 object라는 표현보다는 클래스의 인스턴스라는 표현을 쓴다. 

 

인간은 객체를 먼저 인식하고 그 다음에 클래스를 인식하게 되지만 하나님께서는 아담과 이브라는 객체를 만드시기 전에 클래스로서 사람이라는 개념을 먼저 가지고 계셨을 것이다. 

컴퓨터 프로그램을 만드는 과정에서 개발자는 바로 해당 어플리케이션의 창조자가 된다. 

그래서 우리도 객체 지향 프로그래밍을 할 때 클래스를 먼저 설계하게 된다.

근데 이게 추상화란 무슨 관련이 있을까?

 

사람이라는 클래스를 설계한다고 해보자. 사람 클래스를 만들기 위해 주변에서 보이는 실들, 즉 사람 객체들을 관찰해서 사람 객체들이 가진 공통된 특성을 찾게된다.

사람 클래스가 사람 객체들의 모든 특성을 나열할 수 있을까? 또 그럴 필요가 있을까?

 

여기서 또 하나의 개념이 바로 애플리케이션 경계, 컨텍스트이다.

  • 내가 창조하려는 세상은 어떤 세상인가? 
  • 내가 만들고자 하는 애플리케이션은 어디에서 사용될 것인가? 

만약 병원 애플리케이션 만든다면 사람은 환자를 의미하는 구체적인 이름으로 바꿀수 있고 클래스 설계도 달라질 것이다.

은행 애플리케이션을 만든다면 사람은 고객이라는 구체적인 이름으로 바꿀수 있고 클래스 설계 역시 달라져야 한다.

또한 병원 애플리케이션이라고 생각하니 사람 클래스에서 필요 없는 특성들이 보이기 시작한다. 

역시 애플리케이션 경계를 은행이라고 생각하니 필요 없는 특성들이 보이기 시작한다. 

 

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

IT관점에서 추상화는 구체적인 것을 분해해서 관심 영역(애플리케이션 경계)에 대한 특성만을 가지고 재조합하는 것으로 모델링이라 생각 할 수 있다.   

 

모델은 실제 사물을 정확히 복제하는 게 아니라 목적에 맞게 관심 있는 특성만을 추출해서 표현하는 것이다. 

바로 모델은 추상화를 통해 실제 사물을 단순하게 묘사하는 것이다. 

모델링은 객체 지향에서 클래스를 설계할 때 필요한 기법이고 또한 데이터베이스의 테이블을 설계할 때 필요한 기법이다. 

 

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


헷갈리는 용어 정리 

이름 다른 이름 사는 곳(T 메모리)
static 변수 클래스 [멤버] 속성, 정적 변수, 정적 속성 스태틱 영역
인스턴스 변수 객체 [멤버] 속성, 객체 변수 힙 영역
local변수 지역변수 스택 영역(스택 프레임 내부)

 

 

📖Reference

  • 도서 '스프링 입문을 위한 자바 객체 지향의 원리와 이해'