객체?
객체지향 프로그래밍은 실세계에 존재하고 인지하고 있는 객체(Object)를 소프트웨어의 세계에서 표현하기 위해 객체의 핵심적인 개념 또는 기능만을 추출하는 추상화(abstraction)를 통해 모델링하려는 프로그래밍 패러다임을 말한다. 다시 말해, 우리가 주변의 실세계에서 사물을 인지하는 방식을 프로그래밍에 접목하려는 사상을 의미한다.
객체지향 프로그래밍은 함수들의 집합 혹은 단순한 컴퓨터의 명령어들의 목록이라는 전통적인 절차지향 프로그래밍과는 다른, 관계성있는 객체들의 집합이라는 관점으로 접근하는 소프트웨어 디자인으로 볼 수 있다.
각 객체는 메시지를 받을 수도 있고, 데이터를 처리할 수도 있으며, 또다른 객체에게 메시지를 전달할 수도 있다. 각 객체는 별도의 역할이나 책임을 갖는 작은 독립적인 기계 또는 부품으로 볼 수 있다.
객체지향 프로그래밍은 보다 유연하고 유지보수하기 쉬우며 확장성 측면에서서도 유리한 프로그래밍을 하도록 의도되었고, 대규모 소프트웨어 개발에 널리 사용되고 있다.
객체 지향 프로그래밍 특징
객체들의 공통적인 특징(기능, 속성)을 추출해서 정의하는 것을 말한다.
다시 말해, 실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통적인 특성을 파악한 후, 필요 없는 특성을 제거해 하나의 묶음으로 만들어내는 과정을 가르킨다.
객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다.
관련이 있는 변수와 함수를 하나의 클래스로 묶고, 외부에서 쉽게 접근할 수 없도록 은닉하는 것이다.
외부에서 객체를 손상시키는 일을 방지할 수 있도록, 객체 내부의 세부적인 동작에 대한 구현을 감추는 것이다. 예를 들어, 외부에서 접근할 필요 없는 것들은 접근 지정자를 private 으로 두어 접근에 제한을 둘 수 있다.
정보 은닉: 다른 객체에게 자신의 정보를 숨기고, 자신만의 연산을 통해 접근을 허용하는 것.
캡슐화는 높은 응집도와 낮은 결합도를 유지한다. 즉, 한 곳에서 변화가 일어나도 다른곳에 미치는 영향을 최소화 한다.
이미 정의된 상위 클래스 (부모 클래스)의 모든 속성과 연산을 하위 클래스가 물려 받는 것.
기존 코드를 재활용해서 사용함으로써 코드의 생산성을 높여준다 (적은 코드로 원하는 기능 구현). 이미 작성된 클래스를 받아서 조금만 수정해 새로운 클래스를 생성하는 것을 예로 들 수 있다.
하지만 상속 자체를 코드 재사용의 개념으로 이해하면 안된다. (클래스간 결합도가 과도하게 높아져 유지보수가 어려움) 반드시 기능의 확장 관점으로써 '포함 관계'(IS-A) 일 때에만 사용해야 한다.
IS-A: 부모 - 자식 클래스 관계처럼 포함 관계를 의미한다. (ex.고양이의 부모 클래스는 동물)
HAS-A: 한 객체가 다른 객체에 속하는 구성 관계(Composition)이다. (ex. 자동차를 배터리를 가지고 있음)
즉, 상속은 자식 클래스를 외부로부터 은닉하는 캡슐화의 개념을 가지고 있다.
하나의 변수 또는 함수(클래스의 객체)가 명령을 받았을 때, 상황에 따라 서로 다른 방식으로 동작하는 것.
동일한 명령을 각자 연결된 객체에 의존해서 해석하는 것을 뜻한다.
오버라이딩(Overriding)과 오버로딩(Overloading)이 있다.
오버라이딩: 부모클래스의 메소드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의하는 것
오버로딩: 같은 이름의 함수를 여러 개 정의한 후 매개변수를 다르게 하여 같은 이름을 경우에 따라 호출하여 사용하는 것.
우리가 객체 지향 프로그래밍을 사용하는 이유?
장점과 단점
모듈화된 객체, 그리고 상속을 통해 코드의 재사용을 높일 수 있다.
독립적인 객체를 사용함으로써 개발의 생산성을 향상시킬 수 있다. 이미 생성된 클래스를 상속 받거나, 객체를 재사요, 부분 수정 등 적은 노력으로 높은 효율을 만들어낸다.
현실세계에서 사용하는 개념을 대입하여, 생각한 것을 그대로 구현할 수 있다.
프로그램 수정, 추가시에도 캡슐화 덕분에 주변 코드에 영향이 덜 가기 때문에 유지보수가 용이하다.
전반적으로, 객체지향 언어(C++, Java, ruby)는 컴퓨터의 처리 구조와 비슷한 절차지향 언어(C언어)보다 상대적으로 실행속도가 느리다.
객체단위로 프로그램을 많이 만들다보면, 불필요한 정보들이 들어갈 수 있는데 프로그램의 용량이 증가될 수 있다.
초기에 클래스별, 객체별, 상속 등의 구조 등을 모두 설계해야 하기 때문에 절차지향 언어에 비해 설계 시간이 많이든다.
참고 사이트
객체지향 프로그래밍 (OOP) 이란?