본문 바로가기
Programing

Python - Class

by xuswns 2026. 4. 17.

수업정리

 
  1. Class 기본 개념
  2. 클래스와 객체 (인스턴스)
  3. 객체와 인스턴스의 차이
  4. 클래스를 쓰는 이유
  5. 클래스 정의
  6. 객체 생성
  7. 함수 방식 vs 클래스 방식
  8. self
  9. 클래스 변수와 인스턴스 변수
  10. 생성자 __init__
  11. 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__)

 

https://076923.github.io/posts/Python-37/

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