🔖객체지향 프로그래밍 OOP
프로그래밍을 하면서 가장 많이 들은 개념 중 하나는 객체지향 프로그래밍입니다. 하지만 애써 무시하고 싶었던 개념중의 하나이기도 하죠.
그 이유는 자바스크립트로 프로그래밍을 하면서 객체지향을 사용할 일이 별로 없었기 때문이었어요. 하지만 진정한 백앤드 개발자로 성장하기 객체지향에 대해서 마스터 해보려고 합니다 :)
객체지향 프로그래밍 정의
객체지향 프로그래밍: 컴퓨터 프로그래밍의 패러다임 중 하나이고, 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것입니다.
객체지향 프로그래밍은 유연하고 변경이 쉽게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용되죠.
객체지향 프로그래밍 언어
객체지향 프로그래밍 언어로는 다음과 같은 것들이 있습니다.
- C++
- C#
- Dart
- Java
- Pascal
- Ruby
- Python
....
우리가 흔히 사용하는 언어들 중에 객체지향 언어가 굉장히 많은 것을 알 수 있습니다.
저는 객체지향을 자바로 공부하고 있습니다.
객체지향 vs 절차 지향
그렇다면 객체지향 말고 다른 방식의 프로그래밍과 비교하면 어떤 차이점이 있고 어떠한 장점이 있는지 알아볼까요?
절차 지향
절차 지향 모델링은 프로그램을 기능중심으로 바라보는 방식으로 "무엇을 어떤 절차로 할 것인가?"가 핵심이 됩니다. 즉, 어떤 기능을 어떤 순서로 처리하는가에 초점을 맞춥니다.
- 대형 프로그래밍의 경우 많은 기능을 수반하기 때문에 절차지향 보다는 객체 지향이 적합합니다.
- 소형 프로그래밍의 경우 작은 기능을 수반하기 때문에 객체 지향보다는 절차 지향이 적합합니다.
객체지향의 특징
추상화(Abstraction)
- 객체들의 공통적인 특징(기능, 속성)을 도출하는 것
- 객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다.(클래스가 없는 객체지향 언어도 존재 ex) JavaScript)
캡슐화(Encapsulation)
- 실제로 구현되는 부분은 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.
- 객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하는 것
- 코드가 묶여있어서 오류가 없어 편리
- 객체의 변수를 직접적으로 변경하지 못하게 하여 오류 방지
상속성(Ingeritance)
- 하나의 클래스가 가진 특징(함수, 데이터)을 다른 클래스가 그대로 물려받는 것
- 이미 작성된 클래스를 받아서 새로운 클래스를 생성하는 것
- 기존 코드를 재활용해서 사용함으로써 객체지향 방법의 중요한 기능 중 하나에 속한다.
다형성(Polymorphism)
- 약간 다른 방벙으로 동작하는 함수를 동일한 이름으로 호출하는 것
- 동일한 명령의 해석을 연결된 객체에 의존한는 것
- Overriding, Overloading
- Overrinding: 부모클래스의 메소드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의 하는 것
- Overloading: 같은 이름의 함수를 여러 개 정의한 후 매개변수를 다르게 하여 같은 이름을 경우에 따라 호출하여 사용하는 것
동적바인딩(Dynamic Binding)
- 가상 함수를 호출하는 코드를 컴파일할 때, 바인딩을 실행시간에 결정하는 것
- 파생 클래스의 객체에 대해, 기본 클래스의 포인터로 가상 함수가 호출될 때 일어난다.
- 함수를 호출하면 동적 바인딩을 통해 파생 클래스에 오버라이딩 된 함수가 실행
- 프로그래밍의 유연성을 높여주며 파생 클래스에서 재정의한 함수의 호출을 보장
객체 지향 프로그래밍의 장점
소프트웨어의 생산성 향상
객체 지향 프로그래밍은 다향한 소프트웨어 재사용 방법이 있다. 이미 만들어진 클래스를 상속받거나 객체를 가져다 재사용하거나, 부분 수정을 통해, 소프트웨어를 작성하는 부담을 대폭 줄일 수 있다.
실제 세계에 대한 쉬운 모델링
우리가 흔히 생각하는 사물이나 어떠한 것을 클래스로 쉽게 표현 할 수 있다.
예를 들어 자동차를 객체로 만들게 되면
등등 실제 우리가 생각하는 개념을 모델링을 하여 쉽게 정의 할 수 있다.
보안성 향상
객체지향적 프로그래밍의 캡슐화 특징으로 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.
단점
느린 실행 속도
객체지향 프로그래밍은 캡슐화와 격리구조 때문에 절차지향 프로그래밍과 비교하면 실행 속도가 느리다. 또한 객체지향에서는 모든 것을 객체로 생각하기 때문에 추가적인 포인터 크기의 메모리와 연산에 대한 비용이 들거가게 된다.