수업정리
- Class 기본 개념
- 클래스와 객체 (인스턴스)
- 객체와 인스턴스의 차이
- 클래스를 쓰는 이유
- 클래스 정의
- 객체 생성
- 함수 방식 vs 클래스 방식
- self
- 클래스 변수와 인스턴스 변수
- 생성자 __init__
- self 누락 에러 예제
Class
- 객체지향 프로그래밍( OOP, Object Oriented Programming)의 기본단위
- 클래스명은 일바적으로 첫문자를 대문자로 작성
- Field( 변수) 와 Method(함수) 로 구성
- 반복되는 변수 & 매소드(함수)를 미리 정하여 만들어 놓은 설계
- 클래스는 프로그래밍 과정에서 객체를 정의하는 데이터와 이를 활용하는 기능을 가질 수 있는 구조를 의미한다.
- 각 클래스는 그 안에 그 상태를 정의 할수 있는 속성(attributes)와 그 상태를 변경할 수 있는 메서드(methods)를 가진다.
- 상속(inheritance)을 통해 속성들과 메소드들을 다른 객체(클래스)로 전달 할 수 있다.
클래스와 객체(인스턴스)
- class란 똑같은 무언가를 계속해서 만들어 낼 수 있는 설계도면 같은 것이다.
- 객체(object) 또는 인스턴스(instance)란 클래스에 의해서 만들어진 피조물이다.
- 객체는 독립, 즉 한 객체의 변화가 다른 객체에 영향을 주지 않는다.
객체와 인스턴스의 차이
클래스에의해서 만들어진 객체를 인스턴스라고도한다.
그렇다면 객체와 인스턴스의 차이는 무엇일까.
a = Cookie() 이렇게 만들어진 a는 객체이다.
a라는 객체는 Cookie의 인스턴스이다.
즉 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용된다.
a = Cookie() 에서
a는 인스턴스보다는 a는 객체라는 표현이 어울리며
a는 Cookie의 객체 보다는 a는 Cookie의 인스턴스라는 표현이 어울린다.
클래스를 쓰는 이유
- 서로 관계가 전혀 없는 변수와 함수를 항상 연결하고, 수정하는 것 보다는 클래스 - 속성 - 메서드 형태의 논리적인 명세서를 따라가는 경우가 효과적임
클래스 정의
- class로 시작
- class 키워드와 함께 클래스명(일반적으로 첫문자는 대문자)과 콜론으로 이루어짐

- 클래스는 객체를 어떻게 만들 것인가 정의하는 특별한 사용자 정의 데이터 타입
- 각 메소드의 첫 번째 인수를 관례적으로 self라고 명시
- self는 메소드를 호출하는 현재 객체를 나타내는 매개변수
- 사용자를 위해서 파이썬이 self 인수를 추가해주므로 사용자는 메소드를 호출할 때 self 인수를표기하지 않음
객체
객체생성
- 클래스 이름과 __init__ 메소드에 전달 할 인수르 사용
- 객체는 클래스의 인스턴스



함수 방식
- result1, result2처럼 계산기가 늘어날 수록 전역변수도 계속 늘어난다.
- 계산기가100개필요하면 전역변후 100개 함수도 100개..
클래스 방식
- 인스턴스 내부 (self.result)에저장
- 각 인스턴스가 완전히 독립
self
- 현재 인스턴스 그 자체를 의미하는 매개변수
- 파이썬 함수형식을 클래스의 method로 사용하기 위한 파이썬의 특징적인 변수이다.
- 클래스 내에서 사용되는키워드로 클래스 내에 정의된 속성이나 메서드 등을 사용하게 해준다.
- 각 메서드를 정의하는 입력 인자로 self 키워드가 꼭 추가되어야 함.
클래스 변수와 인스턴스 변수
- 클래스 변수가변경되면, 모든 객체들에게도 변경된 내용이 적용됨.
- 객체의 변수가변경되었다 해도, 클래스 변수가 변경되지는 않음
클래스 변수
- 메서드와 동일 단계에 작성됨
- self 를 사용하지 않고 정의 됨. 그러므로 모든 클래스에 동일하게 영향을 미침
- 인스턴스가 생성될 때 초기화되지 않으므로, 클래스명. 클래스 속성으로 참조 가능
인스턴스 속성
- 인스턴스 속성은 인스턴스를 초기화 할 때 사용된다.
- self를 이용해 정의하므로 인스턴스 내에서만 영향을 미친다.
- 인스턴스가 생성될 때나 생성된 후 할당되므로, 인스턴스명.인스턴스 속성 으로 참조가 가능하다.
class Apple:
calss_value = 0
def __init__(self):
self.instance_value = 0
def set_class_value(self):
Apple.class_value = 10
def set_instance_value(self):
self.class_value = 20
instance1 = Apple()
instance2 = Apple()
print('-----클래스 속성 변경-----')
instance1.set_class_value()
print(f'instance1 class_vlaue:{instance1.class_value} , instance2.class_value : {instance2.class_value}' )
print('-----인스턴스 속성 변경-----')
instance1.set_instance_value()
print(f'instance1 class_vlaue:{instance1.class_value} , instance2.class_value : {instance2.class_value}' )
print('----속성 Attribute 출력 -----')
print(instance1.__dict__)
print(instance2.__dict__)

Apple Class
- instance1 과 instance2 를생성해 instance1에 대해서만 작업 진행
set_class_value 메서드는 클래스 속성을 변경하는 메서드이며,
set_instance_value 메서드는 인스턴스 속성을 변경하는 메서드이다.
set_class_value
- instance에 클래스 값을 변경하면, Apple에 대한 동일한 속성이 일괄 변경된다.
즉, instance2를 변경하지 않아도 클래스 자체의 값이 변경되어 instnace2의 값도 변경된다.
set_instance_value 메서드
instance1에 인스턴스 값을 변경하면, instance1에 대한 속성만 변경이 된다.
메서드 내부에서 class_value를 인스턴스화한다. 즉, instance2는 영향을 미치지 않는다.
__dict__ 속성
__dict__ 는 현재인스턴스에 할당된 인스턴스 속성만 출력한다.
instance1의 인스턴스 속성은 instance_value와 인스턴스화된 class_value이다.
instance2의 인스턴스 속성은 instance_value이다.
instance2에서 set_instance_value 메서드를 통해 class_value를 인스턴스화 하지 않아, 클래스 속성이 유지되기 때문이다.
초기자,(생성자 Initializer)
- 생성자 (constructor)란 객체가 생성될 때 자동으로 호출되는 메서드를의미한다
- 객체에 초기값을 설정해야 할 필요가있을 때는 setdata와같은 메서드를 호출하여 초기값을 설정하기 보다는 생성자를 구현하는 것이 더 안정적이다.
- 파이썬 메서드 명으로 __init__을 사용하면 이 메서드는 생성자가 된다. .
예제 1


여기서는 무엇이 잘못된걸까
- add 메서드에 self 가 빠진 것이다.
cal = Calulator()
cal.add(3)
# Calculator.add(cal,3)
# ^(3 == val)
주석친 코드대로 내부적으로 작동하게 되는데
위 코드에서 cal.add(3) 을 진행하게 되면
cal이 val자리에 들어가고 3은 받을자리가 없어진다.
그러므로
TypeError: Calculator.add() takes 1 positional argument but 2 were given
# "인자 1개짜리인데 2개가 들어왔다"
같은 에러가 나는 것이다.

위 코드로 진행되면 오류없이작동된다.
즉, 클래스 메서드는 항상 self가 첫번째 여야한다.!
'Programing' 카테고리의 다른 글
| 영상처리 입문 (0) | 2026.05.06 |
|---|---|
| SQLAlchemy Column vs Mapped (0) | 2026.04.30 |
| Python - List (0) | 2026.04.14 |
| 머신러닝 (0) | 2026.04.13 |
| 빅데이터 (0) | 2026.04.09 |