
프로그램 규모가 커질수록 다음과 같은 문제가 생긴다.
서로 관련된 데이터와 함수를 따로따로 관리해야 해서 구조가 복잡해짐
“사용자”, “책”, “계좌”, “센서”처럼 현실 세계의 개체를 코드로 표현하기 어려움
상태(데이터)와 행동(기능)이 흩어져 있어 유지보수 난이도 증가
이 문제를 해결하기 위한 도구가 클래스(Class) 이다.
클래스는 데이터와 기능을 하나의 단위로 묶어,
“객체가 스스로 상태를 관리하고, 행동을 수행하는 구조”를 가능하게 한다.
이로 인해 코드의 응집도가 높아지고, 유지보수가 쉬워진다.
1. 클래스(
class)란 무엇인가?
클래스: 관련된 데이터(속성, attribute)와 기능(메서드, method)를 하나의 "설계도"로 묶어 놓은 것
"사용자", "상품", "계좌", "센서" 같은 개념을 코드로 모델링할 때 사용
이 설계도를 바탕으로 실제로 만들어지는 개체가 객체(오브젝트, object) 또는 인스턴스(instance)
※ 클래스 = 설계도, 인스턴스 = 설계도로 만들어진 실체
클래스: 설계도
객체 / 인스턴스 : 설계도로부터 실제 생성된 결과물
예) "상품"이라는 개념이 클래스, 사이트에 보여지는 각각의 상품이 인스턴스
2. 클래스 기본 문법
class: 클래스의 정의 키워드
ClassName
보통 PascalCase (단어 첫 글자 대문자, 예: UserAccount, PowerMeter)
함수 / 변수의 snake_case 와 구분
✔ 클래스는 PascalCase 이름과 class 키워드로 정의한다.
__init__() 와 self__init__()
객체가 생성될 때 자동 호출되는 초기화 메서드
인스턴스가 사용할 초기 상태(속성 값) 설정
✔ __init__()는 객체 생성 시 초기 속성을 설정한다.
self
생성되는 그 객체 자신을 가리키는 첫 번째 인자
인스턴스 속성 접근 시 항상 self.속성명 형태로 사용
인스턴스 메서드를 my_book.read()처럼 호출하면 파이썬이 내부적으로 Book.read(my_book) 형태로 변환한다.
그래서 첫 번째 파라미터가 self다.
✔ self는 생성된 객체 자신을 가리키는 참조값이다.
✔ 클래스를 호출하면 생성자가 실행되어 인스턴스가 생성된다.
인스턴스 변수(instance variable)
각 인스턴스마다 서로 다른 값을 갖는 변수
보통 __init__() 안에서 self.변수명 = 값 으로 초기화
메서드(method)
클래스 내부에 정의된 함수
첫 번째 인자를 self로 두고 인스턴스 상태에 접근, 변경하는 기능을 담당
3. 객체 생성과 동작
✔ 클래스 정의 → 객체 생성 → 생성자 초기화 흐름을 나타낸 그림이다.
4. 생성자
__init__()함수와self
인스턴스가 생성될 때 필수 속성을 초기화하는 역할
하나의 클래스에 하나의 __init__()을 두는 것이 일반적
필요한 매개변수를 강제하여, 불완전한 상태의 객체 생성을 방지
self 정리self는 메서드가 호출된 그 인스턴스를 가리킴
인스턴스 메서드는 호출 시 자동으로 첫 번째 인자로 해당 객체가 전달되므로,
self는 약속된 이름일 뿐 변경 가능하지만 관례적으로 self를 사용한다.
✔ 메서드 내부에서 self는 호출된 그 객체를 의미한다.
실습1.
class기본 문법 연습
Book 클래스를 정의하세요.
인스턴스 변수로 title, author, total_pages, current_page를 가집니다.
메서드
read_page(pages): 현재 페이지를 읽음. 총 페이지 수를 넘지 않도록 처리
progress(): 전체에서 얼마나 읽었는지를 퍼센트(%)로 소수점 1자리까지 출력
✔ Book 클래스는 속성과 메서드를 활용하는 기본 설계 연습 예제다.
Rectangle 클래스 구현다음 조건이 맞는 Rectangle 클래스를 작성해 보세요.
인스턴스 변수: width, height
메서드: area(), 사각형의 넓이 반환
사용자 입력: 프로그램 실행 시 사용자로부터 가로(width)와 세로(height) 값을 입력 받아 객체를 생성하고,
area() 메서드를 호출하여 넓이를 출력
✔ 입력값으로 객체를 생성하고 area()로 넓이를 계산하는 예시다.
5. 인스턴스 / 클래스의 구성요소
인스턴스 단위: 객체마다 다른 값 / 동작
클래스 단위: 모든 객체가 공유하는 값 / 동작
인스턴스 변수
개념: 각 인스턴스(객체)마다 독립적으로 존재하는 변수
생성자 __init__() 안에서 self.변수명형태로 초기화
특징: 같은 클래스라도 인스턴스마다 값이 다를 수 있고, 인스턴스이름.변수이름으로 접근
✔ 인스턴스 변수는 객체마다 독립적으로 값이 저장된다.
클래스 변수
개념: 클래스 자체에 소속된 변수, 모든 인스턴스가 공유하는 값
특징: 클래스 블록 안, 메서드 바깥에 선언, 클래스명.변수명 형태 권장
공통으로 관리해야 하는 값(예: 전체 객체 수, 전역 설정 값 등)에 사용
✔ 클래스 변수는 모든 인스턴스가 공유하는 값이다.
인스턴스 메서드
개념: 인스턴스를 통해 호출되는 메서드, 첫 번째 인자는 항상 self
self를 통해 인스턴스 변수에 접근 / 수정
✔ 인스턴스 메서드는 self를 통해 객체 상태를 읽거나 수정한다.
✔ 인스턴스 메서드는 객체를 통해 호출되며 self가 자동 전달된다.
클래스 메서드(@classmethod)
cls(클래스 자신)
✔ 클래스 메서드는 cls를 받아 클래스 차원의 동작을 수행한다.
✔ 클래스 메서드는 클래스명으로 호출하며 클래스 변수를 다룰 때 사용된다.
정적 메서드(@staticmethod)
self 나 cls에 의존하지 않는 독립적인 유틸리티 함수를 클래스 내부에 묶고 싶을 때 사용self / cls를 받지 않으며, "이 기능은 이 클래스와 논리적으로 관련 있다."는 구조 표현 용
✔ 정적 메서드는 self·cls 없이 독립적으로 작동하는 유틸 함수다.
✔ 정적 메서드는 클래스명 / 인스턴스 모두로 호출 가능하지만 상태와 무관하다.
✔ 인스턴스 / 클래스 / 정적 메서드의 차이를 한눈에 비교한 표다.
🔎인스턴스 vs 클래스 요약
인스턴스 변수: self를 통해 객체마다 다른 값
클래스 변수: 클래스가 직접 소유, 모든 객체가 공유
접근 권장: 객체.변수(X) / 클래스.변수(O)
실습2. 클래스 변수, 메서드 연습
User 클래스를 정의하세요.
인스턴스 변수: username, points (초기값은 0)
클래스 변수: total_users (생성된 유저 수 저장)
메서드:
add_points(amount): 포인트 추가
get_level(): 포인트 기준으로 레벨 반환
클래스 메서드: get_total_users() ⇒ 총 유저 수 출력
✔ User 클래스 실습은 클래스 변수·메서드·인스턴스 변수를 종합적으로 다룬다.
6. 실무 예시
이 구조의 핵심은 “센서 객체 각각이 자신의 측정값을 독립적으로 관리하면서도, 전체 센서 수는 클래스 레벨에서 공통 관리한다”는 점이다.
✔ 센서 데이터를 객체로 관리해 통계·상태를 구조화하는 실무 예시다.
총 설치된 센서 수: 2개
[센서 요약] ID: PV-101, 위치: 옥상 태양광 인버터
- 최근값 : 330.0
- 최소값 : 310.2
- 최대값 : 330.0
- 평균값 : 320.23
[센서 요약] ID: MTR-B1, 위치: 지하 1층 메인 수전 설비
- 최근값 : 470.3
- 최소값 : 450.0
- 최대값 : 470.3
- 평균값 : 460.15
[개별 접근 예시]
PV-101 최근값: 330.0
MTR-B1 평균값: 460.15
7. 클래스(상) 한눈에 보기
클래스는 데이터(속성) + 기능(메서드) 를 하나로 묶는 설계도
인스턴스(객체)는 클래스로부터 생성된 실제 개체
__init__() 는 인스턴스 생성 시 자동 호출되는 초기화 메서드
self 는 메서드가 호출된 그 인스턴스 자신을 가리킴
인스턴스 변수
self.변수명 형태
보통 __init__() 내부에서 초기화
클래스 변수
클래스 전체가 공유하는 값
클래스 블록(메서드 외부)에 정의
인스턴스 메서드
첫 인자 self
인스턴스 상태 읽기/변경
클래스 메서드
@classmethod, 첫 인자 cls
클래스 변수 조작, 대체 생성자 구현
정적 메서드
@staticmethod
self/cls 사용 X, 유틸리티 함수용
8. 아웃트로
상편에서는 클래스의 기본 골격을 아래 순서에 맞춰 정리했다.
클래스 개념/정의
클래스 기본 문법 (class, __init__, self)
객체 생성과 생성자 동작
인스턴스 변수 vs 클래스 변수
인스턴스 / 클래스 / 정적 메서드
User 포인트 예제까지 실습 정리
하편에서는 이어서
정보 은닉·캡슐화
public / protected / private 네이밍 규칙
@property 를 이용한 캡슐화
상속, super(), 메서드 오버라이딩
추상 클래스와 인터페이스 설계
까지 클래스의 뒷부분을 그대로 따라가면서 정리한다.
문법을 익혔다면 이제 ‘설계’를 배울 차례다.
하편에서는 객체지향의 실제 힘이 드러나는 요소들을 다룬다.