jh.nrtv

객체지향 프로그래밍(OOP) 이란? (feat : 절차지향 프로그래밍, 함수형 프로그래밍) 본문

javascript

객체지향 프로그래밍(OOP) 이란? (feat : 절차지향 프로그래밍, 함수형 프로그래밍)

wlgus3 2023. 4. 12. 00:23

들어가며

 

객체지향 프로그래밍을 공부한 적은 있고 나름대로 어렴풋이 알고는 있었으나, 

 

제대로 알고 이해하는 것은 아니기에 해당 개념을 만날 때마다 찜찜했다.

그러다가 좋은 자료( 생활코딩님의 영상 )를 찾은 김에 다시 공부하고 정리하게 되었다. 

 

 

 

Procedural Programming (절차지향 프로그래밍)=> OOP와 대비돼서 이야기되는 방식 

특징 

1. 명령이 순차적으로 진행된다 -> 컴퓨터의 처리구조와 유사하기에 실행 속도가 빠르다.

2. procedural (함수) 의 기능을 주요하게 사용해서 프로그래밍한다.

 

 

 

-> 이와 같이 언어에따라서 procedural은 다양하게 불리우는데 우리에게 가장 익숙한 것은 function이다 .

 

 

 

✅ Procedural Programming VS Objective Oriented Programming 

 

두 개념은 대립되는 개념이 아니라, 

Procedural Programming 의 기반 위에 Objective Oriented Programming 이 탄생 !! 
  =>상호 보완적인 관계 

 

가장 중요한 차이는 PP에는 함수가 있었고, OOP에는 함수도 있지만 함수보다 더 큰 정리정돈 도구객체가 존재한다. 

 

쉽게 말하면

정보가 많아짐에 따라 기록할 필요성이 생기고,

기록이 많아지면 그루핑 하기 위해 을 만들고, 

책-> 책장 -> 서재 -> 도서관 -> 인터넷 (전 세계적인 범위의 도서관)

의 형태로 정보가 늘어났다. 

 

어떠한 것의 양이 늘어나면 완전히 다른 관리체계가 필요하다. 

 => 완전히 다른 관리체계가 바로 '객체'

 

 

🔸 복잡도

시간이 지날수록 프로그램의 복잡도가 기하급수적으로 높아진다.

 

 

인간이 담을 수 없는 복잡도에 다다른다면 대응방법은 무엇인가?

1. 첫번째는 저 그릇에 담을 내용물을 버리는 것

2. 두번째는 이미 있는 기능을 잘 정리정돈 해서 그 기능을 압축하는 것

 

장난감이 너무 많아 어지럽다면 수납상자에 담아서 '장난감'이라고 붙여놓으면 된다.

기능을 정리할 수납상자 와 같은 역할을 했던 것이 바로 function(함수)였음.

서로 연관된 로직들을 이 함수라는 수납상자 를 이용해서 그 안에 담았다.

저 함수에 내용에 대해선 우리는 더 이상 관심을 가질 필요가 없이 그냥 함수를 호출하는 것을 통해서 사용할 수 있게 되었다.

 

 

만약 함수들이 여러개가 생긴다면? 

복잡성이 증대된다.

 

 

🔸 객체지향 프로그래밍 개념의 등장 

이러한 복잡도를 낮출 근본적인 해결책으로 제시된 여러 가지 방법들이 있는데 그중에 하나 그리고 아주 폭넓게 사용되고 있는 것 중에 하나가 바로 객체지향 프로그래밍 이다.

서로 연관되어 있는 함수들을 정확하게는 서로 연관되어 있는 함수와 변수들을 -> '객체' 라고 하는 것으로 그룹핑 한다.

마치 박스 에다가 저것들 넣는 것과 똑같음 ! 

 

 

그 객체에다가 이름을 'toy'라고 붙이고, 

함수들을 호출할 때에는 아래와 같이  toy.do1() 의 형식을 사용하게 된다. 

연관된 함수들을 다른 함수 들과 구분 ,분류 ,정리 정돈하는 것이 객체 지향의 핵심적인 아이디어이다.

즉, 복잡성을 낮추고 /서로 연관된 함수와 변수를 그룹핑하고 /이름을 붙여서 사용하는 것

 

 

🔸 객체지향 프로그래밍의 4가지 특징 

1) 추상화 : 공통적인 속성이나 기능을 묶어서 이름을 붙이는 것
2) 캡슐화 : 데이터를 은닉하고 데이터 기능을 노출시키지 않음.
3) 상속성 : 상위 부모 객체의 속성과 특징을 하위 객체가 물려 받는 것.(만약 어떠한 객체가 이미 존재하는 객체의 특성을 가지고 있다면, 기존 객체의 특성을 상속시켜 만들 수 있음.)
4) 다형성 : 같은 함수가 있어도 매개변수에 따라 각자 다른 일을 하는 것

 

 

✅ (추가) 함수형 프로그래밍?

함수형 프로그래밍은 OOP와 자주 비교되는 패러다임이다. 

함수형 프로그래밍은 가급적 부수효과를 멀리하고 순수함수를 만들어 1급함수들의 특징들을 이용해서 인자와 반환값으로 사용하는 활용을 통해서 단순하고 결함이 적은 단방향성 파이프라인을 함수들의 조립을 통해 구축한다는 개념이다. 

 

- 순수함수? 동일한 입력값에 대해서 동일한 리턴을 반환하며 외부에 영향을 받지도, 미치지도 않는 함수

 

🔸 JavaScript에서 함수형 프로그래밍은 어떤 의미일까?

기본적으로 JS의 창시자가 JavaScript를 함수형 프로그래밍으로 만들고자 했으나, 당시 주류였던 객체지향 프로그래밍 의 요구를 반영해 java를 따라서 문법체계를 만들었다.

따라서 문법은 java와 유사하나, 내부 매커니즘은 함수형 프로그래밍을 기초로 만들어지게 되었다. 

 

따라서 초기 JS에는 class 키워드가 존재하지 않았고, prototype을 이용한 객체지향 방식과 this 동적 바인딩이라는 개념이 함수형 프로그래밍 기반에서 객체지향을 흉내낼 수 있도록 만들었기 때문에 JS는 온전한 객체지향적 방식으로 개발하기 좋은 언어는 아니었다. 

 

또한 객체지향 방식은 번들의 크기를 줄이는 minify , 트리쉐이킹 등이 불가하기에 JS에는 함수형 프로그래밍이 더 적합했다.

 

결정적으로 class, this 등이 문법적으로 불편하고 가독성을 해쳤기 때문에 React 등의 프레임워크 등에서도 함수형 프로그래밍을 이용해서 this등의 키워드를 사용하지 않고도 구현이 가능하도록 Hooks 등을 제공하고 있으며 1등 프레임워크가 될 수 있는 기반을 마련하기도 했다.

 

 

 

- 함수형 프로그래밍은 객체지향에 비해 다음과 같은 이점을 가집니다. (대부분 '순수함수'로 인한 이점이다.)

1. 순수 함수를 사용하기 때문에 코드가 단순해집니다. 상태를 저장하는 객체가 없기 때문에, 코드를 이해하기가 쉽습니다.
2. 순수 함수를 사용하기 때문에 테스트가 쉬워집니다. 함수의 출력을 예측할 수 있기 때문에, 테스트 작성이 간단해집니다.
3. 순수 함수를 사용하기 때문에 코드가 부작용이 없어집니다. 순수 함수는 외부 상태에 의존하지 않기 때문에, 부작용을 일으키지 않습니다.

 

- 객체지향은 함수형 프로그래밍에 비해 다음과 같은 이점을 가집니다.

1. 완성된 객체는 관심사가 같은 것으로 묶여있기 때문에 이해하기 쉽고 훨씬 더 사용하기 쉽습니다. 일례로 IDE에서 객체에 .만 찍어봐도 무슨 일을 할 수 있고 무슨 값이 있는지 알 수 있는 반면에 함수형 프로그래밍은 각 함수들을 다 알고 있어야 하며 함수간 관련도를 인자만 가지고 파악하기가 쉽지 않습니다.
2. 캡슐화로 인해서 외부에서 몰라도 될 코드를 숨길 수 있도록 하여 더 간결한 형태의 코드를 만들어내기에 용이합니다. (반대로 테스트와 커스텀에 불리하다는 말이기도 합니다.)
3. 객체지향 프로그래밍은 일반적으로 더 익숙한 프로그래밍 방식이며 관심사를 분리하기 쉬워서 코드의 가독성과 유지보수성이 높은 프로그래밍을 가능 하게 합니다.

 

 


- 참조 

생활코딩님 항상 감사합니다 !

 

테오님 좋은 글 감사합니다 !

 

함수형 프로그래밍을 배워보자!

함수형 프로그래밍에 대해서 이론을 공부해도 감이 잘 오지 않는 분들에게 어떻게 함수형 프로그래밍에 접근을 해나가면 좋을지 도움이 되고자 1부 파트였던 **함수형 사고에 대한 이론과 실습

velog.io

 

OOP의 SOLID원칙에 대한 좋은 글

 

💠 객체 지향 설계의 5가지 원칙 - S.O.L.I.D

객체 지향 설계의 5원칙 S.O.L.I.D 모든 코드에서 LSP를 지키기에는 어려움. 리스코프 치환 원칙에 따르면 자식 클래스의 인스턴스가 부모 클래스의 인스턴스를 대신하더라도 의도에 맞게 작동되어

inpa.tistory.com