Fear is a habit. I'm not afraid.
오브젝트의 이해 본문
오브젝트 (Object)
오브젝트, 즉 객체는 객체 지향 기술을 이해하는 데 핵심적인 요소입니다.

소프트웨어 객체는 실제 객체와 개념적으로 유사하며, 상태 state 와 관련 동작 behavior 으로 구성됩니다. 객체는 필드(일부 프로그래밍 언어의 변수)에 상태를 저장하고 메서드(일부 프로그래밍 언어의 함수)를 통해 동작을 노출합니다. 메서드는 객체의 내부 상태에서 작동하며 객체 간 통신을 위한 주요 메커니즘 역할을 합니다. 내부 상태를 숨기고 모든 상호작용을 객체의 메서드를 통해 수행하도록 하는 것을 데이터 캡슐화라고 하며, 이는 객체 지향 프로그래밍의 기본 원칙입니다.
자전거로 예를 들자면:

상태(현재 속도, 현재 페달 케이던스, 현재 기어)를 속성으로 지정하고 해당 상태를 변경하는 방법을 제공함으로써 객체는 외부 세계가 어떻게 사용하도록 허용되는지 제어할 수 있습니다. 예를 들어 자전거에 기어가 6개만 있는 경우 기어를 변경하는 메서드는 1보다 작거나 6보다 큰 값은 모두 거부할 수 있습니다.
코드를 개별 소프트웨어 객체에 묶으면 다음과 같은 여러 가지 이점이 있습니다:
- 모듈화(Modularity): 한 개체의 소스 코드는 다른 개체의 소스 코드와 독립적으로 작성 및 유지 관리할 수 있습니다. 한 번 생성된 개체는 시스템 내에서 쉽게 전달할 수 있습니다.
- 정보 은닉(Information-hiding): 객체의 메서드와만 상호 작용하기 때문에 내부 구현의 세부 사항은 외부에 노출되지 않습니다.
- 코드 재사용(Code re-use): 이미 존재하는 객체(다른 소프트웨어 개발자가 작성한 것일 수도 있음)가 있다면 프로그램에서 해당 객체를 사용할 수 있습니다. 이를 통해 전문가가 복잡한 작업별 객체를 구현/테스트/디버깅할 수 있으며, 사용자는 이를 자신의 코드에서 실행할 수 있습니다.
- 플러그 가능성 및 디버깅 용이성(Pluggability and debugging ease): 특정 객체에 문제가 있는 것으로 판명되면 애플리케이션에서 해당 객체를 제거하고 다른 객체를 대체할 수 있는 플러그인만 연결하면 됩니다. 이는 실제 세계에서 기계적인 문제를 해결하는 것과 유사합니다. 볼트가 부러지면 기계 전체를 교체하는 것이 아니라 볼트 하나만 교체하면 됩니다.
그렇다면 오브젝트와 반대되는 개념?
프로젝트라고 할 수 있습니다.
오브젝트 (Object)
정체성과 속성, 동작을 가진 “사물”이나 개념적 구성 요소를 뜻하며, 소프트웨어 개발적 관점에서는 클래스의 인스턴스로서, 데이터와 메서드를 포함합니다.
프로젝트 (Project)
목표를 위해 일정 기간 동안 수행되는 계획된 작업의 집합으로, 소프트웨어 개발적 관점에서는 특정 목적을 위한 코드, 리소스, 파일의 집합을 뜻합니다.
비유적 의미
구분 | 오브젝트 | 프로젝트 |
주체 | 객체 중심 | 절차(프로세스) 중심 |
관점 | **사물(주체)**이 스스로 행동 | 작업 흐름을 사람이 설계 |
비유 | “자동차가 스스로 움직인다” | “운전자가 차를 조작해 움직인다” |
구조 | 데이터 + 행동이 객체 안에 캡슐화 | 데이터와 로직이 분리되어 있음 |
예시 | car.drive() → 자동차가 스스로 운전 | drive(car) → 누군가가 자동차를 운전 |
코드를 통한 두 개념의 이해
오브젝트 기반 코드 (Object-Oriented)
class Car:
def __init__(self, name):
self.name = name
def drive(self):
print(f"{self.name}가 스스로 운전 중입니다.")
# 사용
my_car = Car("테슬라")
my_car.drive()
특징
- Car 객체가 자신의 행동(drive(self) 을 알고있습니다. 즉, Car 객체가 데이터와 행동을 모두 포함하고 있습니다.
- 메시지를 객체에게 보내는 방식입니다.
- 캡슐화된 구조로 되어있습니다.
프로젝트 기반 코드 (Procedural)
def drive(car_name):
print(f"{car_name}를 외부에서 조작하여 운전 중입니다.")
# 사용
car_name = "테슬라"
drive(car_name)
특징
- car_name 은 정보만 담고 있는 단순한 데이터 입니다.
- 운전 행동은 외부 함수 drive() 가 담당합니다.
- 절차지향적 흐름 구조로 되어있습니다.
코드로 이해하니 조금 더 직관적이게 이해할 수 있게 된 것 같다.
기본기는 언제나 중요!!
출처:
https://docs.oracle.com/javase/tutorial/java/concepts/object.html
'basic' 카테고리의 다른 글
The Definitive Guide to Scrum: The Rules of the Game (0) | 2025.05.14 |
---|---|
JVM의 메모리 구조 (0) | 2025.05.02 |
1과 1.0은 같은가? (0) | 2025.04.30 |
메모리 아키텍처에 대하여 (폰 노이만 아키텍처, 하버드 아키텍처) (0) | 2025.04.30 |
This is CS50 (4) Algorithms (0) | 2024.06.06 |