객체 지향 프로그래밍 이라는 패러다임이 만들어지기 전까지는 절차지향 프로그래밍을 사용했었다.
절차 지향 프로그래밍은 절차적으로 생각하며 함수로 이동하는 것이 전부였다.
초기의 C, 포트란 같은 언어들이 절차적인 언어이다.
객체 지향 프로그래밍이 만들어진 이후에 절차지향이 아닌
객체지향 프로그래밍을 사용하고 있다.
객체지향 프로그래밍이란 어떤 것이며 어떤 이유로 많이 사용하는지 지금부터 알아보고
왜 객체 지향 프로그래밍을 쓰고 있는 것인지 알아보려고 한다!
OOP(객체 지향 프로그래밍)
이란
OOP
는 코드 재사용성과 생산성의 향상 효과를 볼 수 있다.
유지보수의 편의성 덕택에 협업이 중요하다
규모가 큰 대형 프로젝트에 사용되는 프로그래밍 이론이다.
객체지향 언어
객체 지향 프로그래밍의 가장 큰 특징은 class를 이용해 연관 있는 처리 부분(함수)과 데이터 부분(변수)을 하나의 객체(instances)로 묶어 생성해 사용한다는 점이다.
객체 지향 프로그래밍의 특성은 총 네가지로 다음과 같다.
캡슐화는 외부에서 데이터(속성)와 기능(메서드)을 따로 정의하는것이 아닌 하나의 객체 안에 묶어서 넣는 것을 말한다.
데이터가 하나로 묶일 때 구현은 숨기고 동작은 노출시킨다.
이때 데이터와 메서드들은 느슨하게 결합된다.
💡 Loose Coupling(느슨한 결합)이란? ⇒ 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미한다! 즉 순서에 상관없이 바구니에 담아두고 필요한 정보만 꺼내서 사용 할 수 있게 결합 해 둔다는 의미이다. 때문에 언제근 구현을 수정하기에 용이하다객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 의미한다.
즉, 내부 구현은 아주 복잡하지만 실제로 노출 되는 부분은 단순하게 만든다는 개념이다.
실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통 특성을 파악하여 필요 없는 특성을 제거하는 과정이 추상화에 해당되는 과정이다.
추상화를 한 문장으로 정리 하자면, 객체들의 공통된 특징을 파악해 정의 해 놓은 설계 기법이라 할 수 있다.
추상화를 통해 인터페이스가 단순해진다!
부모 class의 특징을 자식 class가 물려받는 것을 상속이라고 한다.
조금 더 정확히 표현하자면, 기본 class의 특징을 파생 class가 상속 받는다 라고 할 수 있다.
OOP에서 상속이 꼭 필요한 이유는 코드의 중복을 방지하기 위해서 이다.
코드의 중복이 많아지면 개발 단계와 유지보수에서 많은 비용이 들게 된다.
상속관계를 맺으면 자식 객체를 생성할 때 부모 class의 속성들을 자동으로 물려받기 때문에 자식class에서 또 정의할 필요가 없다.
다형성이란 상속과 연관 있는 개념으로 한 객체가 상속을 통해 기능을 확장하거나 변경하여 다른 여러 형태(객체)로 재구성 되는 것을 말한다.
쉽게 말하면 한 부모의 밑에서 태어난 자식들이 조금씩 다르다는 것이다.
오버로드(Overload) 또는 오버라이드(Override)가 다형성의 대표적인 예라 할 수있고, 이것을 구현하는 걸 오버로딩(Overloading)과 오버라이딩(Overriding)이라고 한다.
간단하게 설명하자면,
오버라이딩
은 하위 클래스(자식)가 상위 클래스(부모)에서 만들어진 메서드를 자신의 입맛대로 다시 재창조해서 사용하는 것을 말한다.
오버로딩
은 하나의 클래스 안에서 같은 이름의 메서드를 사용하지만 각 메서드마다 다른 용도로 사용되며 그 결과물도 다르게 구현하는 것을 말한다.
오버로딩
이 가능하려면 메서드끼리 이름은 같지만 매개변수의 개수나 데이터 타입이 달라야 한다.
다형성
을 사용하면 같은 이름의 속성을 유지함으로서, 속성을 사용하기 위한 인터페이스를 유지하고, 메서드 이름을 낭비하지 않는다.
API가 많아질수록 복잡성은 증가하기 때문에 다형성
은 유용하며 코드 재사용성을 늘려주어 유지보수가 용이하도록 도와주는 개념이다.
참고