정의한 기능의 흐름에 따라 순서대로 동작을 추가하며 프로그램을 완성하는 방식이다.
절차지향적으로 작성된 코드는 흐름이 눈으로 보이기 때문에 매우 직관적이라는 장점이 있다.
그러나, 프로그램의 규모가 커지게 되는 경우 동작이 직관적이지 못하게 되며 코드의 순서가 변하는 경우 결과값이 달라져 유지보수가 어렵다는 단점이 있다.
객체(Object) 란 현실에 존재하는 모든 것을 말하며 사람, 사물, 동물 모두 객체라고 할 수 있다.
지향 이란 '어떤 목표를 향하다, 원하다' 라는 뜻이다.
프로그래밍 은 컴퓨터 프로그램을 작성하는 일이다.
즉, '객체 지향'이란 현실에 존재하는 대상을 목표한다고 할 수 있으며,
'객체 지향 프로그래밍'이란 현실의 대상을 목표로 컴퓨터 프로그램으로 만드는 일이라고 할 수 있다.
문제를 여러 개의 객체 단위로 나눠 작업하는 방식으로, 객체들이 서로 유기적으로 상호작용하며 프로그램을 완성하는 방식이다.
코드를 재활용 할 수 있다는 장점이 있지만, 실행속도가 느리고 설계에 많은 시간이 소요된다는 단점이 있다.
절차지향 언어를 사용한다면, 말 그대로 실행 순서, 즉 절차가 더 중점이 되고,
객체지향 언어를 사용한다면, 필요한 객체들의 종류와 속성 등이 더 중점이 된다.
절차지향과 객체지향이 서로 반대된다는 말은 옳지 않고,
굳이 관계를 짓자면 객체지향 안에 절차지향이 들어가있는 느낌으로 보면 된다.
객체지향이 절차지향을 포함하여 더 많은 기능을 담고 있기 때문이다.
(ex. 상속, 추상화, 다형성 등)
객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. (출처: 위키피디아)
프로그래밍에서의 객체란 속성(변수)과 기능(메서드)를 하나로 묶은것을 말한다.
객체의 용도는 객체가 가지고 있는 속성(변수)과 기능(메서드)에 따라 다르다.
객체가 TV라고 예를 들어보면,
TV의 크기, 길이, 높이, 채널, 볼륨 등으로 구성된 자료형 필드가 존재할 것이고,
켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 변경 등의 메서드가 존재할것이다.
TV라는 하나의 객체에 변수와 메서드를 관리하게되면 직관적으로 확인이 가능하여 코드의 가독성이 증가한다!
결론적으로 객체 간의 독립성이 뚜렷해지고, 중복되는 코드의 양이 줄어든다. 따라서 유지보수에 용이해질 것이다.
객체지향 패러다임이 생겨나면서 추상화, 캡슐화, 상속, 다형성의 4가지 특징을 갖추게 되었고, 이를 잘 이해하여 객체지향 프로그래밍을 구현해야 한다.
캡슐화란 데이터와 코드의 형태를 외부로부터 알 수 없게하고, 데이터의 구조와 역할, 기능을 하나의 캡슐형태로 만드는 방법이다.
캡슐화의 중요한 목적은 변수를 private로 선언하여 데이터를 보호하고, 보호된 변수는 getter나 setter등의 메서드를 통해서만 간접적으로 접근을 허용하는 것 이다.
캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에, 정보은닉을 할 수 있다는 특징이 있다.
캡슐화와 정보은닉은 동일한 개념은 아니다
상속이란 기존 상위클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새로운 하위 클래스에 새로운 기능도 추가할 수 있는 것이다.
즉, 부모가 자식에게 유전자를 물려주듯이 부모의 특징을 자식에게 모두 물려준다.
OOP에서 이를 부모 클래스, 자식 클래스라고 표현한다.
상속이 필요한 이유는 코드의 중복을 없애기 위함이다.
코드의 중복이 많아지면 개발 단계와 유지 보수에서 많은 비용이 들게 된다.
상속관계를 맺으면 자식 객체를 생성할 때 부모 클래스의 속성들을 자동으로 물려받기 때문에 자식 클래스에서 또 정의할 필요가 없다는 장점이 있다.
추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 말한다.
즉, 실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통 특성을 파악하고 필요없는 특성을 제거하는 과정을 말한다.
객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념이다.
정리하면 추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이라 할 수 있다.
다형성이란 상속과 연관있는 개념으로 한 객체가 상속을 통해 기능을 확장하거나 변경하여 다른 여러형태(객체)로 재구성 되는 것을 말한다.
쉽게 말하면 한 부모의 밑에서 태어난 자식들이 조금씩 다르다는 것이다.
오버로드(Overload)
또는 오버라이드(Override)
가 다형성의 대표적인 예라 할 수있고, 이것을 구현하는 걸 오버로딩(Overloading)
과 오버라이딩(Overriding)
이라고 한다.
간단하게 설명하자면,
오버라이딩
은 하위 클래스(자식)가 상위 클래스(부모)에서 만들어진 메서드를 자신의 상황에 맞게 메서드를 재정의하여 사용하는 것을 말한다.
오버로딩
은 하나의 클래스 안에서 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.
오버로딩
이 가능하려면 메서드끼리 이름은 같지만 매개변수의 개수나 데이터 타입이 달라야 한다. '리턴 값만' 다른 것은 오버로딩을 할 수 없다는 것이다.
다형성을 사용하면 같은 이름의 속성을 유지함으로서, 속성을 사용하기 위한 인터페이스를 유지하고, 메서드 이름을 낭비하지 않는다.
API가 많아질수록 복잡성은 증가하기 때문에 다형성은 유용하며 코드 재사용성을 늘려주어 유지보수가 용이하도록 도와주는 개념이다.
결국 객체지향 프로그래밍(OOP)은 위 네 가지 특성들을 통해서 어떤 대상을 추상화(Abstraction)하여 공통점을 찾고, 그것을 캡슐화(Encapsulation)해 한 군데에 모아 객체를 만들고, 새로운 객체가 상속(Inheritance)받아 재사용이 가능하게 만들어 준다.
상속받은 객체는 다형성(Polymorphism)을 통해 기능을 수정 또는 추가하여 재사용할 수 있다.