프로그래밍 공부
작성일
2024. 1. 26. 17:34
작성자
WDmil
728x90

5.2 객체지향 철학

절차적 접근 방법에서 '이 프로그램은 무엇을 하는가?' 라는 질문을 던지는 것과는 달리, 객체지향 접근 방법에서는

'실세계의 객체를 어떻게 모델링하는가?' 라는 질문을 던진다. 객체지향 프로그래밍은 프로그램을 작업 단위로 쪼개는것 이 아니라 물리적 객체의 모델로 쪼갠다.

 

처음에는 이것이 너무 추상적으로 보이지만 물리적 객체를 클래스(Class), 컴포넌트(Component), 프로퍼티(Property), 행동(Behavio) 이라는 용어로 생각하면 명확해진다.

 

5.2.1 클래스

클래스는 단어 자체가 계층, 분류, 유형을 의미하며, 객체들을 구별한다. 예를 들어 오렌지를 생각해보자. 나무 열매 과일로서의 일반적인 오렌지를 저장하는 것과 방금 내 보드에 쏟은 주스를 지칭하는 것은 다르다.

 

'오렌지는 무엇인가?' 라는 질문에 답할 때는 오렌지라고 불리는 특정 클래스(class)를 이야기하게 된다. 모든 오렌지는 과일이고, 나무에서 자라며, 특별한 향과 풍미가 있고, 색깔을 보면 잘 익었는지 덜 익었는지 알 수 있다.

 

클래스는 이렇게 어떤 유형의 객체를 구별하여 정의한 것을 담는 그릇이다.

 

특정한 오렌지를 이야기할 떄는 어떤 객체를 지칭하는 것 이다. 모든 객체는 특정 클래스에 속해 있다. 내 책상 위의 특정한 오렌지는 객체다. 그리고 오렌지라는 일반적인 클래스에 속한다. 오렌지 클래스에 속하기 때문에 나무에서 자라는 열매라는 것을 알 수 있다. 그리고 진한 빛깔이라면 잘 익은 오렌지라는 것도 알 수 있다.

 

객체는 어떤 클래스의 실재하는 물건으로, 실사례라는 의미로 인스턴스(instance)라고 한다.

 

인스턴스는 어떤 클래스에 속하지만 같은 클래스에 속한 다른 객체와 구별되는 특징을 가진다.

 

좀 더 구체적인 예를 들기 위해 앞서 보았던 주식 종목 추천 애플리케이션을 다시 생각해보자. 객체지향 방법론에서 '주식시세'는 하나의 클래스가 된다. 왜냐하면 가격이라는 개념을 추상적으로 정하기 때문이다. 마이크로소프트사의 현재 주가와 같은 특정한 가격은 객체가 된다. 왜냐하면 주식시세 라는 클래스의 한 가지 실사례, 즉 인스턴스 이기 때문이다.

 

C언어 관점에서 보면 클래스와 객체는 데이터 타입과 변수에 각각 대응된다.

 

5.2.2 컴포넌트

비행기 같은 실세계의 객체를 살펴보면 작은 컴포넌트(component)들이 모여서 하나의 객체를 이루고 있음을 쉽게 알 수 있다. 동체, 제어판, 랜딩기어, 엔진 등 수많은 컴포넌트가 있다.

 

객체지향 개념에서는 객체를 이러한 컴포넌트로 생각할 수 있다.

 

이는 절차적 프로그래밍에서 복잡한 작업을 작은 철자로 쪼개는 것과 유사한 개념으로 객체지향 프로그래밍의 기본적인 아이디어 라고 할 수 있다.

 

컴포넌트는 본질적으로 클래스와 같다. 단지 좀 더 작고 특정 부분에 특화되었다는 점이 다르다. 잘 만들어진 객체지향 프로그램 이라면 Airplane클래스를 가지고 있을 것이다. 단, 비행기 의 모든 부분을 기술하면 너무 커지기 떄문에, Airplane클래스는 고나리 가능한 수준으로 작은 크기의 수많은 컴포넌트와 연계될 수 있    다. 그리고 각 컴포넌트는 또다시 더 하위 수준의 컴포넌트로 이루어질 수 도 있다. 예를들어 랜딩 기어는 비행기의 컴포넌트이면서, 바퀴를 하위 컴포넌트로 가질 수 있다.

 

5.2.3 프로퍼티

프로퍼티(property)는 속성이라는 뜻과 자산이라는 뜻을 모두 가지고 있다. 속성과 자산은 어떤 객체를 다른 것과 구분시켜준다. 다시 오렌지 예를 들면, 모든 오렌지는 오렌지색의 빛깔을 띠고 고유한 향을 지녔는데,  이 두 특징은 프로퍼티다.

 

모든 오렌지는 같은 프로퍼티 항목을 가졌지만 그 값은 다르다. 내가 가진 오렌지는 진한 오렌지 빛깔에 달콤한 맛을 지녔지만 다른 사람이 가진 오렌지는 푸르스름하게 설익은 빛깔에 신 맛일 수 있다.

 

프로퍼티를 클래스 수준으로 볼 수도 있다. 앞서 알아보았듯이 모든 오렌지는 나무에서 자라는 과일이다. 과일 클래스가 가진 프로퍼티가 있는 반면 특정 종류의 과일로 규정짓는 오렌지 빛깔 프로퍼티도 있다. 클래스의 프로퍼티는 해당 클래스에 속한 모든 객체가 공유한다. 객체의 프로퍼티는 동일클래스의 다른 모든 객체와 항목이 공유되기는 하지만 그 값은 다르다.

 

주식 종목 추천 예에서 주식 시세는 회사이름, 종목번호, 현재 가격 등 여러가지 객체 프로퍼티를 가진다.

프로퍼티는 어떤 객체를 설명하는 특징으로, '무엇이  이 객체를 다르게 하는가?' 에 대한 답을 준다.

 

5.2.4 행동

행동(Behavior)'이 객체는 무엇을 하는가?' 또는 '이 객체를 이용하면 무엇을 할 수 있는가?' 에 대한 답을 준다. 오렌지 예에서 딱히 오렌지가 크게 행동할 것은 없어 보이지만 이용될 수 는 있다. 한 가지 예로 먹히기가 있다. 다른 프로퍼티와 마찬가지로 행동도 클래스 수준 또는 객체 수준으로 생각할 수 있다. 모든 오렌지는 거의 같은 방식으로 먹힐 수 있다. 하지만 오렌지로 경사면에서 굴리기를 한다면 모양이 아주 둥근 것과 평편한 것은 굴러가는 행동이 제법 다를 것 이다.

 

주식 추천 예제는 좀 더 현실적인 행동 예를 보여준다. 절차적으로 생각할 때 각 주식 시세를 분석하는 작업은 함수로 다루었다. 이를 객체지향적으로 생각하면 주식 시세 객체가 스스로를 분석하도록 할 수 있다. 분석작업이 주식 시세 객체의 행동이 되는 것이다.

 

객체지향 프로그래밍에서는 절차를 이루던 함수들이 객체로 옮겨진다. 객체의 행동과 그들의 연동 방식을 정의함으로써 객체지향 프로그래밍은 코드를 데이터와 연계하여 연산하는데 훨 씬 더 풍부한 메커니즘을 제공한다.

 

5.2.5 통합

이런 개념들을 주식 추천프로그램에 적용하여 객체지향 방식으로 다시 디자인 해보자.

 

이미 이야기했듯, '주식 시세' 클래스를 만드는 것을 출발점으로 하자. 시세 목록을 얻기 위해 프로그램은 주식 시세 그룹 개념이 필요하다. 이러한 그룹을 보통 컬렉션(Collection)이라고 한다. 컬렉션을 이용해서 '주식 시세 클레스' 에서 작은 단위의 시세 값으로 이루어진 시세 목록을 갖게 하면 더 좋은 디자인이 된다.

 

프로퍼티로 넘어와서 컬렉션 클래스는 실제 전달받은 시세 목록을 프로퍼티로 가진다. 이 외에도 시세를 가져온 정확한 날짜와 시간을 추가적인 프로퍼티로 가질 수 있다. 행동으로는 '주식 시세 컬렉션' 을 가져오기 위해 서버에 요청하고 시세 목록을 정렬하는 것이 있다. 이러한 작업은 '시세 가져오기' 행동으로 한다.

 

주식 시세 클래스는앞서 이야기 한 것처럼 회사 이름, 종목 번호, 현재 가격 등을 프로퍼티로 가지고, 시세 분석을 행동으로 가진다. 사기나 팔기를 추가적인 행동으로 가질 수도 있다.

 

다이어그램으로 컴포넌트 간 관계를 나타내면 더 이해하기 쉽다.

또는 프로퍼티 목록과 행동을 테이블로 만드는것도 클래스를 시각화하고 생각을 정리하는 좋은 방법이다.

클래스 연관된 컴포넌트 프로퍼티 행동
오렌지 씨앗, 주스, 과육 색, 풍미 먹기, 굴리기, 던지기, 껍질 벗기기, 쥐어짜기
주식 시세 컬렉션 개별 주식 시세 항목들 각 시세 값, 타임 스템프, 시세 개수 시세 가져오기, 여러 기준에 따라 시세 정렬하기
주식 시세 ㅇ벗음 회사 이름, 종목 번호, 현재 가격등 분석하기, 주식사기, 주식팔기
728x90