-
자바스크립트에서 객체지향 프로그래밍을 해야할까?web 2023. 3. 8. 21:55
들어가며
CS스터디에서 프로그래밍 패러다임을 공부하며 절차형 프로그래밍과 객체지향 프로그래밍의 차이에 대해 공부해보았다. 절차형 프로그래밍은 어떤 일을 진행할 구체적인 절차를 함수로 만들어 호출하는 방식의 프로그래밍이다. 예를 들어, '글을 쓴다'고 하면, 블로그 앱을 다운받는 절차, 블로그 앱에 들어가 카테고리를 선택하는 절차, 글을 쓰는 절차, 글을 업로드하는 절차로 나누어 해당 절차를 순서에 맞게 호출하는 것이다.
그렇다면 객체지향 프로그래밍이라고 무언가 다를까? 절차지향 프로그래밍과 다르게 객체지향 프로그래밍은 기능을 하는 '객체'를 만들어 재사용하는데에 집중한다. 하지만 그렇다고 해서 객체지향 프로그래밍에 절차가 없는 것이 아니다. 똑같이 '글을 쓴다'는 프로그래밍을 객체지향적으로 한다면, 글쓴이, 블로그앱을 객체로 만들고 블로그 앱을 다운로드받는다/다운로드되어진다, 카테고리를 선택한다/선택되어진다, 손으로 글을 쓴다/글이 쓰여진다, 글의 업로드버튼을 누른다/업로드버튼이 눌려진다와 같은 기능으로 프로그래밍될 것이다.
어떤가? 실상 절차형 프로그래밍이든 객체지향 프로그래밍이든 똑같은 행위가 절차적으로 프로그래밍된다. 결국 글의 업로드버튼을 누르는 글쓴이의 행동이 없으면 블로그앱의 업로드버튼이 눌려질 일이 없으니 객체지향 프로그래밍에서도 절차는 당연하게 존재하는 것이다.
프로그래밍 패러다임을 공부하며 얻은 결론은,
모든 언어는 원래 절차적이고, 객체지향적인 관점을 추가했을 경우에 객체지향적 언어라고 불리는 것이다.
결국 절차지향프로그래밍을 한다는 C언어로도 잘 모듈화를 하면 객체지향적인 것처럼 사용할 수 있고, 객체지향언어로 불리는 JAVA, C++로도 객체지향의 꽃인 캡슐화, 추상화, 다형성, 상속을 사용하지 않고 코딩하면 절차지향프로그래밍이 되는 것이다. JAVA, C++은 객체지향적인 관점으로 프로그래밍하기 위해 만들어진 언어로 클래스나 객체 생성자와 같은 기능들을 제공하고 있다. 하지만 꼭 객체와 클래스를 생성하지 않아도 Hello World!를 출력할 수는 있다는 말이다.
학교에서 객체지향 프로그래밍 수업을 들으면서 C++을 공부했었는데, 그 때 교수님께서 이런 말씀을 해주셨다.
C++을 객체지향적으로 사용하지 않는다면 그건 C++을 제대로 사용했다고 보기 어렵죠
프로그래밍에 정답이 어디있겠냐만은 프로그래밍 언어가 탄생한 배경과 목적에 맞게 프로그래밍을 하는 것은 옳다고 생각한다. 해당 수업에서 라면 주문 및 결제 키오스크를 프로그래밍했다. 사실 main함수 하나만으로도 구현할 수 있었던 프로그래밍이지만 손님과 키오스크 객체를 따로 생성하고 라면 선택, 토핑 추가, 장바구니 조회, 결제수단 선택, 영수증 생성 및 출력 등 재사용성을 높이기 위해 찢어내고 찢어내어 몇 십개의 파일로 마무리했던 기억이 있다.
다시 돌아와서, 이렇게까지 객체지향언어를 최대한 객체지향적인 관점으로 사용하려고 노력했던 경험을 생각하니 결국 프로그래밍에 정답은 없어도 언어의 목적과 프로그래밍하는 상황에 맞게 잘 사용해야할 것 같은데 그렇다면 자바스크립트에서 객체지향 프로그래밍을 해야하나? 라는 의문이 들기 시작했다.
자바스크립트에서 객체지향 프로그래밍을 해야할까?
1) 자바스크립트의 정의
그도 그럴것이 자바스크립트의 정의를 검색해보면, '객체 기반의 스크립트 프로그래밍 언어'라고 한다. 하지만 흔히들 객체지향 프로그래밍을 이야기할 때 이야기되는 JAVA나 C++처럼 거론이 되지 않는 자바스크립트. 객체 기반이니 자바스크립트는 분명 객체지향적인 관점을 가지고 있는 것일 텐데, 명확하게 '객체지향언어'라고 정의되지는 않는다. 왜일까?
2) 자바스크립트의 역사
자바스크립트의 역사에 대한 이야기를 나누기 이전에, 먼저 객체지향 프로그래밍이 등장하게 된 배경에 대해 이야기하고자 한다. 그리 큰 규모의 하드웨어나 소프트웨어가 필요하지 않았던 과거에는 절차형 프로그래밍만으로도 큰 문제가 없었다. 하지만 소프트웨어가 점점 발전하기 시작하면서 코드는 점점 복잡해지기 시작했다. 앞서 이야기했듯 절차형 프로그래밍은 절차를 함수화해서 호출하는 프로그래밍이기 때문에, 묶여진 부분이 절차에만 집중되어있었고 그로 인해 재사용성이 떨어졌다. 절차형 프로그래밍의 순서가 점점 꼬이기 시작하고, 일명 '스파게티 코드'라 불리는 비효율적인 프로그래밍을 하게 되었다. 이러한 문제점을 해결하고자 캡슐화, 다형성, 추상화, 상속 등으로 '재사용성'을 높인 객체지향 프로그래밍이 등장하게 되었다. 복잡한 스파게티 코드를 바라보며 한숨을 쉬었을 사람들에 앞에 등장한 객체지향 프로그래밍은 얼마나 빛나는 존재였을까? 물론 오히려 간단한 프로그래밍에는 객체지향이 불편하고 절차지향프로그래밍이 편하고 깔끔하게 느껴질 수 있을 만큼 두 프로그래밍 패러다임 중에 어느 것이 옳고 좋은지를 판단할 수는 절대 없다. 하지만 불편함을 해소해주는 프로그래밍이었기에 객체지향프로그래밍은 등장과 함께 큰 유행을 타기 시작했다.
자바스크립트는 그렇게 객체지향프로그래밍이 유행을 타던 시점에 등장했다. OOP가 유행하던 시점, 사실 자바스크립트의 초기 모델은 '함수형 프로그래밍'이었다. 자바스크립트의 창시자인 Brendan Eich가 함수형 프로그래밍에 많은 관심을 가지고 있었기 때문. 하지만 당시 개발자들이 많이 사용하던 객체지향적인 문법을 요구하는 상황이 있던터라, 결국 자바스크립트는 함수형 프로그래밍과 객체지향프로그래밍의 혼종으로 탄생되었다고 한다.
결국 자바스크립트가 객체지향적으로 보이는 것 같기도 하고 아닌 것 같기도 한 이유는, 함수형 프로그래밍언어이지만 객체 기반의 특징을 가지고 있어 객체지향 프로그래밍을 할 수 있기 때문이다.
3) 자바스크립트의 특징
객체
자바스크립트는 딕셔너리 형태로 바로 객체를 만들 수 있다. 그리고 객체 속 함수에서는 this를 넘겨주어 객체지향적으로 표현한다.
추상화, 상속, 다형성
자바스크립트가 객체기반 언어라고 하지만, class가 아예 없다. 붕어빵을 찍어내듯 공통적인 일을 하는 클래스가 없는 대신 함수로 묶고, prototype체인을 연결해서 추상화와 상속, 다형성을 해결한다. 프로토타입은 객체를 참조하는 숨겨진 링크이다. 자바스크립트에서는 여느 객체지향언어처럼 객체를 생성하고, 프로토타입을 이용해 객체를 참조하여 객체의 값을 읽어들인다. 또한 prototype체인으로 연결되어있다는 점이 추상화, 상속, 다형성의 기능을 하게 한다.
타입, 인터페이스
자바스크립트에는 타입이 없다. int인지, boolean인지, String인지 타입을 먼저 제시하지 않는다. 사실 타입을 제시하지 않으면 바로 에러가 나버리는 전통 언어들을 생각하면 자바스크립트는 정말 단순해보이기는 한다. 자바스크립트의 타입으로 인한 이슈를 해결하기 위해 타입스크립트가 탄생하기도 했다. 하지만 타입이 없는 자바스크립트에서는 변수이나 메서드의 명칭을 통일해서 같은 타입 취급한다. 객체지향 언어의 특징인 타입과 인터페이스를 위해 같은 이름의 변수나 메서드를 가져서 같은 타입의 객체로 볼 수 있게 하는 것이다.
결론
자바스크립트는 함수형 언어이지만 객체지향적인 프로그래밍을 할 수 있는 기능이 있다. 간단하지만 JAVA의 문법 패러다임은 가지고 있다. 자바스크립트의 역사를 통해보면, 결국 하나의 프로그래밍 언어가 탄생하는데에도 많은 탄생 비화가 있다. 객체지향프로그래밍이 유행하지 않았더라면, 어쩌면 자바스크립트는 찐 함수형 프로그래밍용 언어로 만들어졌을지도 모른다. 뿐만 아니라, 시간이 지나고 여러 버전을 거듭하면서 자바스크립트는 사람들이 필요로 하는 기능들이 추가되어져왔다. 앞으로도 소프트웨어는 계속적으로 발전하고 유행하는 프로그래밍 방식도 계속 변화할 것이며 사람들이 필요로 하는 기능들은 계속해서 생겨날 것이다. 결론적으로, 자바스크립트를 객체지향 프로그래밍을 해야하는지에 대한 정답은 '없다'. 객체지향과 함수형의 두 가지 관점 속에서 나의 프로그램을 어떻게하면 더 효율적이고, 더 간단하게 만들 수 있을지, 어떻게하면 더 재사용성을 높이고, 유지보수하기 용이하게 할 수 있을지를 끊임없이 공부하면서 상황과 목적에 맞는 방식을 선택하는 것이 중요하다.
참고
https://yozm.wishket.com/magazine/detail/1396/
https://poiemaweb.com/js-introduction
https://www.nextree.co.kr/p7323/
'web' 카테고리의 다른 글
리액트 반응형 완벽 구현하기 (1) 2023.04.23 프리티어 오류 해결하기 (1) 2023.04.16 [리액트/자바스크립트] S3파일 다운로드 (3) 2023.04.02 비동기 작업의 이해 (1) 2023.03.26 API 통신 한 방에 이해하기! (1) 2023.03.19