본문 바로가기
AI 공부/파이썬

파이썬 (클래스 - 1)

by AI Sonny 2022. 8. 3.
728x90

클래스(Class)란?

  • 변수와 함수를 묶어놓은 개념
  • 클래스는 객체(데이터와 기능을 갖고있는..)를 만들기 위한 설계도
  • 클래스를 메모리에 객체화하는 것을 인스턴스(instance)라고한다.

 

클래스의 구조

  • 변수: 인스턴스 변수 (객체화되면 사용가능한 변수), 클래스 변수 (클래스 정의 시에도 사용가능한 변수) 가 있다.
  • 함수: 메소드 (객체의 소속되어 있는 함수)
  • __init__메소드: 생성자
    • 객체의 초기화를 담당, 객체의 변수의 값을 초기 설정
    • 객체화가 되었을 때 생성해야하거나 초기값을 세팅해야하는 인스턴스 변수들이 있다면 __init__메소드 안에 선언(정의)하면 된다.

 

클래스 정의하는 방법

 

class <ClassName>:# pascal case, upper camel case
    def __init__(self):
        code context
        ...
    def <method_name>(self):
        code context
        ...

 

예시

 

함수 선언

 

class PlayerCharacter:
    def __init__(self,hp,exp):  # 객체가 생성되고 주소를 받는 것이 self이다. ( (중요) 무조건 넣어야한다.)
        self.hp = hp            # 내가 사용할 메소드를 무조건 정의하자!
        self.exp = exp          # 이후에 메소드 작성

 

함수 실행

 

player1 = PlayerCharacter(100,0)
player2 = PlayerCharacter(200,50)

player1.hp, player1.exp, player2.hp, player2.exp

=> (100, 0, 200, 50)

 

 

self이란?

 

  • 클래스가 객체화 되었을 때 자기 자신의 주소를 받는 파라미터
  • 클래스가 인스턴스화되면 메모리 상에서 어디에 있는지 self 파라미터의 주소값을 참조해서 객체의 변수의 접근한다.
  • 클래스를 정의할 때 메소드에 무조건 첫번째 파라미터로 정의해줘야한다.
  • 클래스가 객체화 되었을 때 메소드 사용 시 아규먼트로 넣어주지 않아도 자동으로 들어간다.

 

위의 글을 봐도 이해가 안된다면 그냥 외우자..!

 

  • 클래스를 정의할 때 __init__를 무조건 정의하자!
    • 객체화 되었을 때 사용할 변수들을 이 안에 정의해주자!
  • 클래스 안에 메소드들(__init__포함)을 정의할 때는 무조건 첫번째 파라미터로 self를 정의해주자!
  • 클래스가 객체화돼서 해당 객체의 메소드를 실행할 때는 self 는 자동으로 파이썬이 넣어주니깐 신경쓰지말자!

예시

 

함수 선언

class PlayerCharacter:
    def __init__(self,hp,exp): # 객체화 되면 자동으로 실행됨
        self.hp = hp # 인스턴스 변수 선언됨
        self.exp = exp # 인스턴스 변수 선언됨

    def attack(self):   # 내가 있는 인스턴스 위치에 접근하기 위해 self를 받는것이다.
        print("공격하기")
        self.exp += 2   # 인스턴스 변수에 접근하려면 self를 참조해야한다.

    def defend(self):
        print("방어하기")
        self.exp += 1

    def attacked(self,attack_size):
        print("공격받음")
        self.hp = self.hp - attack_size

 

hp와 exp 값 넣기

 

player1 = PlayerCharacter(100,0)
player2 = PlayerCharacter(120,10)

 

함수 실행

 

player1.attack()
player1.defend()
player1.attacked(3)

 

 

인스턴스 변수 수정하기

 

인스턴스 변수는 수정할 수 있다.

 

전에 hp의 수치가 얼마이든지간에 다음과 같이 코딩을 하면 수치를 20으로 바꿀 수 있다.

 

player1.hp = 20 # 기존에 수치를 바꿨다.
player1.hp

=> 20

 


 

클래스에는 클래스 변수와 클래스 메소드라는 것이 있다. 

 

사람들마다 이것에 관해 의견이 각각 갈리기 때문에 참고용으로만 알아두기로 하자.

 

- 클래스 변수

 

class PlayerCharacter:
    character = "Wizard"
    def __init__(self,hp=100,exp=0):
        self.hp = hp
        self.exp = exp

 

PlayerCharacter.character   # 클래스 변수는 객체화되지 않아도 참조 가능!

 

 

- 클래스 메소드

 

  • 객체화하지 않아도 사용 가능한 메소드

 

함수 선언

 

class CFG:
    train_data_path = "/data/train/"
    test_data_path = "/data/train/"
    model_name = "deep_model"

 

함수 실행

 

def preprocess(cfg):    # 아규먼트를 일일이 적을 필요가 없다
    pass
preprocess(CFG)

 

클래스 메소드는 cfg파라미터 안에 아규먼트의 개수가 많을 때 사용한다.

 

클래스 메소드를 사용하면 아규먼트를 다 안적어도 되고, 내가 필요한 것만 골라 쓸 수도 있다.

 


 

클래스는 처음 이론으로 들을 때는 생각보다 쉬웠다.

 

그러나 점점 강사님이 문제를 낼수록 나의 부족함은 처참히 드러났다.

 

오늘은 문제위주로 가르쳐주셔서 이론은 얼마 안된다.

 

오늘도 문제를 다시 풀어보면서 복습해야겠다...

728x90

댓글