파이썬을 처음 공부할 때 우리는 위에서 아래로 순차적으로 실행되는 코드를 작성합니다. 변수를 만들고, if문으로 조건 판단을 하고, for문으로 반복을 돌리는 방식입니다. 이러한 방식을 절차지향 프로그래밍(Procedural Programming)이라고 부릅니다.

혼자서 작성하는 50줄, 100줄짜리 간단한 자동화 스크립트나 데이터 수집 코드까지는 절차지향 방식이 훨씬 직관적이고 빠릅니다. 하지만 코드의 길이가 500줄을 넘어가고, 다루어야 할 데이터와 기능이 복잡해지기 시작하면 상황이 완전히 달라집니다.

저 역시 초보 시절, 프로그램 기능이 추가될 때마다 전역 변수가 사방에서 꼬이고 이전 코드를 수정하다가 생각지도 못한 곳에서 버그가 터지는 경험을 무수히 했습니다. 오늘 글에서는 왜 초보 프로그래머가 어느 순간 반드시 객체지향 프로그래밍(OOP, Object-Oriented Programming)이라는 개념을 받아들여야 하는지 그 현실적인 이유를 정리해 드립니다.


1. 절차지향 코드의 한계: 소프트웨어의 복잡성 폭발

절차지향의 가장 큰 문제는 데이터(변수)와 데이터를 조작하는 기능(함수)이 분리되어 있다는 점입니다.

예를 들어 게임 속 캐릭터나 회사 직원 관리 시스템을 만든다고 가정해 보겠습니다. 캐릭터의 체력, 마나, 공격력이라는 데이터는 전역 변수로 떠돌고, 이를 수정하는 attack(), heal() 같은 함수들은 외부에서 이 변수들을 찾아다니며 값을 바꿉니다.

프로그램이 커질수록 어떤 함수가 어떤 변수를 수정하고 있는지 추적하기가 불가능해집니다. 실수로 다른 함수에서 체력 변수 값을 음수로 만들어버리거나 이상한 문자열을 넣어도 어디서 에러가 발생했는지 찾느라 몇 시간을 허비하게 됩니다. 이를 소프트웨어 공학에서는 '코드가 꼬였다' 혹은 '스파게티 코드가 되었다'고 표현합니다.


2. 객체지향(OOP)이란 무엇인가? (현실 세계의 반영)

객체지향 프로그래밍은 프로그램을 단순히 '순서대로 실행되는 명령어들의 집합'으로 보지 않습니다. 대신 '서로 상호작용하는 독립된 객체(Object)들의 모임'으로 바라보는 시각의 전환입니다.

현실 세계를 생각해 보세요. 자동차는 엔진, 바퀴, 핸들 같은 부품(객체)들이 모여서 작동합니다. 우리는 자동차 운전을 할 때 엔진 내부의 피스톤이 분당 몇 번 왕복하는지 일일이 제어하지 않습니다. 그저 '엑셀을 밝는다', '브레이크를 밟는다'는 준비된 조작(메서드)만 할 뿐입니다.

객체지향은 이 개념을 코드에 그대로 가져옵니다. 관련 있는 데이터와 그 데이터를 다루는 기능을 하나의 단단한 상자(객체) 안에 함께 묶어버리는 것입니다.


3. 비전공자가 객체지향을 배울 때 얻는 3가지 실질적 이점

1) 코드의 재사용성이 비약적으로 상승합니다

잘 설계된 객체는 하나의 완벽한 '부품' 역할을 합니다. A 프로젝트에서 만든 '사용자 인증 객체'나 '데이터베이스 연결 객체'를 B 프로젝트로 그대로 가져와 바로 사용할 수 있습니다. 똑같은 로직을 매번 처음부터 새로 작성할 필요가 사라집니다.

2) 유지보수와 버그 수정이 쉬워집니다

특정 기능에 오류가 생기면 전체 코드를 다 훑어볼 필요 없이 해당 기능을 담당하는 '객체 내부'만 수정하면 됩니다. 객체 외부의 다른 코드에는 영향을 주지 않으므로 사이드 이펙트(Side Effect, 부작용) 버그가 발생할 확률이 획기적으로 줄어듭니다.

3) 대규모 협업이 가능해집니다

여럿이 함께 프로그램을 만들 때 절차지향 방식은 서로의 변수명이 충돌할까 봐 끊임없이 눈치를 봐야 합니다. 반면 객체지향 방식에서는 "A 개발자는 회원 관리 객체를 만들고, B 개발자는 결제 시스템 객체를 만든다"처럼 역할 분담이 명확해집니다.


핵심요약

  • 절차지향 방식은 코드의 규모가 커질수록 데이터와 함수가 복잡하게 얽혀 유지보수가 불가능해지는 한계가 있습니다.

  • 객체지향 프로그래밍(OOP)은 연관된 데이터와 기능을 '객체'라는 독립된 부품 단위로 묶어서 관리하는 개발 패러다임입니다.

  • OOP를 도입하면 코드 재사용성이 높아지고, 버그 발생 범위가 격리되며, 대규모 협업이 수월해집니다.