Big Ben
Big Ben's Log
Big Ben
전체 방문자
오늘
어제
  • 전체 글 (80)
    • 파이썬 (23)
      • 파이썬 기초 (5)
      • 클래스 (6)
      • 자료구조 (4)
      • Tensorflow (3)
      • PyTorch (2)
      • konlpy (1)
      • anaconda (1)
    • 머신러닝 (3)
      • 선형회귀 (1)
      • Tree 기반 (1)
    • 딥러닝 (6)
      • NLP (2)
      • VISION (2)
      • TABULAR (0)
      • 딥러닝 서버 구축 (2)
    • 그래프 이론 (1)
      • 그래프마이닝 (1)
      • GNN (0)
    • 강화학습 (3)
      • 강화학습 기본 (3)
    • 인공지능 (5)
    • 추천시스템 (2)
      • 추천시스템 기초 (2)
    • Competitions (1)
    • 빅데이터 (8)
      • 하둡 (3)
      • 스파크 (4)
      • 클라우드 (1)
    • SQL (7)
      • MariaDB (2)
    • 논문 리뷰 (2)
    • 대학원 (0)
      • 데이터 사이언스 (0)
      • 경제학 (0)
    • 선형대수학 (7)
      • 선형대수 ICE BREAKING (1)
      • 벡터 (5)
      • 고윳값 (1)
    • 개인프로젝트 (0)
      • 포트폴리오 대시보드 + AI기반 주식 자동매매 (0)
    • 재테크 (1)
    • 자동차 (0)
    • 알고리즘 (11)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • MariaDB
  • sql
  • pytorch
  • 데이터
  • 하둡
  • 프로그래밍
  • class
  • Baekjoon
  • 인공지능
  • 알고리즘
  • PYTHON
  • 백준
  • 객체
  • 빅데이터
  • 데이터베이스
  • 데이터사이언스
  • 선형대수학
  • 프로그래머스
  • 코테
  • 코딩테스트
  • 머신러닝
  • 선형대수
  • 자료구조
  • mysql
  • 파이썬기초
  • AI
  • TensorFlow
  • 딥러닝
  • 객체지향
  • 파이썬

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Big Ben

Big Ben's Log

파이썬/클래스

[python] 파이썬 Class 내 self.<variable name>에서 self 키워드는 어떤 역할을 할까?

2023. 3. 5. 21:13
반응형

파이썬 클래스를 처음 접하다보면, 추상적인 개념에 적잖이 당황할 수도 있습니다.

 

특히 class를 만들 때, class안에 함수를 정의할 때 self 라는 키워드를 많이 보셨을 겁니다.

 

이 self는 굉장히 중요한 역할을 하게 되는데, 무엇을 의미하는지 간단하게 알아보도록 하겠습니다.

 

self라는 키워드는 클래스가 만들어진 이후, 인스턴스로서 활용될 때 굉장히 중요한 역할을 합니다.

 

이때 class variable과 instance variable에 대해 알아야 할 필요가 있는데, 간단하게 말해서 self가 활용된다면 이는 곧 class 전역에 영향을 미치는 것이 아닌 인스턴스에만 국한되어 작동하게 됩니다.

예시 1) class_variable vs instance_variable

코드를 보면서 살펴보겠습니다.

 

class MyClass:
    class_variable = "Hello"
    
    def __init__(self, instance_variable):
        self.instance_variable = instance_variable
        
obj1 = MyClass("world")
obj2 = MyClass("everyone")

print(obj1.class_variable)   # Output: Hello
print(obj2.class_variable)   # Output: Hello

print(obj1.instance_variable)   # Output: world
print(obj2.instance_variable)   # Output: everyone

위 처럼 MyClass라는 클래스를 정의해주고, obj1과 obj2를 MyClass를 이용해서 생성해주었습니다. 

obj1과 obj2는 클래스가 아닌 '인스턴스'라고 불립니다.

 

그렇다면 MyClass내 생성자 __init__ 함수에서 instance_variable 인수를 받고 있습니다. 

 

따라서 위 코드에서 obj1 = MyClass("world") 즉 "world"라는 인수를 주었습니다. 이건 obj1의 고유한 인스턴스 이름일 뿐, 같은 클래스로부터 생성된 인스턴스인 obj2에는 영향을 주지 않습니다.

따라서 obj1.instance_variable 속성을 찍어봤을 때, output이 "world"가 나오는 것을 확인할 수 있습니다.

반대로 같은 이유로 obj2.instance_variable 속성을 찍어 봤을 때, output이 "everyone"이 나오는 것을 확인할 수 있습니다.

 

자 그럼 class variable은 무엇일까요?

이 class variable은 모든 클래스 전역에 영향을 미치는 변수이기 때문에, 생성된 인스턴스도 공통으로 갖고 있는 변수가 되겠습니다.

따라서 obj1과 obj2 에 상관없이 class variable의 값을 "Hello"로 같은 것을 확인할 수 있습니다.

 

또한 가독성의 이유로 class_variable은 대부분의 경우 class 코드 내 가장 맨 윗부분에 작성되는 경우가 많습니다.

 

예시 2) class_variable vs instance_variable

또 다른 예시를 들어보겠습니다.

 

class Dog:
    breed = "Unknown"
    
    def __init__(self, name):
        self.name = name
        
dog1 = Dog("Fido")
dog2 = Dog("Rover")

print(dog1.breed)   # Output: Unknown
print(dog2.breed)   # Output: Unknown

print(dog1.name)   # Output: Fido
print(dog2.name)   # Output: Rover

위 예시에서 breed는 class variable입니다. 

따라서 dog1 인스턴스와 dog2 인스턴스 모두 같은 breed를 공유하고 있습니다.

 

하지만 breed가 클래스 변수로써 클래스 전역에 영향을 미친다고 하더라도, 이미 생성된 인스턴스의 class variable에 직접적으로 사후에 접근을 하여 값을 변경한다면, 변경된 값이 다른 인스턴스에 영향을 주진 않습니다.

 

예를 들어보겠습니다.

 

dog1.breed = "Golden Retriever"

print(dog1.breed)   # Output: Golden Retriever
print(dog2.breed)   # Output: Unknown

이렇게 dog1의 클래스 변수만 바뀐 것을 확인할 수 있습니다.

 

왜 self 키워드를 사용하는가? class variable만 사용해도 되지 않을까?

위 질문에 대한 답은 유연성에 있습니다. 

파이썬을 이용해 자동차를 표현해본다고 생각해보죠.

자동차는 브랜드가 다르고, 스펙이 다릅니다. 또 가격도 다르겠죠

 

# Case 1: 클래스 변수만 사용할 때
class MyCar:
	price = 2000
    mpg = 10.0
    size = 5
    
i30 = MyCar()
Eclass = MyCar()
bmw5 = MyCar()


# Case 2: 인스턴스 변수를 활용할 때
class MyCar2:
	
    def __init__(self, price, mpg, size):
    	self.price = price
        self.mpg = mpg
        self.size = size
        
i30 = MyCar2(2000, 10.0, 5)
Eclass = MyCar2(6000, 7.0, 5)
bmw5 = MyCar2(5500, 8.0, 5)

따로 설명을 자세하게 기술하지 않더라도 어떤 이점이 있는지 확인할 수 있으리라 생각합니다.

 

이 외에도 self 키워드는 클래스를 정의할 때, 다양한 메서드에도 영향을 끼칩니다. 

따라서 굉장히 중요하게 작동되는 것을 거듭 강조하면서, 조금이라도 이해가 되셨길 바랍니다.

반응형
저작자표시 (새창열림)

'파이썬 > 클래스' 카테고리의 다른 글

[python] 파이썬 class의 __call__ 함수 (매직메소드)  (0) 2023.03.12
[python] 클래스 메서드(class method)와 정적 메서드(static method)  (0) 2023.03.08
파이썬과 객체지향 (python and class) 3 - 생성자(__init__, initializer)  (0) 2023.01.02
파이썬과 객체지향 (python and class) 2  (0) 2023.01.02
파이썬과 객체지향 (python and class) 1  (0) 2023.01.02
    '파이썬/클래스' 카테고리의 다른 글
    • [python] 파이썬 class의 __call__ 함수 (매직메소드)
    • [python] 클래스 메서드(class method)와 정적 메서드(static method)
    • 파이썬과 객체지향 (python and class) 3 - 생성자(__init__, initializer)
    • 파이썬과 객체지향 (python and class) 2
    Big Ben
    Big Ben
    Data Scientist

    티스토리툴바