프로그래밍/Python

[Python] 객체지향에 대하여 (2) 생성자와 클래스 변수/인스턴스 변수

베린이 2024. 1. 2. 07:41
반응형

- 생성자에 대하여

이전 글에서 grade라는 클래스를 선언했습니다, 코드를 다시 한번 확인해 볼까요?
2023.12.30 - [프로그래밍/Python] - [Python] 객체지향에 대하여 (1) 클래스와 객체

 

[Python] 객체지향에 대하여 (1) 클래스와 객체

- 객체지향 프로그래밍이란? OOP(Object Oriented Programming)라고도 하는 객체지향 프로그래밍이란 프로그래밍 방법론이라고 생각하시면 됩니다. 기존에는 데이터 선언하고 데이터를 처리하는 함수들

veriln-e.tistory.com

 

class grade :
    #필드
    name = ""
    score = 0

    #메소드
    def plus(self, num) :
        self.score = self.score + num
        return self.score

    def minus(self, num) :
        self.score = self.score - num
        return self.score

student1 = grade()
student2 = grade()
student3 = grade()

student1.name = "철수"
student2.name = "영희"
student3.name = "민수"

student1.score = 0
student2.score = 0
student3.score = 0

student1.score = 73
student2.score = 89
student3.score = 91

student1.plus(5)
student2.minus(2)
student3.plus(3)

 
중간에 score를 일일이 초기화시켜 주는 과정이 있는데요, 클래스 안에 생성자를 설정함으로써 score의 초기값을 설정해 줄 수 있습니다. 생성자는 __init__으로 선언할 수 있습니다.

class grade :
    #생성자
    def __init__(self) :
        self.name = ""
        self.score = 0

    #메소드
    def plus(self, num) :
        self.score = self.score + num
        return self.score

    def minus(self, num) :
        self.score = self.score - num
        return self.score

student1 = grade()
student2 = grade()
student3 = grade()

student1.name = "철수"
student2.name = "영희"
student3.name = "민수"

student1.score = 73
student2.score = 89
student3.score = 91

 
위의 코드를 보면 필드를 선언하지 않은 것을 확인할 수 있습니다. 일반적으로 클래스를 선언할 때는 필드를 선언하는 것이 아니라 생성자를 통해 필드를 선언한다고 합니다.
 
그렇다면 인스턴스를 생성할 때 초기값을 입력할 수 없을까요?? 생성자를 만들 때 매개 변수를 사용하면 가능합니다.

class grade :
    #생성자
    def __init__(self, val1, val2) :
        self.name = val1
        self.score = val2

    #메소드
    def plus(self, num) :
        self.score = self.score + num
        return self.score

    def minus(self, num) :
        self.score = self.score - num
        return self.score

student1 = grade("철수",73)
student2 = grade("영희",89)
student3 = grade("민수",91)

print(student1.name, student1.score)
print(student2.name, student2.score)
print(student3.name, student3.score)

 

- 클래스 변수와 인스턴스 변수의 차이

지금까지 봐온 예시에서 선언된 변수들은 모두 인스턴스 변수입니다. 'grade'라는 클래스를 통해 'student'라는 인스턴스를 만들고, 그 인스턴스에는 'name'과 'score'라는 변수가 있었죠. student1.name과 student2.name은 다른 변수인 겁니다. 이러한 변수들은 인스턴스를 선언해야 만들어지고 메모리에 할당되게 됩니다.


인스턴스에 변수가 있듯이 클래스에도 변수가 존재합니다. 클래스 변수는 클래스 안에 할당되는데요, 그렇기 때문에 모든 인스턴스들이 이 클래스 변수를 공유하게 됩니다.