CODE STATES 44

객체 지향 프로그래밍 1-2) 절차 지향 vs 객체 지향

꼬드리 2023. 3. 15. 15:44

이제 클래스와 인스턴스에 대한 지식에서 조금 더 나아가보자.

다소 추상적이라고 느껴질지도 모르겠지만, 방법론에 대한 개념적인 부분을 잠시 짚고 가야한다. 딱 떨어지는 개념이 아니기에 어려우나 여러 번 곱씹고 예시를 찾아보면 조금씩 이해되는 것을 느낄 수 있다. 그리고 객체 지향 프로그래밍의 중요성도 깨달을 수 있을 것이다.

 

 

초기의 언어들(C, 포트란 등)은 객체 지향 개념이 부족한 '절차적 언어'(절차적 프로그래밍)에 속했다. 절차적인 언어는 Procedure를 사용하여 작성하는 프로그래밍 스타일로, 순차적인 처리들의 유기적 조합을 의미한다. 이 방식은 처음에 구조적인 프로그래밍이 가능케 했다. 하지만 점차 프로그래밍의 규모가 커지면서 코드의 순서가 바뀔 때 오류가 발생하고, 부분을 잘못 건드렸는데 전체에러가 생겨 유지 보수가 힘들며, 코드가 길어지는 등 여러 문제점이 나타나게 되었다.

따라서 여기서 필요에 의해 보완 발전한 것이 객체 지향 프로그래밍이다. 절차적 프로그래밍과 객체 지향 프로그래밍은 절대 대립되는 것이 아니라는 점을 명심하자.

 

 

객체 지향 프로그래밍이란?(Object Oriented Programming)

흔히 OOP라고 부르는 이것은, 데이터 접근과 데이터 처리 과정에 대한 기능 중심 프로그래밍 방법론이다. 방대한 정보를 기존의 함수 수준보다 더 '체계적으로' 정리하기 위해 등장했다. 

 

이 프로그래밍 방법에서는 데이터와 기능이 별개로 취급되지 않으며 한번에 처리될 수 있다. 객체들 간에 유기적인 상호작용으로 구성된다. 전보다 다용도로 편리하기에 현대에 쓰이는 언어들은 대부분(Java, C++ 등)객체 지향적 특징을 가진다. 

다만 자바 스크립트JS는, 따지고 보면 객체 지향 언어는 아니되 객체 지향적인 패턴으로 작성할 수 있다.

 

 

대표적인 4가지 특징?

객체 지향 프로그래밍에는 4가지 주요 특징이 있다. 캡슐화, 추상화, 상속, 다형성 기억해두자.

 

1. 캡슐화 Encapsulation

관련된 데이터의 기능을 한 단위로 묶어둔다. 또한 내부 구조는 private로 감춰두고 외부에서 조작 가능한 영역만 public으로 공개해놓을 수도 있다(정보 은닉 기능). 이 은닉을 통해 외부에서 의도치 않은 간섭으로 발생하는 오류를 방지할 수 있다는 이점을 갖는다. 외부에서는 캡슐 내부에 숨겨진 복잡한 작동 방식을 굳이 알지 않고도 원하는 기능을 사용할 수 있다. 느슨한 결합에 유리하다.

 

2. 추상화

아주 복잡한 내부의 구현을 단순한 부분만 노출시킨다는 개념이다. 너무 많은 기능이 노출되어 있으면 예기치 않은 변화가 발생하기 쉽다. 추상화를 통해 인터페이스를 단순하게 만든다. 캡슐화와 다른 점이라면, 캡슐화는 '은닉성'에 초점을 두는 반면 추상화는 '사용자에게 복잡한 메서드 등을 노출시키기보다 단순한 이름만 정의'하는 것에 초점이 맞춰진다. 

 

3. 상속 Inheritance

이미 작성해둔 부모 클래스(혹은 기본 클래스) 특성을 자식 클래스(혹은 파생 클래스)가 이어 받아 반영한다. 코드의 재활용성이라고도 불린다. 앞선 포스팅에서 클래스가 일종의 '틀'이라고 설명했는데, 틀 내부의 속성을 자식이 그대로 갖고 간다는 점에서 상속이라고 표현한다. 부모가 자식에게 상속해준다는 의미와 비슷하다. 또한 자식 클래스는 상속을 통해 물려받은 뒤에 자신이 추가적인 다른 기능들을 추가할 수 있다.

 

4. 다형성Polymorphism

하나의 타입에 여러 객체를 대입할 수 있는 성질이다. 개념적으로 동일한 함수들에게 같은 이름을 부여하며, 동일한 메서드에 대해서도 객체의 특성에 맞게 다르게 작성하는 일이 가능해진다. 

 

 

 

객체 지향 프로그래밍은 전과 다른 몇 가지 장점을 갖는다.

먼저 코드의 재사용성이 높아졌고 이전에 복잡했던 유지 보수에서도 탁월한 이점을 갖게 되었다. 또한 전반적인 가독성이 올라가며 규모가 큰 프로젝트도 훨씬 수월하게 가능해졌다. 다만 처음의 설계에 시간이 많이 들고, 프로그램 사이즈가 무의미하게 커질 수 있으며, 절차적 프로그래밍보다 처리 속도가 느리다는 단점을 갖기에 상황에 따라 판단하여 사용할 줄 알아야 한다.