객체(Object)
객체의 의미를 알기 위해 이를 위한 몇가지 정의를 알아보겠습니다. 첫번째 정의는 아래와 같습니다.
- An object is an abstraction of a real-world entity or concept, encapsulating state and behavior relevant to that entity.[1]
- 객체는 실세계의 엔티티나 개념을 추상화한 것으로, 해당 엔티티와 관련된 상태와 행동을 캡슐화한다.
여기서 추상화(Abstraction)란 복잡한 실세계 엔티티의 핵심적이고 중요한 특징만을 표현하는, 즉 모델링하는 것을 의미한다. 즉, 필요하지 않은 세부 사항을 제거하고, 문제 해결에 필요한 본질적인 특성만을 나타냅니다. 아래는 또다른 대표적인 정의 입니다.
- An object represents an abstraction of something in the real world, containing attributes (data) and operations (behavior) relevant to its purpose.[2]
- 객체는 실세계의 어떤 것을 추상화하여 나타내며, 목적과 관련된 속성(데이터)과 동작(행동)을 포함한다.
- An object is an abstraction of a system element that encapsulates state and behavior.[3]
- 객체는 상태와 행동을 캡슐화한 시스템 요소의 추상화이다.
마지막 정의에서는 System element(시스템의 요소)라는 표현이 있습니다. 결국 encapsulating 된 state와 behavior 들이 우리가 개발해야 할 목표시스템을 구성하는 요소들의 추상체 라는 의미입니다. 이 요소들의 추상체를 소프트웨어 개발 프로세스를 통해 코드로 구현하면, 목표 시스템의 구성 요소가 되어 시스템을 구동할 수 있습니다.
따라서, 객체지향 개발은 우리가 개발하고자 하는 소프트웨어 시스템(목표시스템)을 추상화된 객체의 단위로 분석, 설계, 구현을 해 나가는 접근법으로 이해할 수 있습니다.
위 세가지 정의들을 정리해 보고 예제를 보며 이해를 높여보겠습니다.

좌측의 실세계에 있는 entity, concept, something, system element를 해당 개체와 관련있는, 즉 그 개체가 가지고 있는 데이타(states, attributes)와 수행하는 활동(behavior, operation, method)을 찾아 그 개체의 것으로 묶어(encapsulating) 추상화 과정을 통해 우측의 모델로 정의한다. 즉, 객체지향에서 추상화란 단순히 데이터를 찾는 것이 아니라, 개체를 보는 시각과 목적에 맞춰 의미 있는 속성과 행동을 도출하는 과정이다.
또한 그 객체들은 우리가 개발할 목표시스템의 구성요소가 되어 초기 추상화 단계를 거쳐 설계와 구현을 진행한 후 코드로 실행된다
아래 그림은 우측의 실세계의 Thing을 해당 Thing이 가진 데이터(Attributes)와 행동(operation)을 추상화 과정을 통해 모델링 한 것이다.

우측 상단의 고양이와 자동차는 실세계에 물리적으로 존재하는 개체(entity)이다. 이를 간략하에 모델링 하면 우측과 같은 형태 attributes와 operations를 도출할 수 있다.
세번째 객체인 도서대출은 물리적으로 존재하는 개체가 아니고 논리적으로 존재하는 개념이다. 도서 대출을 하면, 대출 한건에 대해 식별하는 대출번호와 함께 누가, 어떤 책을 언제 대출했고, 언제반납일이며 해당 대출건이 현재 무슨 상태인지 등에 대한 정보가 필요하다. 그리고 이 대출건은 대출 했을때 만들어지고, 책을 반납하면 상태가 바뀌고, 반납일자를 연장할 수 있으며 현재 대출 상태가 무엇인지 확인할 수 있다.
| 정의) 객체지향 프로그래밍에서 객체란 실세계의 사물이나 개념을 목표시스템의 요소로서 속성(데이터)과 메서드(행동, 기능)으로 추상화한 추상체 |
클래스(Class)
객체와 같이 사용하는 용어중 '클래스(class)'라는 용어가 있습니다. 이것도 정의부터 살펴보겠습니다.
- A class is a description of a set of objects that share the same attributes, operations, methods, relationships, and semantics. [3]
- 클래스는 동일한 속성(attributes), 연산(operations), 메서드(methods), 관계(relationships), 그리고 의미(semantics)를 공유하는 객체 집합의 기술(description)이다.
여러 객체들이 있는데 어떤 객체들은 속성과 오퍼레이션, 오퍼레이션이 구현(method), 다른 다른 속성의 객체와의 관계, 관계속에서의 역할과 같은 의미 등을 공유합니다.

말이 어렵지만, 객체는 실세계에 존재하는 Thing들로 위 그림의 예에서는 네마리의 실세계의 고양이들이 나옵니다. 이 고양이를 색깔, 크기, 성별, 품종의 데이터와 점프하고, 보고, 잠자는 행동으로 모델링 해 본다면 가운데 네개의 객체가 모델링 될 수 있습니다. 이러한 속성과 행동을 공유하는 객체들의 집합을 정의하면 Cat이라는 클래스가 정의됩니다. 이렇게, ' description of a set of objects that share ....' 라는 문장을 이해할 수 있습니다.
클래스에 대한 다른 정의를 하나 더 알아보겠습니다
- Classes are abstractions that specify the structure and behavior of a set of objects.
- 클래스는 객체 집합의 구조와 행위(기능)을 명세하는 추상체이다.
이 정의도 처음 정의와 같은 내용인데 여기서는 구조와 행위(기능)을 명세하는 추상체라는 말을 사용했습니다. 즉, 클래스는 우리가 실세계의 물리적으로 존재하는 개체나 논리적으로 존재하는 개념에 대한 구조와 행위(기능)을 명세하는 단위입니다.
아래 그림은 좌측의 실세계에 추상적으로 존재하는 도서대출 이라는 개념을 누가, 무슨책을 언제 빌렸는지, 언제 반납해야 하는지, 해당 건의 상태는 무엇인지를 관리하기 위해 우측의 모델로 추상화 하였습니다 실제 대출 건을 모델 영역의 왼쪽으로 표현한다면, 이 대출 건수들을 포괄적으로 구조와 기능을 정의한 것이 오른쪽 BookLoan 클래스입니다.

도서관 시스템과 함께 생각해 볼 수 있는 다른 예는 일상에서 사용하고 있는 키오스크 시스템입니다. 그림은 좌측의 실세계에서 일상적으로 하는 주문 활동을 보여주는데 이러한 주문처리를 하면, 추상적으로 존재하는 "주문" 이라는 개념을 누가, 어떤 메뉴를 선택했는지 주문 옵션은 어떻고, 가격은 얼마인지를 우측의 모델로 추상화 할 수 있습니다. 실제 주문 건을 모델 영역의 왼쪽으로 표현한다면, 이 대출 건수들을 포괄적으로 구조와 기능을 정의한 것이 오른쪽 Order 클래스입니다.

| 정의) 클래스는 실세계의 객체들을 필요한 정보와 기능을 추려서 구조를 정리한 단위로, 객체들의 설계도, 템플릿, 또는 틀이고, 객체의 공통적인 속성과 행동을 정의합니다. |
클래스의 구성요소
소프트웨어 개발 진행단계에 따라 (분석 -> 설계 -> 구현) 클래스는 분석/설계단계에서는 모델링된 결과로 구현단계에서는 코드로 나타날 수 있습니다. 모델링 수준의 즉, 분석/설계 수준의 클래스의 구성요소는 아래와 같습니다.
- 속성 (Attributes) : 객체의 데이터를 저장하는 변수. 예를 들어 고양이 클래스의 색깔, 크기, 품종 등입니다.
- 메서드 (Methods): 객체가 수행하는 동작을 정의한 함수. 예를 들어 고양이 클래스에서는 meow( ), jump( ), look( ), sleep( )등이 있습니다.
모델수준의 클래스를 특정 코드로 구현(implementation)하면 이는 컴퓨터 메모리의 특정 영역에 클래스의 인스턴스가 생성되고 실행 될 수 있음을 의미합니다. 이러한 의미로 클래스의 구성요소로 생성자(constructor)와 소멸자(destructor)가 필요합니다. 그러나 실행시 메모리 관리를 실행환경에서 해주는 Java나 파이썬의 경우 따로 소멸자를 정의하지 않는다.
- 생성자 (Constructor): 객체(클래스 타입의 인스턴스) 생성시 호출되는 메서드

고양이 클래스는 객체의 의미를 이해하기 위한 단순 예제였으므로 실제로 소프트웨어 개발 예제인 도서대출 클래스 예를 보면 다음과 같다.

클래스 모델 과정에서 대출건의 id를 포함한 여러 속성들이 필요하여 정의하고, 해당 객체가 수행할 기능 즉 해당 대출 건을 대출 상태를 만드는 기능, 반납 상태로 만드는 기능, 대출 기한을 연장하는 기능, 해당 대출 건의 상태를 확인하는 기능을 클래스의 기능으로 정의합니다. 이렇게 정의하면 도서대출 화면에서 대출번호를 입력했을때 도서대출 클래스를 이용하여 대출건의 생성부터 반납완료까지 도서대출 정보를 관리할 수 있게 됩니다.
고양이, 도서대출 클래스와 마찬가지로 키오스크의 주문 클래스를 python으로 구현한 흐름 변화는 아래와 같습니다.

클래스를 정의하고 구현하는 것은 사람의 언어로 표현된 목표 시스템의 요구사항을 객체의 시각으로 정의하고 구현하는 객체지향 프로그램에서의 핵심이 됩니다.
클래스의 인스턴스(Instance)
클래스의 정의에서 '객체'와 '클래스' 그리고 '인스턴스'라는 용어들을 사용하였습니다. 객체는 일반적으로 실세계에서의 객체, 설계상의 객체, 클래스의 인스턴스로서의 객체로 폭넓게 사용합니다. 클래스는 설계의 결과로서의 틀(Template)을 의미한다면, 그 틀을 가지고 만들어낸 실데이터를 가진 클래스의 한 예를 클래스의 인스턴스라 합니다.
이때, 클래스의 인스턴스를 객체라고 부를 수 있어 용어의 혼동이 올 수 있는데, 우리는 코드상에서 클래스의 인스턴스는 객체가 아닌 인스턴스라고 부르겠습니다.
아래의 왼쪽 그림은 클래스와 클래의 인스턴스를 설명할 때 자주 사용하는 붕어빵 틀과 붕어빵 그림이다. 붕어빵 틀을 클래스라고 한다면, 붕어빵 틀에서 구어져 나온 실제 붕어빵을 클래스의 인스턴스라고 한다. 같은 개념으로 우측 Model 박스안에서 Cat 클래스를 통해 다양한 고양이 instance들을 만들 수 있다.

도서 대출 시스템의 예에서도 마찬가지이다. BookLoan 클래스의 형태로 ST240101학생의 대출건, ST191101 학생의 대출건, ST200101학생의 대출건의 각각의 instance 들이 생성되어 시스템에 저장되고 관리 될 수 있다.

카페 키오스크 시스템 예제에서도 키오스크를 통해 주문하는 주문 정보를 아래와 같이 클래스로 도출하고, 실제 주문하는 예 들을 클래스의 인스턴스로 정의할 수 있다.

구현에서의 클래스와 인스턴스
이렇게 모델수준에서 클래스와 인스턴스를 구분했으면, 코드에서도 구분할 수 있다. 1번 화면에서는 Cat 클래스를 정의하고 있다. 이렇게 정의된 클래스가 2번 화면에서 모델에서의 4가지 고양이들이 클래스의 인스턴스로 생성되어 각각 my_cat_1, my_cat_2, my_cat_3, my_cat_4의 클래스 변수에 할당된다. 3번 그림의 모델에서 instance 였던 각각의 고양이 모델들이 my_cat_1등의 객체타입 변수로 메모리에 할당되는 것이다.

파이썬 코드에서 self의 의미

도서대출 클래스와 주문 클래스는 실습 과정에서 코드로 작성해 봅니다.
마치며
객체와 클래스를 알아보고 클래스의 구성요소와 실세계의 객체로부터 클래스 구현까지를 따라가 보았다. 학습한 내용을 기반으로 아래의 질문을 생각해 보자.
- 클래스를 정의하기 위한 구성요소는 무엇이 있는가?
- 객체와 클래스, 그리고 클래스 인스턴스란 무엇인가?
- 객체지향 프로그래밍에서 클래스가 어떤 역할을 하는가?
- 도서대출 시스템과 키오스크 시스템에서 구현 가능한 객체를 찾아보고 클래스를 정의해 보자.
참고문헌
1. Grady Booch's Object-Oriented Design (OOD)
2. Object-Oriented Software Engineering (Ivar Jacobson)
3. ISO/IEC 19505-1 (UML Standard)
4. The Unified Modeling Language User Guide (Grady Booch, James Rumbaugh, Ivar Jacobson)
5. UML Reference Manual by James Rumbaugh, Ivar Jacobson, Grady Booch
5. Grady Booch (Object-Oriented Analysis and Design with Applications)
'[2] 객체지향 프로그래밍 설계(파이썬) > 2주차. 객체와 클래스' 카테고리의 다른 글
| [2주차] 2.3 [참고] 파이썬 기본 문법 (0) | 2026.03.12 |
|---|---|
| [2주차] 2.2 [실습] 파이썬으로 클래스 생성하기 (0) | 2026.03.12 |