본문 바로가기

코딩/코딩에서 중요한 개념들

코딩초보가 이해하는 객체지향

반응형

[객체지향] Object-Oriented Programming 핵심 개념의 이해 — Peter의 우아한 프로그래밍 (tistory.com)

 

[객체지향] Object-Oriented Programming 핵심 개념의 이해

배경 데이터 흐름(Flow)에 기반한 절차지향적 프로그래밍 방법은 복잡한 로직을 갖는 큰 규모의 소프트웨어 개발에는 적합하지 않습니다. 하드웨어 성능이 폭발적으로 성장하면서 요구되어지는

gracefulprograming.tistory.com

(219) [10분 테코톡] 🍟 웨지의 OOP - YouTube

 

 

많은 글과 영상을 보고 객체지향을 공부했습니다만 머릿속에 남는건 위 두가지 입니다. 

 


 

Dart는 객체지향언어

Dart는 객체지향언어이다. 그래서 C언어, JAVA 언어를 배웠던 개발자라면 Dart는 쉽게 배운다. 

하지만 나는 Flutter, Dart가 나의 첫 개발언어이다. 기존에 부가세 계산기를 만들 때에는 클래스도 없이 

변수들로만 선언해서 코드를 짰다. 어찌어찌 돌아가고는 있지만 이것보다  복잡한 어플을 만들 때에는 객체지향 개념이 필요하다. 

 

자기 계발서를 읽다 보면 큰 문제보다 작은 문제부터 해결하라는 조언이 많다. 

 

 

객체지향은 주어진 문제를 작은 문제들로 쪼개고 작은 문제들을 하나씩 해결해가면서 큰 문제들을 해결하는 바텀업 방식이다. 

 

 

 

객체지향에서 중요한 개념들이 있다. 

1. 추상화 - 객체와 실제 물건의 기준

2. 캡슐화  - 클래스의 책임분담

3. 상속  - 다형성

 

 

객체지향의 중요한 세 가지 개념

 

1. 추상화 

피카소의 위 작품은 황소를 자세하게 관찰하고 황소 고유의 특성만을 남기는 프로세스이다. 

이게 바로 추상화의 핵심이다. 마지막 8번째 사진을 보면 황소 고유의 특징만 남겨 놓았다. 

이 사진으로 모든 설명이 된다. 

 8번 황소는 class, 1번 황소는 객체

이렇게 외우면 쉬운 것 같다. 

 

위 배민영상에서 나온 치킨집 배달로  설명을 하자면 우리는 치킨을 먹고 싶으면 치킨가게라고 생각을 먼저 하게 된다. 이때 떠오른 첫 번째 "치킨가게"라는 추상된 개념이 바로 class이다.  그러면 어느 치킨가게를 먹어야 할지 고민을 하게 된다. BHC? 굽네? 배민랭킹맛집?  특정된 가게들이 바로 객체가 된다. 

 

추상화의 가장 큰 장점으로는 확장성이다.  위에 언급한 굽네치킨을 class로 만들게 되면 굽네는  튀긴 치킨을 팔지 않는다. 즉 튀긴 치킨에 관한 주문을 받을 수 없다. 

튀긴 치킨의 주문을 받기 위해서는 새로운 class가 필요하게 된다. 

 

하지만 추상적인 개념 "치킨가게"는 다르다.  

구운 치킨, 튀긴 치킨, 삶은 치킨, 차가운 치킨 등등 온갖 종류의 치킨을 아우를 수 있다.

 

 

2. 캡슐화 : 클래스의 책임분담

 

보통은 캡슐화라고 나오지만, 개인적으로 책임분담이라는 용어가 더 어울리는 듯하다. 

위 치킨가게라는 추상된 개념으로 클래스를 만들었다. 

 

보통의 치킨가게에서는 아래와 같은 일이 매일 일어난다. 

 

1. 재료를 손질한다.

2. 주문을 받는다. 

3. 닭을 튀긴다. 

4. 배달을 간다. 

 

 

그리고 만약 사장 혼자서 운영하는 1인 매장이라면 하루에 팔 수 있는 매출의 양이 최대 100만 원이었다.

 

1인 사장은 더 많은 매출을 올리고 싶다. 그래서 직원 3명을 고용하고, 배달업체를 사용하기로 했다. 

 

직원 1은  재료를 손질한다.

직원 2는 주문만 받는다. 

직원 3은 닭만 튀긴다. 

배달대행업체가 배달을 한다. 

사장은 "치킨가게"가 잘 운영되는지 감시한다. 

 

이렇게 했더니 하루 매출이 600만 원을 팔았다. 

 

여기서 직원 1, 2,3, 배달대행업체는 "치킨가게" 클래스의 캡슐화된 상태이다.

 

 

이 치킨가게에서 치킨을 주문한 외부 클래스인 고객은 "아 여기는 직원이 4명이고, 배달업체를 사용하는구나" 생각하고 주문하지 않는다. 

파는 메뉴와 가격만 알 수 있다. 

 

치킨집 사장도 외부 클래스인 고객에 관해서는 주문한 내역과, 주소밖에 알지 못한다.  치킨이 정해진 주소에 도착했지만 고객이 부재중이다.

사장은 고객이 부재중인  이유를  알 수 없다. 이러한 개념을 은닉개념이라고 한다. 

 

 

캡슐화: 책임분담 의 목적은 

내부 클래스의 응집도를 올려서 효율을 높이고(매출이 100만 원에서 ->600만 원),

외부적으로는 원활한 프로세스 진행을 위해  다른 클래스와의 결합도를 낮추는 작업이다. (고객이 집에 부재중이다.  왜 고객이 집에 없는지 알 수 없다. 하지만 치킨은 도착한다.  )

 

코드를 칠 때 public, _private 개념이 여기서 나온다. 

 

 

 

 

 

 

 

 

3. 상속 -다형성

 

객체지향의 가장 핵심적인 부분이다. 

 

상속에서 가장 중요한 건 

여기서 B는 class, A는 객체이다.

 A는 B이다. 

 

   A                   B

"굽네치킨은 치킨가게이다" 

"청양고추마요치킨은 치킨이다"

"팔과 다리는 구부러지는 기관이다"

"바퀴는 동그라미이다"

"붕어빵은 빵이다"

"짜장면은 중식이다"

"고추장 양념은 소스이다"

 

 

 

흔히 상속에 대해 실수하는 부분이 아래와 같다. 

아래와 같은 개념으로 상속을 하게 되면 후에 큰 혼란을 줄 수 있다. 

 

B는 A를 가지고 있다 

      A                    B

"고추바사삭은 치킨가게이다"  

"청양고추마요치킨은 치킨가게이다"  

"팔과 다리는 사람이다"  

"바퀴는 자동차이다" 

"붕어빵은 붕어빵틀이다" 

"짜장면은 중국집이다" 

"고추장 양념은 제육볶음이다" 

 

 

 

 

 

위에 개념이 먼저 잡혀야 다음 다형성 개념을 사용할 수 있다. 

 

BHC는 치킨가게이다

굽네는 치킨가게이다

고봉삼계탕은 치킨가게이다

 

라는 A는 B이다의 개념을 이용해 아래 클래스를 만들었다. 

각 상속받은 BHC, 굽네 , 고봉삼계탕에 cook();이라는 공통된 함수를 만들었다. 

하지만 쿡 만으로는 상속받은 클래스들의 특징을 살릴 수 없다. 이때 등장하는 게 

재정의 (오버라이딩)이다.  공통된 cook(); 함수를 오버라이딩을 통해 

각 클래스만의 고유한 튀기기, 굽다, 삶다 함수를 사용할 수 있다. 

 

 

 

 

                          치킨가게 클래스

 BHC (상속 1)        굽네  (상속 2)       고봉삼계탕(상속 3)

cook();                  cook();                  cook();      

 

 재정의 (오버라이딩) 해서 쿡 밑에 각 음식점만의 고유한 스킬을 사용 가능하다. 

 

튀긴다.                     굽다.                    삶다.

 

 

 

 


배운 점을 토대로 원가계산기 클래스 구성 

 

재료 가격의 합은 레시피가격이다.

                                     

 

                                                      class 레시피 가격(이름, 가격)

                                              투입된 레시피양 * 재료들의 가격();

 

                                                    class 재료 가격의 합(이름 가격)

                            

                                                           재료들의 가격();

 

아래는 인스턴스화시킴

        재료 1 (이름, 중량, 가격)   |   재료2 (이름, 중량, 가격)    |   재료3 (이름,중량,가격)

                      가격/중량();                    가격/중량();                          가격/중량();

     

 

 

 

 

 


결론 

객체지향을 공부하기 위해 본 블로그 글과, 동영상이 많다. 

도서관에 있는 C, 자바 책을 보기도 했다. 

 

바나나 클래스가 있고  내 손에 있는 바나나는 객체이고, 붕어빵과 붕어빵틀은 뭔 관계며 

로봇 1과 로봇 2는 왜 나오는지.... 

뭐랄까... 내겐 더 혼란만 왔다. 

 

 곰곰이 생각해 보았다. 객체지향은 내게 뭘까...

그래서 내린 결론은 

 

객체지향은 코딩을 하기 위한 하나의 도구일 뿐이다. 

코딩을 하는 이유는 문제해결을 위해서이다. 

 

내가 어떤 문제를 해결하는지가 먼저 생겨야 한다. 그 이후에 

무엇이 클래스가 되고 무엇이 객체인지를 결정해야 한다. 

 

도구에 집착하지 말자. 문제에 집중하자. 

 

객체지향 끝.

(내가 객체지향을 100% 이해 못 했다 하더라도....)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형