"깊이"가 다른 게임개발자 허민영

유저에서 게임까지, 철학에서 코딩까지, 본질을 보는 게임개발

★철학으로 보는 코딩

객체지향 맥락잡기

허민영 2025. 2. 14. 21:05

1. 절차형 프로그래밍 패러다임의 탄생

프로그래밍의 근본을 탐구하면 결국 메모리와 연산으로 귀결되지만, 이 글에서는 절차형 프로그래밍의 핵심 구조인 변수와 프로시저부터 시작하겠다.
명령형 프로그래밍 패러다임에는 데이터와 커맨드라는 두 가지 요소가 근본적으로 존재한다. 모든 코드는 데이터이거나 커맨드이다.(물론 더 본질적으로는 다 데이터이지만 넘어가자.) 단순히 데이터를 나열하고 커맨드를 실행하면 프로그램은 동작하지만, 이는 인간이 이해하고 유지하기에는 지나치게 복잡하다.

인간의 인지적 한계를 극복하기 위해, 우리는 개념을 도입했다. 데이터를 쉽게 다루기 위해 변수(variable) 를, 커맨드를 쉽게 다루기 위해 프로시저(procedure) 를 정의했다.
이제 데이터는 변수를 통해, 커맨드는 프로시저를 통해 다뤄지면서 절차형 프로그래밍이 탄생했다. 더이상 데이터와 커맨드를 직접 입력하지 않고 변수와 프로시저로 간단히 코딩할 수 있게 된 것이다!!

2. 객체지향 프로그래밍 패러다임의 탄생

절차형 프로그래밍은 큰 발전이었지만, 컴퓨터 기술의 더욱 비약적인 발전과 함께 다시 한계를 맞이했다. 프로그램이 복잡해지면서 더 높은 수준의 개념적 조직이 필요해졌다.

이제 변수를 한 단계 더 발전시켜 필드(field) 로, 프로시저를 메서드(method) 로 추상화하고, 이 둘을 포괄하는 새로운 개념 클래스(class) 가 등장했다.
절차형 프로그래밍이 객체지향 프로그래밍(OOP) 으로 발전한 순간이다.

처음에는 클래스로 덮어놓은 구조가 괜한 답답한 규칙과 의미없는 프레임처럼 보일 수도 있다. 그러나 객체지향을 제대로 이해하려면 시야를 변수와 프로시저에서 클래스와 클래스 간 관계로 확장해야 한다.
이제 변수와 프로시저는 클래스 내부의 세부적인 구현일 뿐이다.

조금 더 구체적이지만 비약적인 비유를 들어보자.

  • private 필드는 기존 절차형 프로그래밍의 변수와 유사하다.
  • private 메서드는 기존의 프로시저와 유사하다.

private 메서드가 프로시저와 유사하다는 말에 의문이 들었다면 제법 "객체지향적이고 개발자적인" 사람일지도 모른다.  객체지향에서 프로시저는 클래스 내부에 존재하지 않는 것이 이상적이라 생각하는 게 객체지향적인 시각이기 때문이다. 즉, 클래스 내부에는 순수 메서드가 존재하기에 그 private 메서드야말로 메서드 의미 그 자체에 가깝다고 볼 수 있기 때문이다.

 

그럼에도 private 메서드를 프로시저와 동일시할 수 있는 이유가 있다.
객체지향적인 시각에서 본다면, 프로시저는 지양해야 할 구시대적 개념이므로 클래스 내부에 없는 것이 바람직하다.
하지만 "근본적인 기계적인" 관점에서 본다면, private 메서드는 절차를 수행하는 역할을 하므로 오히려 프로시저와 더 유사하다고 볼 수도 있다.

이제 public 메서드야말로 기존의 프로시저와는 다른 개념에 가깝다는 점을 눈치챌 수도 있을 것이다.
이 부분을 더 깊이 다루기 전에, 다음 이야기를 이어가 보자.

3. 클래스 외부: 좁은 의미의 프로시저와 메시지

이제 클래스 외부에서의 개념을 다루겠다.
즉, public 필드와 public 메서드에 대한 이야기다.

앞서 말한 "객체지향적이고 개발자적인 시각"에서 보면, 클래스 간의 상호작용이 발생하는 곳에 프로시저가 산재해 있다. 기존 절차형 프로그래밍의 프로시저를 해체하고 쪼개버렸다. 더 이상 순차적인 흐름 별로 남지 않았다.
우리는 프로시저로부터 벗어나고자 했고, 결국 승리한 것이다.

우리에게 패배한 쪼그라진 프로시저를 본질적으로 살펴보자. 저 프로시저는 프로시저일까? 그 프로시저엔 실질적인 데이터의 변화가 없다. 프로시저라 부른 개념만이 남아있을 뿐이다.
이제 우리는 이 프로시저처럼 보이지만 실체가 사라진 개념메시지(message) 라고 부른다.

객체지향 프로그래밍에서는 클래스 간의 상호작용이 즉, 메시지를 주고받는 방식으로 이루어진다.
이는 개발자를 위한 개념적 장치이며, 컴퓨터 자체에는 직접적인 의미가 없는 추상화다.

이제와서 public 과 private을 다시 살펴보자.

  • public은 메시지를 위한 조건이며,  필드를 본질적 (데이터) 으로는 거리두게하고 용법적 (변수) 으로는 가까워지게 하는 한정자다.
  • private은 메시지로부터 해방이며, 메서드를 본질적 (커맨드)  으로는 가까워지게하고 용법적(프로시저)으로는 멀어지게 하는 한정자다.

이제 객체지향이 절차형과 어떻게 다른지 보다 명확해졌을 것이다.
이러한 관점에서 보면, 객체지향 프로그래밍은 단순한 구조적 변화가 아니라, 사고방식의 전환이라고 할 수 있다.