오히려 좋아..

상황이 나쁘게만 흘러가는 것 같을 때 외쳐보자.. .

궁금한 마음으로 포트폴리오 보기

Paradigm/OOP-t

[객체 지향 프로그래밍] 1. 객체지향 프로그래밍이란?

junha6316 2021. 6. 25. 16:40

 본격적인 설명에 앞서서 

 앞으로 몇개의 포스팅동안 객체지향 프로그래밍(OOP, Object Oriented Programming)과 그것의 기본 원칙인 SOLID 원칙에 대해서 다뤄보도록 하겠다. OOP를 이해하려면 몇가지 중요한 개념을 알아야하는데 이 개념이 지나치게 추상적이다. 객체라는 말 자체도 일상적으로 사용하는 언어가 아닐뿐더러 OOP의 중요 개념들이 한번에 정의 내리기가 어렵다.

프로그래밍을 시작한지 얼마되지 않아 "객체 지향의 사실과 오해" 라는 책을 읽은 적이 있다.

 

이 책인데 꼭 읽는 걸 추천한다.

읽으면서  이게 철학책인지 기술서적인지 굉장히 혼란스웠다. 저자는 이상한 나라의 앨리스에서 나오는 등장인물을 통해 OOP에서 사용하는 개념인 캡슐화, 상속, 책임, 메세지와 같은 단어들의 개념을 하나씩 설명해준다. 물론 익숙한 이야기를 통한 비유를 사용해 한결 가볍게 느껴지지만 막상 프로그래밍을 하려고 노트북을 켜고 앉으면 그래서 뭐? 라는 생각이 든다. 다른 기술 서적처럼 기술의 개념과 코드가 일대일 매칭되지 않고 개념과 실제 사이의 괴리 때문에 코드를 작성할 때 코드의 어떤 부분OOP의 어떤 개념해당하는지 고민하게 된다.

 

선생님 저한테 왜 그러세요...

생각해보면 단순히 이것이 OOP의 문제라기 보다는 코딩 경험이 적기 때문에 발생하는 문제일 것이다. 개인적인 생각으로 OOP를 빨리 받아드릴 수 있는 방법은 수정의 번거로움을 느껴보는 것이다. 먼저 작은 서비스를 만들어보고 지속적으로 업데이트 해보는 것이다. 그 과정에서 반복된 노동으로 인한 깊은 빡침이 마음속에서 일텐데 이것이 몇번 반복되고 나서 다시 OOP에 관해 읽어 본다면 유레카!를 외칠 순간이 찾아올 것이다. 어쨌든 서론이 길었는데 아직 마음속에 수정을 하면서 생긴 깊은 빡침의 골짜기가 없으신 분들은 골짜기를 만들고 오시면 좋을 것 같다는 말을 하고 싶었다. 

같은 코드 멈춰!

그렇다면 OOP란 무엇일까?

 먼저 영어로 보자. 객체 지향 프로그래밍을 영어로 하면 Object Oriented Programming이다. 사실 Oriented가 지향으로 해석된게 좀 불만이긴 한데 정확히 말하면 주도가 더 맞는 표현같다. 다시 한번 해석해보자. 객체 주도 프로그래밍

즉 프로그래밍을 하는데 객체가 주도하는 프로그래밍을 하겠다는 의미이다. 그렇다면 객체는 무엇일까? (빠른 이해를 원하는 사람들은 바로 다음 장을 읽자) 이걸 설명하기 위해서 우리는 4살짜리 어린애가 되어야 한다. 이 나이 때의 아이들은 모든 것을 궁금하는데  "그게 뭔데?" 라는 질문을 입에 달고 산다. 자 이제 이런 질문 몇 번이면 객체가 무엇인지 알 수 있다.

그게 뭔데 같은 질문을 연속해서 몇번을 하다보면 아래처럼 점점 대답이 수렴하는 것을 볼 수 있다.

 

강아지는 무엇일까?

강아지는 네발 달린 인간과 친숙한 동물이다. 

그럼 동물은 무엇일까?

움직이는 생물을 지칭한다.
그럼 생물은 무엇일까?

살아있는 어떤 것을 의미한다. 

 

비단 강아지 뿐만 아니라 세상에 존재하는 어떤 개념도 꼬리에 꼬리를 무는 질문을 통해 "어떤 것"에 도달하게 된다.

바로 어떤 것이 객체다. 즉 모든 개념의 가장 추상화된 형태가 객체이다. 세상에 존재하는 모든 개념은 그 것을 기준으로 구체화된 형태와 추상화된 개념이 있다. 개를 기준으로 보면 개의 구체화된 형태는 리트리버이고 추상화된 개념은 동물이다. 이러한 관점에서 임의의 개념을 한 없이 추상화한다면 객체(어떤 것)이 된다. 

 

리트리버 <=> 개 <=> 동물 <=> 생물 <=> 어떤것(Object)

 

그렇다면 객체가 구체화를 거듭한다면 어떻게 될까? 모든 것이 될 수 있다. 세상에 존재하는 모든 것의 추상화의 끝이 객체라면 객체는 구체화를 통해 모든 것이 될 수 있는 것이다. 이러한 객체를 컴퓨터 언어로 구현한 것중 대표적인 것이 class이다. 즉 소프트웨어 제작에 필요한 어떤 것을 class를 구체화해 만들고 이것을 메인으로 프로그래밍 하는 것 이것이 객체지향 프로그래밍이다.

 

그래서 객체가 뭐라고?

(건너 뛰신 분들은 여기부터)

 그냥 후려쳐서 말해보면 객체는 class이다. 정확히 말하자면 class만이 객체는 아닌데 이 부분은 나중에 프로그래밍을 하면서 차차 알게 될 것이다. 그렇다면 정리해보면 객체 지향 프로그래밍은 프로그래밍을 클래스를 주로 사용해서 프로그래밍을 하겠다는 의미 정도로 해석할 수 있을 것 같다.

 

그렇다면 선생 프로그래밍을 하는데 왜 굳이 클래스를 써야됩니까? 여기서 OOP의 목적이 나온다. 바로 재사용성과 유지보수를 위함이다. 세상 그 누구도 반복적인 일을 좋아하는 사람은 없다. 그 뿐만 아니라 끊임없이 변화하는 비즈니스요구에 맞춰 소프트웨어 역시 빠르게 변화해야한다. 이런 반복적인 일은 비효율만 낳을 뿐이다.

 

정리하자면 객체 지향 프로그래밍은 객체(class)을 메인으로 프로그래밍을 하겠다는 일종의 프로그램 방법론이고 이것이 필요한 이유는 재사용성과 유지보수이다. 다음 글에서는 OOP의 십계명과 같은 SOLID 법칙에 대해 알아보도록 하겠다.

'Paradigm > OOP-t' 카테고리의 다른 글

[Design Pattern] 싱글톤 패턴(파이썬)  (0) 2021.03.25