[TIL] # 21 OOP 객체지향 프로그래밍

ddalkigum·2020년 12월 20일
1

TIL

목록 보기
21/50
post-thumbnail

Object Oriented Programming

객체 지향 언어

객체를 지향하는 언어

컴퓨터 패러다임중 하나로 프로그래미에서 필요한 데이터를 추상화 시켜서 상태와
행위를 가진 객체를 만들고, 그 객체간의 상호작용을 통해 로직을 구성하는 프로그래밍 방식

이렇게 말로만 들어서는 쉽게 이해가 가기 어렵습니다

우선 클래스의 간단한 예를 들면

저 같은 경우는 설계도, Blueprint를 만든다고 이해를 했습니다

자동차를 만들기 위한 클래스를 만들고

문, 바퀴, 창문이 4개인 포르쉐를 만든다면

porshce = Car(kinds = "porsche", doors = 4, wheels = 4, windows = 4)

이런식으로 만들어 주는 거죠, blueprint 하나를 가지고 여러가지 행동을 할 수 있고,
만들고 싶으면 만들 수 있게 도와주는게 클래스입니다


등장하게 된 이유?

지금까지 여러 프로그래밍 방식이 존재했는데
현재에는 왜 객체지향형 프로그래밍을 선호하는지 알아 보기 전 왜 등장했는지 먼저 보겠습니다

0, 1로 프로그래밍

앨런 튜링에 의해 처음으로 만들어진 프로그래밍이 가능한 컴퓨터 콜로서스

최초 컴퓨터는 0, 1 로 기계와 대화하는
전류가 통하면 1, 안통하면 0 을 시작으로

혹시나 이런 배경이나, 컴퓨터가 어떻게 작동하는지 궁금하시면
"cs50"이라고 검색하시면 자료가 많이 나옵니다
제가 공부시작 할때 제일 처음 들었던 강의인데
번역판이 필요하시면 네이버 edwith에서 무료로 제공하고 있습니다

이렇게 CPU가 이해 할 수 있는 기계어를 사용하였고
0 과 1만을 사용하기 때문에 프로그래밍 자체가 어렵고,
당연히 유지보수는 거의 불가능에 가까웠습니다

웹 어셈블리어

이것또한 저급언어지만, 0과 1로 프로그래밍을 하던 방식에서 많이 발전 했습니다

기계어 문법은 그대로 가지고 가되, 최소한의 알파벳으로 치환한 언어입니다
어셈블러라는 치환기가 단어들을 1 과 0으로 치환하여 CPU가 이해할 수 있도록 합니다

구조적 언어 - 고급언어

흐름제어문 ( if, while, for ) 이 존재 하지 않고,
goto문 만을 이용해서 프로그래밍이 됩니다

goto문은 줄을 이동시키는 명령여

여전히 프로그래밍을 편하지 않습니다

여기에 흐름제어문과 함수의 개념을 추가한 구조적 언어가 등장합니다
사람이 쓰는 언어와 비슷하게 만들고, 컴파일러 를 통해 번역해서
CPU가 알아 들을수 있게 만들어 줍니다

함수를 이용해 톱니바퀴가 돌아가듯 프로그래밍을 해줍니다

스파게티 코드

이렇게 goto문을 통해 줄을 계속 이동시키다 보면
마치 스파게티처럼 코드들이 꼬이게 됩니다

이렇게 탄생한 언어가 스파게티 코드입니다

객체지향 프로그래밍

이렇게 함수와 함수가 맞물려진 프로그래밍을 하다 보면 불편한 점이 있습니다
바로 유지보수가 굉장히 힘들다는 건데, 변수명도 변수명이지만

함수를 하나하나 찾아서 고쳐야 한다는 문제점이 있습니다

이러한 문제점을 해결하기 위해 OOP 즉, 객체지향 프로그래밍이 등장하게 됩니다


객체지향의 등장 배경을 알아봤고
이제부터는 과연 객체지향의 장점은 무엇이고, 단점은 무엇인지
특징과 함께 알아보겠습니다

객체지향언어의 특징

언제나 그랫듯이 장점이 있으면 단점도 있고,
이걸 해결하기 위한 프로그래밍 방식이 언젠가는 또 등장할겁니다
하지만 이런 흐름과 장단점을 알고있으면 왜 등장하게 됬는지 금방 이해하실 겁니다

총 5가지로 나누어서 보통 객체지향언어의 특징으로 말합니다

  1. 추상화
  2. 캡슐화
  3. 은닉성
  4. 상속성
  5. 다형성

추상화

처음 등장했던 Car() 라는 예를 보면

우리는 Car() 라는 클래스를 이용해서

포르쉐를 만들수도
트럭을 만들수도
아니면 모닝을 만들수도 있습니다

3가지의 공통된 특징은 자동차라는 것인데요, 바로 셋의 공통된 부분을 묶어
클래스로 만들어 주는 겁니다

만약에 친구랑 얘기를 하는데

친구 : 나 이번에 차 새로 샀어 

나 : 어떤거 샀는데??

친구 : 어... 나 차샀어 

대화가 이상하긴 한데, 보통 추상적이라 하면 친구의 말처럼
우리가 차라는 것에 대해서 이해는 할 수 있지만,
그것의 이름이 뭔지, 종류가 뭔지 이해할 수 없습니다

이렇게 추상적인 공통된 부분을 묶어 주는걸 추상화라고 합니다

은닉성

파이썬에서는 은닉성을 지원하지 않습니다

만약에 자바언어의 경우를 예로 들면

private, public, default 등을 쓰는 걸 본적이 있으실텐데

public

외부에서 접근이 가능

private

외부에서 접근 불가능

default

동일 패키지로 묶인 클래스내에서만 사용 가능

이렇게 캡슐안에 들어있는 정보들을 어디 까지 공개를 할 것인지
정해주는 것이 은닉성입니다

그렇다면 캡슐은 무엇인지 볼게요

캡슐화

코드를 재수정 없이 재활용 하는걸 의미합니다

드래곤볼에 보면 호이포이 캡슐이라고 나오는데

저는 이걸 딱 떠올렸거든요

개념은 비슷합니다.

만들어 놓은 기능이나 특성을 마치 호이포이 캡슐처럼 캡슐안에 넣어놧다가 사용하는 것입니다

함수의 경우 연결되어 있거나, 분산되어 있기 때문에 재사용이 어렵습니다
변수명도 생각을 해주어야 하고요

그치만 이렇게 캡슐이라는 클래스에 담겨진 여러 기능, 특성을 사용함과 동시에
변수명에서 한층 더 자유로워 지기 때문에

유지보수가 절차지향형 프로그래밍에 비해 수월합니다

다른 말로는 번들링 ( bundling ) 이라고도 합니다

상속성

절차지향형 프로그래밍의 경우도 라이브러리를 이용하여
남의 코드를 가지고 올 수는 있지만, 내가 사용하고 싶게 커스터마이징을 하기가 어렵습니다

함수하나를 고치기 위해 다른 함수를 찾아 가야 하는 경우도 있고,
변수명이 겹쳐 사용할때 고칠 부분이 생길 수도 있습니다

이렇게 고치다보면 버전이 맞지 않아 동작 하지 않는 경우도 생깁니다

이러한 단점을 보완하기 위한 객체지향의 특성이 상속성입니다

상속성의 특징

부모 클래스의 속성과 기능을 이어 받아 사용할 수 있게 해줍니다

기능을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능을
수정하여 재사용할 수 있게 해줍니다

이렇게 원래 판매를 하던 자동차 업체의 경쟁업체에서

이벤트를 한다고 "우리는 Car라는 곳보다 마력을 추가해서 주겟다"
말을 하고 OtherCar는 Car라는 클래스를 상속받아서

이벤트를 진행합니다

부모 클래스에서 사용하던 horsepower를 그대로 가지고와서
자식클래스에서 사용을 할 수 있는 것이 상속성의 특징입니다

다형성

이렇게 가지고온 부모클래스의 horsepower를 상황에 맞게
수정을 해서 즉, overriding 혹은 overloading 을 통해 다른의미로
바꾸어서 사용 할 수도 있는데 이를 다형성 이라고 합니다

오버로딩 Overloading

같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 갯수를 다르게하여
매개변수에 따라 다르게 호출 하는 것

python에서는 오버로딩의 경우 정식적으로 지원해주지는 않는다

-> 오버로딩의 구현은 가능하지만, 남발하게되면 코드가 복잡해지고, 난해해짐

오버로딩은 제가 제대로 이해를 하지 못해서.. 좀 더 공부하고
자세한 내용 올려보겠습니다 😥😥😥

오버라이딩 Overriding

부모클래스의 메서드와 같은 기능, 이름, 매개변수를 재정의 하는것

오버라이딩의 예를 한번 보고 갈게요

부모클래스에서의 horsepower를 가지고 와서 완전 새롭게 바꿔 버립니다
이렇게 부모클래스에서의 메서드를 자식클래스에서 새롭게 정의하거나
있는 기능을 바꿔서 정의 하는 걸 Overriding이라고 합니다


OOP의 장단점

앞에 부분에서 OOP의 특징을 살펴봤다면 이번엔 장단점을 보겠습니다

장점

  1. 코드의 재사용이 용이하다
  2. 개발시 업무 분담이 쉽다
  3. 생산성 향상

상속을 이용하여 프로그래밍을 진행,
메서드를 오버라이딩하면서 진행이 가능하기 때문에 코드를 재사용하기 용이합니다

개발시에 각각의 클래스가 독립적이기 때문에 업무분담이 가능하고,
개발시에 업무분담이 수월해짐

이렇게 업무분담이 이루어 지고, 코드 재사용이 용이해지면서
당연히 생산성이 향상됨

단점

  1. 시간이 오래걸린다

시간이 오래걸리는 이유는 굉장히 직관적이다
여러가지 이유가 있고, 여러가지 관점이 있는데

계획을 짜는데 오래걸린다

함수같은 경우 만들고 이어주고, 부족한 부분이 있으면
살짝 건드려 주면 되지만, 클래스를 만든다는 것은
공통된 부분이 무엇인지, 전체적인 설계도를 짜는 일을 하는 것이기 때문에
시간적인 부분이 오래 걸린다

실행시에 시간이 오래걸린다

프로젝트가 커지고, 여러 사람이 참여하게 되면
클래스내에서 중복된 메서드들이 생겨 날 수 있고,
용량이 커지게 되면서 이로인해 실행시간이 늘어날 수 있다


사과

이건 여담인데,,, 애플의 사과한입 베어문 로고는
앨런 튜링을 위해 만들어 졌다는 소문이....

많이 돌긴했지만 애플은 앨런튜링이 아닌 뉴턴을 존경하는 의미에서 사과를 사용한 것으로 보인다

컴퓨터와 관련해서 사과와 관련된 에피소드들이 몇가지 있는데
애플과 사과에 관련된 얘기가 있어서 가지고 왔어요
궁금하신 분들은 보세요 🚀

https://biz.chosun.com/site/data/html_dir/2015/05/29/2015052901882.html


이렇게 처음 프로그래밍의 시작부터해서

지금... 현재는 왜 OOP를 선호하게 됬는지 알아봤습니다

이것 또한 언젠가는 바뀔 패러다임이지 않을까 생각합니다
그렇기 때문에 왜 OOP가 등장했는지 아는 것은 중요합니다

평생공부해야하는 개발자 이기에,
왜 등장했는지, 어떤 단점이 있는지 알아야
다음에 무언가가 등장했을때 유연하게 대처 할 수 있을거라 믿습니다

글을 일고 제 주관적인 내용이 많기 때문에 정확하지 않은 내용이 있을 수 있습니다
긴 글 읽어 주셔서 감사하고, 혹시나 틀린부분이 있다면
열심히 지적해주세요 😁

참고한 곳

객체 지향언어의 탄생 배경
https://m.blog.naver.com/PostView.nhn?blogId=ghen4268&logNo=110184188778&proxyReferer=https:%2F%2Fwww.google.com%2F

나무위키
https://namu.wiki/w/%EA%B0%9D%EC%B2%B4%20%EC%A7%80%ED%96%A5%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

profile
딸기검 -본캐🐒 , 김준형 - 현실 본캐 🐒

0개의 댓글