객체지향 프로그래밍 (Object-Oriented Programming)

컴퓨터과학·AI
한 줄 정의: 프로그램을 하나의 커다란 절차가 아니라, 데이터와 그 데이터를 다루는 기능을 함께 묶은 "객체" 단위로 나누어 설계하는 프로그래밍 방식입니다.

쉽게 풀면

자동차를 생각해 봅시다. 자동차는 "색깔, 속도, 연료량" 같은 정보(속성)와 "가속하다, 멈추다, 방향을 바꾸다" 같은 동작(기능)을 함께 가지고 있습니다. 객체지향 프로그래밍은 이렇게 정보와 동작을 하나의 덩어리, 즉 "객체"로 묶어서 프로그램을 만드는 방식입니다. 자동차라는 설계도(클래스)를 한 번 만들어두면, 그 설계도로 빨간 자동차, 파란 자동차 등 실제 객체를 여러 개 찍어낼 수 있습니다. 또한 "트럭"이라는 객체는 자동차의 기본 기능을 그대로 물려받으면서 "짐칸" 같은 새로운 기능만 추가할 수도 있는데, 이를 상속이라고 부릅니다. 이런 방식 덕분에 코드를 재사용하기 쉽고, 프로그램이 커져도 부품처럼 관리하기가 편해집니다.

왜 중요한가

객체지향 프로그래밍은 대규모 소프트웨어를 여러 사람이 나누어 개발하고 오랜 기간 유지보수해야 하는 현실적 필요에서 널리 자리 잡았기 때문에, 소프트웨어공학, 정보시스템, 시뮬레이션 연구 등 시스템 구조를 설명해야 하는 논문에서 설계 근거로 자주 언급됩니다. 특히 시스템의 확장성이나 재사용성, 협업 효율을 주장할 때 객체지향 설계 원칙을 얼마나 잘 따랐는지가 설계 타당성의 근거로 제시되는 경우가 많습니다.

논문에서는 이렇게 쓰입니다

"시스템은 객체지향 프로그래밍 패러다임에 따라 각 모듈을 독립적인 클래스로 설계하여 유지보수성과 재사용성을 높였다."

이 문장은 소프트웨어공학이나 정보시스템 개발을 다루는 논문의 시스템 설계 부분에서, 코드 구조를 설명할 때 흔히 쓰입니다. 객체지향 프로그래밍은 대규모 소프트웨어의 유지보수성과 확장성을 논할 때 근거로 자주 인용되는 기초 개념입니다.

"시뮬레이션 모델은 각 개체를 독립적인 객체로 표현하는 개체 기반 모델링(agent-based modeling) 기법을 채택하여, 객체 간 상호작용을 통해 전체 시스템의 창발적 행동을 재현하였다."

사회과학이나 생태학의 시뮬레이션 연구에서는 객체지향적 사고방식을 개체 기반 모델링이라는 형태로 응용하는 경우가 있습니다.

"게임 엔진의 캐릭터 시스템은 상속과 다형성을 활용한 클래스 계층구조로 설계되어, 신규 캐릭터 유형 추가 시 기존 코드의 수정 없이 기능을 확장할 수 있었다."

게임 개발이나 인터랙티브 시스템 연구에서는 상속·다형성 같은 객체지향 개념이 실제로 어떻게 확장성을 높였는지 구체적으로 설명하는 경우가 많습니다.

조금 더 깊게 보면

객체지향 프로그래밍은 흔히 캡슐화(데이터와 기능을 하나로 묶고 내부 구현을 감추는 것), 상속(기존 클래스의 기능을 물려받아 확장하는 것), 다형성(같은 이름의 동작이 객체 종류에 따라 다르게 동작하는 것), 추상화(공통 특성을 뽑아내 인터페이스로 정의하는 것)라는 네 가지 핵심 원칙으로 설명됩니다. 논문에서 설계를 정당화할 때는 이 원칙 중 어떤 것이 유지보수성이나 확장성 향상에 실제로 기여했는지를 구체적으로 짚어주는 경우가 설득력을 높입니다.

주의할 점

객체지향은 유일한 프로그래밍 방식이 아니라 여러 접근법 중 하나이며, 순서대로 명령을 실행하는 절차적 방식이나 제어구조 중심의 사고와는 설계 관점이 다릅니다. 무조건 객체로 나눈다고 좋은 설계가 되는 것은 아니며, 문제의 성격에 맞게 선택해야 합니다.

관련 용어