About Python – “클래스(1) – 클래스와 메서드”

About Python – “클래스(1) – 클래스와 메서드”

1월 11, 2022

파이썬의 클래스

a = 100
print(type(a))

# <class 'int'>

위의 코드는 누구나 이해할 수 있을 것입니다. a 라는 변수가 어떤 타입인지 알아보려고 type() 를 사용했는데, 뜬금없이 class 라는 단어가 나옵니다.

그렇다면 이 클래스란 것은 무엇일까요? 파이썬 공식 문서에서는 클래스를 다음과 같이 설명하고 있습니다.

Classes provide a means of bundling data and functionality together. Creating a new class creates a new type of object, allowing new instances of that type to be made. Each class instance can have attributes attached to it for maintaining its state. Class instances can also have methods (defined by its class) for modifying its state.

클래스는 데이터와 기능을 함께 묶는 수단을 제공합니다. 새 클래스를 생성하면 새 유형의 object가 생성되어 해당 유형의 새 인스턴스를 만들 수 있습니다. 각 클래스 인스턴스에는 상태를 유지하기 위해 연결된 속성이 있을 수 있습니다. 클래스 인스턴스는 상태를 수정하기 위한 메서드(클래스에 의해 정의됨)를 가질 수도 있습니다.

위의 내용을 정리해보자면,

  • 클래스는 데이터와 기능을 함께 묶는 수단을 제공합니다.
  • 새 클래스를 생성하면, 새 유형의 object가 생성되어 해당 유형의 새 인스턴스를 만들 수 있습니다.
  • 각 클래스의 인스턴스에는 상태를 유지하기 위해서 연결된 속성이 존재할 수 있다.
  • 클래스 인스턴스들은 메서드를 가질 수도 있다.

위의 말들을 이번의 About Python – “클래스” 시리즈 포스팅을 통하여 하나하나 알아보겠습니다. 일단, 파이썬에서 클래스를 어떻게 만드는지부터 알아봅시다.

class 클래스명:
    <구문 1>
    .
    .
    .
    <구문-N>

파이썬에서 클래스는 위와 같이 정의합니다. 일단, 아무 이름이나 붙여서 클래스를 하나 만들어보겠습니다.

class ScoreManage:
    pass

a = ScoreManage()

클래스는 무언가(-객체)를 만들기 위해서 미리 제작된 설계도와 비슷합니다. 예컨대, 종이학을 접을 수 있는 방법이 있는 종이접기 책(= 설계도 = 클래스)이 있다면 종이학(객체) 를 만들어낼 수 있습니다. 위의 예제를 이제 살펴볼 수 있을 것 같습니다.

ScoreManage 라는 클래스를 만들고, 내용은 아무것도 넣지 않았습니다. a = ScoreManage() 라는 문장은 ScoreManage의 객체를 만든 것입니다. 아직 위의 클래스는 아무런 기능도 가지고 있지 않지만, 객체를 만들어낼 수는 있습니다. 이제, ScoreManage 라는 클래스에 기능을 채워넣어 보겠습니다.

파이썬의 메서드

기능을 채워넣기 위해서 메서드(Method) 라는 것을 사용할 건데, 클래스 내부에 정의되어 있는 함수를 의미합니다.

제가 만들고자 하는 ScoreManage 클래스는 다음의 기능을 가집니다.

  • 두 학생의 점수를 받습니다.
  • 두 학생 점수의 평균을 구합니다.
  • 두 학생 중, 어떤 학생이 더 높은 점수를 받았는지를 반환합니다.
class ScoreManage:
    def getscore(self, score1, score2):
        self.score1 = score1
        self.score2 = score2

a = ScoreManage()
a.getscore(55,70)
print(a.score1 , a.score2)

간단하게, getscore이라는 메서드를 정의했습니다. 그런데 새로운 키워드 self 가 보입니다. “자기 자신” 이라는 뜻을 지닌 단어이지요. 파이썬 공식 문서에서는 메서드의 첫 번째 인자로 self를 쓰는 것에 대해서 다음과 같이 설명하고 있습니다.

Often, the first argument of a method is called self. This is nothing more than a convention: the name self has absolutely no special meaning to Python. Note, however, that by not following the convention your code may be less readable to other Python programmers, and it is also conceivable that a class browser program might be written that relies upon such a convention.

종종 메서드의 첫 번째 인수를 self라고 합니다. 이것은 관례에 불과합니다. self라는 이름은 Python에 특별한 의미가 전혀 없습니다. 그러나 규칙을 따르지 않으면 다른 Python 프로그래머가 코드를 덜 읽을 수 있으며 이러한 규칙에 의존하는 클래스 브라우저 프로그램이 작성될 수도 있습니다.

특별한 의미는 없는데, 파이썬에서 관례적으로 사용하는 것 뿐이라고 합니다. 실제로, 위의 코드에서 selfaaa 와 같은 것으로 바꾸어도 잘 동작합니다.

무튼, 메서드 안의 세 개의 매개변수 중 self에는 그 메서드를 호출한 객체가 전달됩니다. 이게 무슨 말인고 하면..

b = ScoreManage()
ScoreManage.getscore(2,6)

# ScoreManage.getscore(b,2,6) 처럼 고쳐야 합니다.

위의 코드를 추가하면 오류가 납니다.

TypeError: ScoreManage.getscore() missing 1 required positional argument: ‘score2’

getscore() 메서드의 아규먼트 하나가 전달되지 않은 겁니다. 객체 a를 이용해서 메서드를 호출할 때에는 self라는 첫 번째 매개변수에 객체 본인인 a가 자동으로 전달되어 생략할 수 있었지만, 클래스 자체로 메서드를 호출하려면 어떤 객체가 메소드를 호출하는가를 전달해 주어야 합니다. 그렇기에 ScoreManage.getscore(b,2,6) 으로 고쳐 주면 오류가 나지 않습니다.

위의 사실을 알게 된다면, self.score1 = score1 이 무엇을 의미하는지도 쉽게 이해할 수 있게 됩니다. 메소드로 받은 아규먼트들을 score1이라는 객체 변수에 저장하는 것입니다. a.getscore(55,70) 로 점수를 입력해 주고, 객체 변수를 확인해보기 위해서 print(a.score1 , a.score2) 를 통해 출력해 봤더니, 원하는 결과인 55와 70이 나옵니다.

이제 목표로 했던 기능들을 계속 구현해 보겠습니다. 그런데, 두 학생 중 어떤 학생이 더 높은 점수를 받았는지 출력하려면 학생 이름도 같이 받아줘야 할 것 같습니다. 코드를 수정합니다.

class ScoreManage:
    def getscore(self, data1, data2):
        self.name1, self.score1 = data1
        self.name2, self.score2 = data2

a = ScoreManage()
a.getscore(("민수", 55),("길동" ,90))
print(a.name1,":", a.score1,"점")
print(a.name2,":", a.score2,"점")


# 민수 : 55 점
# 길동 : 90 점

(이름, 점수) 형식으로 매개변수를 받아서 그것을 객체 변수에 저장해 주게끔 하였습니다. 이제 이름과 점수 데이터 모두 받아둘 수 있게 되었습니다.

이제 원했던 기능 중 하나인 평균 구하기를 구현해 보겠습니다.

class ScoreManage:
    def getscore(self, data1, data2):
        self.name1, self.score1 = data1
        self.name2, self.score2 = data2
    def average(self):
        average = (self.score1 + self.score2)/2
        return average

a = ScoreManage()
a.getscore(("민수", 50), ("동현", 80))
print(a.average())

객체 변수를 간단하게 연산해주는 메서드 average() 를 작성하여 주었습니다. 정상적으로 동작하고, getscore() 메서드에서 받아온 점수들만 뽑아 평균을 내 주네요. 마찬가지 기능으로, 메서드를 하나 더 추가해서 두 학생 중 어떤 학생이 더 높은 점수를 받았는지를 구해주는 기능을 구현해 보겠습니다.

class ScoreManage:
    def getscore(self, data1, data2):
        self.name1, self.score1 = data1
        self.name2, self.score2 = data2
    def average(self):
        average = (self.score1 + self.score2)/2
        return average
    def winner(self):
        if self.score1 > self.score2:
            return self.name1, self.score1
        else:
            return self.name2, self.score2

a = ScoreManage()
a.getscore(("민수", 50), ("동현", 80))
print(a.winner())

if 문을 이용해서 어떤 학생의 점수가 더 높은지, 이름과 점수를 반환하도록 메서드를 작성했습니다.

지금까지 클래스의 간단한 개념, 메서드란 무엇인지, 메서드의 맨 첫 번째 매개변수가 가지는 의미는 무엇인지에 대해서 알아보았습니다.

About Python – “클래스(2) – 생성자, 소멸자” 에서 이어집니다.

Leave A Comment

Avada Programmer

Hello! We are a group of skilled developers and programmers.

Hello! We are a group of skilled developers and programmers.

We have experience in working with different platforms, systems, and devices to create products that are compatible and accessible.