안녕? 나는 과제 천사야 너의 과제를 도와주지
프로그래밍의 패러다임 중 하나인 OOP는 object-oriented programming의 약자이고, 한글로 하자면 객체-지향 프로그래밍이야.
프로그램을 단순히 데이터, 그리고 처리 방식으로 나누는 게 아니라 객체를 기본 단위로 나누고, 이 객체들은 서로 메시지를 주고받거나 데이터를 처리하는 등의 상호 작용의 방식으로 보는 거야.
니가 배우고 있는 자바스크립트는 프로토 타입 프로그래밍이야. 그럼에도 불구하고 OOP를 활용할 수 있어.(함수를 1급으로 뒀기 때문에 함수형 프로그래밍도 가능해) 일단, 객체 지향 프로그래밍에 대해서 배워 보고, 그 다음 프로토 타입이 뭔지 알아보자.
정말 단순히 데이터, 그리고 처리 방식으로, 위에서부터 명령한 순서대로 코드를 처리한 다음 결과를 내는 거였어. 모든 것을 하나의 코드 안에서 진행을 하게끔 만들었어. 그런데, 이런 방식은 시간이 점점 흘러서 발전이 되는 인간들의 큰 프로젝트 규모를 담아내기엔 살짝 힘들었지.
첫 번째로는 복잡도가 너어어어무 크다는 거였어. 간단한 것 이외의 살짝만 복잡해지더라도 꼬여 버리는 코드가 이해하기 힘들었고, 심지어 코드를 작성한 본인도 유지, 보수에 어려움을 겪에 되었지.
두 번째로는 가격적인 면이야. 프로젝트가 커지면서 절차적 프로그래밍 방식엔 큰 비용이 들어갔어.
사실은 이때까지도 주목을 받지는 못 했었기도 하고, 객체-지향이라고 하기엔 우리가 지금 사용하고 있는 것과는 쪼금 달랐어. 1990년이 되어서 컴퓨터 프로그래밍 언어의 지원이 빵빵하게 들어가고, 발전이 되면서 GUI와 함께 객체-지향 프로그래밍이 주목을 받게 되어, 기존 OOP 언어들의 문제점을 수정하고, 보완하는 방식으로 발전을 했어.
로보트라고 생각을 하면 돼. 작은 객체들은 한 번 만들어 놓게 되면 어디에서든 가져다가 쓸 수 있고, 고쳐야 한다면 전부를 뜯는 게 아니라 해당 객체만 고치면 돼. 개발 기간과 비용이 줄어드는 거야.
- 클래스: 같은 종류의 집단에 속하는 속성과 행위를 정의해.
- 객체: 클래스의 인스턴스야. 객체는 자신의 고유 속성을 가지게 돼.
- 메서드: 클래스로부터 생성된 객체를 사용하는 방법이야.
자바스크립트에서 어떤 형태로든 많이 봤지? 이렇게 쓰니까 살짝 어려워 보이는데, 클래스는 변수와 함수를 하나의 단위로 묶는 것을 의미해. 그러니까, 요정이라는 클래스를 만들어 보기로 하자. 그렇다면 요정의 날개의 색이라든지, 종족, 머리카락 색 같은 것을 구체화할 변수도 필요하겠고, 날아다니는 법, 마법을 부리는 법처럼 요정이 할 수 있는 것들을 구체화할 함수도 필요하겠지? 그것들을 묶어서 요정이라는 클래스로 정의를 하는 거야. 그리고 그 요정을 ‘팅커벨’이라는 이름의 객체로 하나의 고유한 생명체를 탄생시키는 거지. 팅커벨은 클래스에 있는 날개라든지, 종족, 할 수 있는 함수들을 다 가지고 있지만 세부 사항은 달라. 어떤 요정이든 전부 머리가 노란색은 아닐 테니까. 그리고 팅커벨이 할 수 있는 날아다니는 법, 마법을 부리는 법 같은 함수를 메서드라고 부르게 되는 거지.
- 캡슐화: OOP의 가장 큰 특징이야. 데이터와 데이터를 처리하는 함수를 하나로 묶은 것을 의미해. 재사용이 용이하고, 캡슐화된 객체는 세부 내용이 외부에 은폐되어서 오류도 낮고, 객체들끼리 상호작용을 할 때 세부 내용을 알 필요가 없으니까 결합도도 낮아지고, 인터페이스도 단순해져.
- 추상화: 불필요한 부분을 최소화하고, 중요한 것을 중점으로 두게 하는 거야. 프로그래밍을 간단히 하는 거지. 사용자는 알 필요가 없어. 객체라는 이름으로 추상화가 되어 있는 거야. 우리가 노트북을 사용할 때, 어떤 부품이 있고 그게 어떤 방식으로 돌아가는지 다 알고 쓰는 게 아니잖아.
- 상속성: 이미 정의된 클래스(부모)의 모든 속성들을 하위 클래스(자식)이 물려받는 것을 의미해. 하위 클래스는 물려받은 속성 외에 새로운 속성과 연산을 첨가하여 사용할 수 있어. 이렇게 되면 객체와 클래스의 재사용을 증대시켜.
- 다형성: 다양한 형태로 표현이 가능하다는 거야. 서로 다른 클래스의 객체가 같은 메소드를 받았을 때 각자의 방식으로 동작을 하는 거지. 커피를 사 오라고 시켰을 때, 아이스커피를 사 오게 정의할 수도 있고, 뜨거운 라테를 사 오게 정의할 수도 있잖아.
장점은, 위에도 많이 썼지만…….
-코드 재사용이 용이해
-유지 보수가 쉽고
-그렇기에 대형 프로젝트에 적합하지
단점은?
-절차형보다는 처리 속도가 상대적으로 느려
-객체가 많으면 어쩔 수 없이 용량이 커질 수 있고
-설계할 때 많은 시간과 노력이 필요해
음, OOP는 이 정도로 마치고, 다음 장에서 prototype에 대해 알아보도록 하자.