Java, Javascript 등 언어들의 개념을 찾아보면 객체 지향 언어라는 단어를 볼 수 있다. 객체 지향 이란 무엇이며, 이 전에는 어떤 언어의 형태였는지를 알아보자.
절차 지향 프로그래밍 (Procedural Programming)
절차 지향 프로그래밍이란 물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시 되면 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법이다. 대표적인 절차지향 언어에는 C언어가 있다. 자동차 제조를 예를 들면, 자동차는 엔진, 차체, 핸들, 의자, 바퀴 순으로 차례대로 만들어져야 한다. 서로 분리되서도 안 되고, 순서가 틀려도 안된다. 하지만 핸들이 고장났다고해서 엔진부터 바퀴까지 전부 수리해야한다면 얼마나 비효율적인가? 예전에는 하드웨어와 소프트웨어의 개발 속도차이가 크지 않았지만, 하드웨어가 발전을 거듭하며 컴퓨팅 환경에 비해 소프트웨어 개발 시간이 따라가지 못하게 되면서 절차 지향 프로그래밍의 단점이 두각되었다.
장점
- 컴퓨터의 작업 처리 방식과 유사해 실행속도가 빠르다.
단점
- 유지보수가 어렵다.
모든 구성 요소가 유기적으로 연결되어 있다는 말은, 즉 하나가 고장났을 때 시스템 전체가 고장난다는 것을 의미한다. 또 문제를 해결하기 위해 일부분이 아닌 시스템 전체를 수리해야 한다는 말이다. 이는 유지 보수가 매우 까다롭다는 뜻이며, 특히 디버깅이 어렵다. - 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵다.
엄격하게 순서가 정해져 있어 비효율적이며, 언어의 융통성이 부족하여 생산 효율이 떨어진다.
하드웨어가 발전을 이루면서 소프트웨어의 개발 시간을 단축하되 하드웨어의 기본적인 사양을 잡아먹어도 더 이상 큰 단점이 아니기에 모듈화, 캡슐화해서 접근하는 형태를 갖는 객체 지향 프로그래밍이 탄생하였다. GUI의 발전이 객체 지향 언어에 가장 큰 영향을 미쳤다.
객체 지향 프로그래밍 (Object Oriented Programming)
객체란 구체적인 사물, 혹은 사람이 될 수도 있고 추상적인 개념이 될 수도 있는 무언가를 의미한다. 컴퓨터로 예를 들면, 컴퓨터에 쓰이는 모든 부품(모니터, 키보드, 스피커 등)과 컴퓨터가 제공하는 모든 기능(화면이 켜짐, 소리가 나옴 등)이 전부 객체이다.
객체 지향이란 실제 세계를 모델링하여 소프트웨어를 개발하는 방법을 의미한다. 즉, 객체 지향 언어라는 것은 프로그램을 다수의 객체로 만들고, 이들끼리 서로 상호작용하도록 만드는 프로그래밍 언어를 뜻한다. 컴퓨터의 모든 부품을 적절히 연결하고 조립하여 컴퓨터가 작동하도록 만드는 것이라 할 수 있다. 우리가 익히 들어 알고 있는 자바, C++, 파이썬 등이 있으며 최초의 객체 지향 언어인 시뮬라67, 스위프트 등이 있다.
기본 구성 요소
- 클래스(Class) : 같은 종류(또는 문제 해결을 위한)의 집단에 속하는 속성(attribute)과 행위(behavior)를 정의한 것으로 객체지향 프로그래밍의 기본적인 사용자 정의 데이터형(user defined data type)이라고 할 수 있다.
- 객체(Object) : 클래스의 인스턴스이다. 객체 자신 고유의 속성(attribute)를 가지며 클래스에서 정의한 행위(behavior)를 수행할 수 있다.
- 메서드(Mehod), 메시지(Message) : 클래스로부터 생성된 객체를 사용하는 방법으로서 객체에 명령을 내리는 메시지라 할 수 있다.
게임을 예로 들어보자. 캐릭터(Player)라는 클래스를 만들어 보자. 그렇다면 캐릭터에게 주어지는 외형적인 모습(머리 색, 피부 색 등)을 구체화 할 변수도 필요할 것이고, 걸어다니는 모습, 뛰는 모습, 마법을 부리는 법처럼 캐릭터가 할 수 있는 것을 구체화할 함수도 필요할 것이다. 이를 모두 묶어서 클래스로 정의하고, 새로운 캐릭터를 "모험가"라는 이름의 객체로 하나의 고유한 캐릭터를 생성시키는 것이다. 모험가라고 모두 같은 값을 가지는 것이 아니기에 그 세부 사항은 다르다. 그리고 모험가가 할 수 있는 행동, 마법을 부리는 법 같은 함수들을 메서드라고 부르는 것이다.
특징
- 캡슐화 : 데이터와 알고리즘을 하나로 묶어 하나의 캡슐처럼 만드는 것을 의미한다. 재사용이 용이하고, 캡슐화된 객체는 세부 내용이 외부에 은폐되어서 오류도 낮으며 객체들끼리 상호작용할 때 세부 내용을 알 필요가 없으니까 결합도도 낮아지고, 인터페이스도 단순해진다. 즉, 데이터와 데이터를 처리하는 함수를 하나로 묶은 것을 의미하며, 이 때 데이터는 감추고 외부 세계와의 상호작용은 메소드를 통한다.
- 추상화 : 불필요한 부분을 최소화하고, 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것이다. 자료 추상화를 통해 정의된 자료형을 추상 자료형이라고 한다. 추상 자료형은 자료형의 자료 표현과 자료형의 연산을 캡슐화한 것으로 접근 제어를 통해 자료형의 정보를 은닉할 수 있다. 객체 지향 프로그래밍에서 추상 자료형을 클래스, 추상 자료형의 인스턴스를 객체, 추상 자료형에서 정의된 연산을 메소드, 메소드의 호출을 생성자라고 한다.
- 상속성 : 부모가 자식에게 유전자를 물려주듯, 상위 클래스의 모든 것을 하위 클래스가 이어 받는 것을 의미한다. 하위 클래스는 물려받은 속성 이외에 새로운 속성과 연산을 첨가하여 사용할 수 있다. 그러므로써 객체와 클래스의 재사용을 증대시킨다.
- 다형성 : 하나의 이름(방법)을 다양한 형태로 표현하여 많은 상황에 대처하는 기법이다. 서로 다른 클래스의 객체가 같은 메소드를 받았을 때 각자의 방식으로 동작을 하는 것이다. "커피를 사 와라"라는 메소드를 받았을 때, 아이스 아메리카노 또는 뜨거운 라떼를 사 오게 정의하는 것을 의미한다.
- 오버라이딩 : 같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것
- 오버로딩 : 같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것
장점
- 코드의 재활용성이 높다.
상속이 가능하기 때문에 코드를 재사용할 수 있어 편리하다. - 생산성이 증가한다.
컴퓨터가 고장났을 때, 문제가 되는 부품만 수리하면 다시 정상 가동된다. 이처럼 독립된 객체로 이루어져있기 때문에 생산적으로 작업할 수 있고, 유지 및 보수가 용이하다. - 자연스러운 모델링
객체 지향 언어 자체는 우리가 사는 세계와 닮았기 때문에 개발자가 생각하는 대로 자연스럽게 구현할 수 있다.
단점
- 절차형에 비해 처리 속도가 상대적으로 느리다.
- 설계에 많은 시간 소요가 든다.
모든 객체의 역할과 기능을 이해해야 하기 때문에 프로그래밍에 많은 시간이 소요된다. - 객체가 많아지면 어쩔 수 없이 용량이 커질 수 있다.
절차 지향과 객제 지향의 차이점
이 둘은 서로 반대의 개념이 아니다. 객체 지향또한 절차 지향과 동일한 순서로 실행된다.
절차 지향은 데이터를 중심으로 함수를 구현한다. 이에 반해 객체 지향은 기능을 중심으로 메서드를 구현하게 된다. 이는 C와 같은 언어를 사용해서 객체 지향적으로 코딩할 수 있다는 점을 내포한다. 핵심은 데이터 중심이 아닌 기능 중심으로 구현하는 것이다. 즉, 여러 함수가 데이터를 공유하는 방식이 아니라 특정 함수가 다른 함수를 사용하는 방식으로 구현을 하고, 데이터 공유를 적절히 제한하면 캡슐화 효과를 얻을 수 있다.
출처 :
'코딩 > 정말 나는 잘 알고 있을까?' 카테고리의 다른 글
null, undefined, undeclaered, NaN 이 뭐야? (0) | 2022.08.06 |
---|---|
브라우저 저장소가 뭐야? (feat. 쿠키, 세션, jwt) (0) | 2022.08.06 |
JavaScript가 뭐야? (feat. 프로토타입, 싱글 스레드, 비동기적 코딩) (0) | 2022.08.05 |
프로그래밍 언어가 뭐야? (0) | 2022.08.04 |
REST API가 뭐야? (feat. GET, POST, PUT, DELETE) (0) | 2022.08.02 |