Python self 변수 - Python self byeonsu

Python(파이썬) - 인스턴스 변수와 메서드 알아보기


Python self 변수 - Python self byeonsu

지난시간에는 계산기 제작하는 과정에서 클래스와 생성자를 알아보았는데요 클래스안에서 사용될 인스턴스 변수와 메서드는 무엇이고 어떠한 역할을 하는지 알아보도록 하겠습니다

위 그림은 객체제작때 사용한 그림입니다

함수부분의 sum, sub, multi, dvide 가 바로 메소드 이며, 이번 포스팅부터는 함수를 메서드로 지칭하여 부르도록 하겠습니다

이제 클래스안에 sum 이라는 메소드를 추가해보도록 하겠습니다

class Calc(object):
    def __init__(self, num1, num2):
        print(num1,num2)

    def sum():

C1 = Calc(20,10)

5번째 줄에 보시면 sum이라는 메소드가 추가된것을 확인 하실수 있습니다

문법은 함수문법과 동일합니다.

class Calc(object):
    def __init__(self, num1, num2):
        print(num1,num2)

    def sum():
	return num1 + num2

C1 = Calc(20,10)
print(C1.sum())

이제 메소드의 전달한 매개변수의 값을 더한 값을 돌려 sum함수의 리턴값으로 만들었으며, print함수를 이용하여 C1의 객체의 sum 함수를 실행하게 되면 에러가 발생하게 됩니다

생성자에 전달받은 num1, num2 의 매개변수는 지역변수이기 때문입니다

위의 코드를 이용하여 메소드를 제작후 실행하였다면 실행이 안되지 않고 에러가 발생 되었을 것입니다

실행이 되지 않는 이유는 생성자로 전달한 매개변수는 지역변수이기 때문입니다

위 그림을 보시면 num1, num2는 지역변수이기때문에 실행이 되지 않았던 것입니다

그렇다면 클래스 안에 모든 메소드들이 변수를 사용하려면 인스턴스 변수를 선언해 주어야 합니다

class Calc(object):
    def __init__(self, num1, num2):
        self.n1 = num1
        self.n2 = num2

    def sum(self):
	       return self.n1 + self.n2

C1 = Calc(20,10)
print(C1.sum())

3, 4번째 줄을 보시면 첫 번째 매개변수를 이용하여 변수를 지정한 것을 보실 수 있습니다

생성자 포스팅에서 말씀드린 것처럼 첫 번째 매개변수가 인스턴스라고 하였습니다

즉 생성자의 첫 번째 매개변수(인스턴스)를 이용하여 인스턴스의 소속되어 있는 변수를 지정하게 되는 것입니다

또한 메소드에서 인스턴스 변수를 사용하기 위해 sum 또한 매개변수 self를 넣어주신 후 사용하시면 됩니다.

실행결과를 보시면 20 + 10의 결과값이 나오는 것을 확인 하실수 있습니다.

class Calc(object):
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

    def sum(self):
	       return self.num1 + self.num2

    def sub(self):
	       return self.num1 - self.num2

C1 = Calc(20,10)
print(C1.sum())
print(C1.sub())

이번에는 코드상에 빼기 함수를 추가하였으며, 실행결과를 보시면 20 - 10의 결과값이 나오는 것을 확인 하실수 있습니다.

파이썬에서 self 는 c#이나 자바의 this와 같은 역할을 한다. 접근제한이 적용되어 해당 클래스의 변수나 메서드에 접근하여 데이터를 처리하고 가공할 수 있다. C#이나 자바의 this 의 기능을 이해한다면 파이썬의 self를 이해하는데는 어렵지 않을 것이다.

Python self 변수 - Python self byeonsu

파이썬 클래스 self 파라미터 역할과 사용법python class self parameter

파이썬 클래스를 생성하고 초기화할 때 init 메서드를 사용한다.

init 메서드는 자바나 C#의 생성자와 비슷한 동작을 한다.

차이가 있다면 파이썬 생성자인 init 함수를 사용할 때 self 파라미터를 인자값 첫번째로 넣어주어야 한다.

self 파라미터 역할

파이썬의 self 파라미터은 자바나 C#의 this 와 비슷한 역할을 한다.

자바나 c# 에서 this 는 변수명이 비슷하거나 같은 단어로 중복이 될 떄 해당 클래스내의 변수 또는 함수들을 가리킨다.

파이썬의 self도 마찬가지

self 가 작성된 클래스 내의 변수와 메서드 등에 접근할 수 있게 한다.

접근제한이 있다면 해당 클래스에서만 접근이 가능하다.

self 생략

파이썬에서 생성자 역할을 하는 init 함수를 사용할 때 굳이 self 란 단어를 사용하지 않아도 되지만, 대체되는 다른 단어는 넣어주어야 한다.

어떤 이름을 사용해도 상관없다.

단지, self 란 단어를 대체하여 사용될 뿐이지만 역할은 같다.

샘플코드

직접코드를 작성해 본다.

self 란 단어를 사용하지 않고 임의의 다른 단어를 사용할 것이다.

클래스에 지정된 init 함수나 클래스 메서드나 인자값을 엉터리로 마구잡이로 넣었다.

그럼에도 파이썬은 self 인자값을 사용했을 때와 같은 역할을 한다.

print('----------')

#- 클래스부분
class ClsMbtiTest : #-{

    def __init__(thisClass, name, mbti, avengers) : #-{
        thisClass.name = name
        thisClass.mbti = mbti
        thisClass.avengers = avengers
    #-}

    def fnIdolInfo(param) : #-{

        print("---- MBTI 정보 ----")
        print("검사자 이름", type(param.name), param.name)
        print("MBTI 결과", type(param.mbti), param.mbti)
        print("비슷한 어벤져스", type(param.avengers), param.avengers)

    #-}

#-}

idol1 = ClsMbtiTest("크리스 에반스", "ISFJ", "캡틴 아메리카");
idol1.fnIdolInfo()

print('----------')

idol2 = ClsMbtiTest("스칼렛 요한슨", "ISTP", "블랙 위도우");
idol2.fnIdolInfo()

print('----------')

idol3 = ClsMbtiTest("크리스 햄스워스", "ESTJ", "토르");
idol3.fnIdolInfo()

print('----------')

idol4 = ClsMbtiTest("로버트 다우니 주니어", "ENTP", "아이언맨");
idol4.fnIdolInfo()

print('----------')

결과화면을 보자.

무엇을 어떻게 작성하든 self 을 작성했을 때와 동일한 작업을 수행하는 것을 볼 수 있다.

Python self 변수 - Python self byeonsu

굳이 의미를 부여해 본다.

c#이나 자바에 익숙한 사람이라면 개념적으로 금방 이해할 수 있다.

하지만, 명명법에 대해서는 난해할 수 있다.

그렇다면 비슷하게 이름을 작성해 보면 어떨까.

물론, 메서드의 이름과 메서드에 사용하는 인자값의 단어는 의미가 있는 것이 좋다.

위의 코드를 조금만 변경해 본다.

print('----------')

#- 클래스부분
class ClsMbtiTest : #-{

    def __init__(this, name, mbti, avengers) : #-{
        this.name = name
        this.mbti = mbti
        this.avengers = avengers
    #-}

    def fnIdolInfo(mbti) : #-{

        print("---- MBTI 정보 ----")
        print("검사자 이름", type(mbti.name), mbti.name)
        print("MBTI 결과", type(mbti.mbti), mbti.mbti)
        print("비슷한 어벤져스", type(mbti.avengers), mbti.avengers)

    #-}

#-}

idol1 = ClsMbtiTest("크리스 에반스", "ISFJ", "캡틴 아메리카");
idol1.fnIdolInfo()

print('----------')

idol2 = ClsMbtiTest("스칼렛 요한슨", "ISTP", "블랙 위도우");
idol2.fnIdolInfo()

print('----------')

idol3 = ClsMbtiTest("크리스 햄스워스", "ESTJ", "토르");
idol3.fnIdolInfo()

print('----------')

idol4 = ClsMbtiTest("로버트 다우니 주니어", "ENTP", "아이언맨");
idol4.fnIdolInfo()

print('----------')

변경된 부분은 클래스의 self 인자값고 메서드의 인자값 뿐이다.

그럼에도 동일한 결과가 나타나는 것을 볼 수 있다.

어쨌든 이름을 다르게 사용하더라도 self 와 같은 역할을 한다라는 것만 이해하자.

Python self 변수 - Python self byeonsu