패러다임
패러다임의 사전적 정의는 ‘한 시대의 사람들의 견해나 사고를 근본적으로 규정하고 있는 인식의 체계’ 입니다.
대표적으로는 ‘천동성’과 ‘지동설’이 있습니다. 천문학을 바라보는 관점이 ‘지구가 중심이다’, ‘태양이 중심이다’라는 관점으로 나눠진 것입니다.
프로그래밍 패러다임
프로그래밍 패러다임이란 프로그래밍을 바라보는 관점이 규정된 체계라고 할 수 있습니다. 프로그래밍 패러다임을 통해 어떻게 프로그래밍 하는 관점이 존재하고 이를 이해한다면 좋은 프로그램을 만드는데 도움이 됩니다.
프로그래밍 패러다임은 대표적으로 명령형 프로그래밍과 선언형 프로그래밍이 있습니다.
명령형 프로그래밍
: 문제를 어떻게(HOW) 해결하는지에 집중하는 패러다임,
- 절차 지향 : 순차적인 명령 수행과 더불어, 프로시저(루틴과 서브 루틴, 메서드, 함수) 호출을 기반으로 문제를 해결하는 패러다임
- 객체 지향 : 실제 세계를 추상화 시켜, 상태와 행위를 가진 객체들 간 상호작용을 통해 문제를 해결하는 패러다임
선언형 프로그래밍
: 무엇을(WHAT) 해결할 것인지에 집중하고 어떻게 해결할 것인지는 컴퓨터에 위임하는 패러다임
- 함수 지향 : 문제를 함수 중심으로 설계하고 이를 조합해 해결하는 프로그래밍 방법론입니다.
객체 지향 프로그래밍
객체
객체란 실제 세계와 무언가와 대응되는 개념입니다.
객체 지향
객체 지향이란 실제 세계와 더 밀접하게 모델링하는 기법으로써, 설계 이론에 가깝습니다. 객체 지향에서는 클래스를 이용해서 연관된 상태(state)나 행위(behavior)를 모아 설계합니다. 이 때, 상태는 변수(variable), 행위는 메서드(method)로 표현합니다. 이렇게 설계한 클래스로부터 생성되는 것을 객체라고 합니다.
참고) 객체지향과 현실 세계의 차이점 - 의인화 객체지향에서는 객체가 자율적으로, 능동적으로 행동할 수 있다고 의인화해야 합니다. 예를 들어, 아이폰을 쓰려면 인간의 손짓이 필요한데, 객체 지향에서는 아이폰 자체가 의인화 되어 표현되기 때문입니다.
즉, 객체 지향 프로그래밍이란 다양한 객체들을 협력시킴으로써, 하나의 애플리케이션으로 동작하도록 하는 프로그래밍 방법론입니다.
클래스와 객체 정의
객체 지향 프로그래밍 내에서 클래스란 실제 세계의 문제를 해결하기 위해 실제 세계를 추상화시켜, 상태와 행위를 변수와 메서드로 정의한 것을 말합니다. 객체는 클래스에서 정의 한 것을 토대로 실제 메모리 상에서 할당된 것을 뜻합니다.
다른 패러다임과 가장 큰 차이점은 바로 이 추상화입니다. 추상화는 실제 세계의 사물의 공통점·본질을 추출하는 행위를 의미합니다. 결국 추상화를 시작으로, 객체를 위한 클래스를 구성할 수 있기 때문에 추상화는 꼭 이해해야 할 필요가 있습니다.
장점
1. 코드의 재사용
서로 다른 클래스를 상속이나 합성, 인터페이스를 통해 확장시켜, 재사용에 용이합니다.
2. 유지보수가 쉽습니다.
객체지향 프로그래밍에서는 추상화/상속/다형성/캡슐화 원칙을 적용함으로써 수정해야 할 부분을 보다 구체적인 클래스 내부의 멤버 변수나 메서드로 한정시킬 수 있기 때문에 비교적 유지보수가 쉽습니다.
3. 복잡한 프로그램에 유리할 수도 있습니다.
고성능 하드웨어를 위한 복잡한 소프트웨어를 만들 때 적합하다. 복잡한 소프트웨어를 위한 추상화에 특화된 개발을 이어나갈 수 있습니다. 또한, 다형성을 통해 강하게 비결합된 시스템을 만들 수 있기 때문입니다. 강하게 비결합된 프로그램을 통해 참조 투명성을 지님으로써 시스템을 예상 가능하게 만들수도 있습니다.
참고) 절차 지향 프로그래밍의 경우에는 수정이 필요할 때, 프로그램 전체가 유기적으로 연결되어 있기 때문에 일일이 찾아야 합니다.
단점
- 객체가 많아질 수록 프로그램 용량이 커질 수 있습니다.
- 객체 설계 시에 많은 시간이 필요합니다.
마치며
이전까지는 객체 지향을 대할 때, 단순하게 "클래스랑 객체 만들어서 써야지” 하는 것으로만 알고 사용하고 있었다.
하지만, 그 뿌리에 있는 패러다임과 '객체 지향'이 설계법이라는 것을 학습할 수록 클래스든 객체든 결국 문제를 해결하기 위한 관점이었다. 정작 집중해야할 부분은 추상화임을 알게됐다.
결국 객체 지향 프로그래밍을 위한 첫 시작은 추상화인 실제 세계의 공통 성질과 본질을 파악해 어떻게 클래스 내 상태와 행위로 표현할 것인지가 중요함을 느꼈다.