코딩 스쿨에 오신것을 환영합니다~~

질의응답 게시판

 
클래스 변수에 대한 질문입니다.
오 * 진 | 2019-02-13

클래스 변수부분에 헷갈리는게 있어서 질문해봅니다.

보통 함수와 전역변수에 대해서 설명할때

result = 0

def add(num):
    result+=num
    return result

이렇게 만들면 함수안의 result는 
함수밖의 전역변수 result와 다르기 때문에
연산후 할당부분에서 에러가 나게 된다고 하지않습니까?


클래스를 처음배우게 될때 이패턴과 유사한 패턴을 보게되는게

class Cal:
    result = 3
    
    def add(self,num):
        result += num
        return result

이렇게 클래스변수 result는 메서드안의 result와 다르기
때문에 역시 연산후할당부분에서 에러가 나게되겠죠

근데 여기서 헷갈리는게

class Cal:
    def set(self,num):
        self.result = num

    def add(self,num):
        self.result += num
        return self.result

이렇게 객체변수를 생성하면 서로 다른 메서드에서 객체변수를 변경시킬수 있는게 잘 와닿지가 않네요.

객체변수는 클래스 안 어디서든 자동으로 global 처리가
되는건가요?

변수는 전역변수와 지역변수 2가지만 있다는
느낌을 가지고 있다가 객체변수를 보게되니까
왠지 헷갈리는 느낌이드네요

책을 처음읽었을때는 대충넘어가서 헷갈리는지도 몰랐는데
두번째 읽다보니까 헷갈린다는걸 알게됬습니다

  • 관 * 자
  • 2019-02-13 (17:24)
먼저 전역변수와 지역변수를 설명하겠습니다.

전역변수와 지역변수의 개념이 처음에는 무척 헷갈립니다.

전역변수 : 함수 밖에서 정의된 변수
지역변수 : 함수 내에서 정의된 변수

def func1():
    a = 3
    print(a)
    
def func2():
    print(a)

func1()
func2()

위에서 지역변수 a는 func1()에서만 사용가능합니다.
func2()에서 사용된 print(a)에서 a가 정의되어 있지 않기 때문에 오류가 발생합니다.

def func1():
    a = 3
    print(a)
    
def func2():
    print(a)

a = 10     # a는 전역변수 
func1()
func2()

실행 결과 :
3
10

이때 함수들 밖에 있는 변수 a는 전역변수(값:10)입니다.
func1()에서도 a가 사용되는데 이것은 지역변수(값:3)입니다.
여기서 주의할 점은 func1()에서 사용되는 지역변수 a는 전역 변수 a와는 다른 것입니다.
함수 내에서 변수(지역변수)를 사용할 때는 함수가 호출되어 사용되는 동안 함수 내부에서 사용되고 사라지게 됩니다.
따라서 func1()에서의 print(a)는 지역변수 a의 값인 3을 출력합니다.

func2()의 print(a)에서 a는 전역 변수를 의미하기 때문에 그 값인 10을 출력하게 됩니다.

def func1():
    global a
    a = 3
    print(a)
    
def func2():
    print(a)

a = 10     # a는 전역변수 
func1()
func2()

실행 결과 :

3

함수 내에서 전역변수 a를 사용하려면 위에서와 같이 global a로 선언해야 합니다.
a = 3은  전역 변수 a의 값을 3으로 변경하게 됩니다.

따라서 func2()의 print(a)에서 변수 a는 func1()에서 전역변수 a를 3으로 변경했기 때문에 3이 출력되는 것입니다.
  • 관 * 자
  • 2019-02-13 (17:27)
그 다음 클래스에서 멤버변수와 메서드는 함수에서 변수와는 개념적으로 다른 것입니다.
둘을 같이 생각하셔서 혼동이 생긴 것입니다.
클래스에서는 함수에서의 전역/지역 변수 개념을 적용하시면 안됩니다. 두 개는 전혀 다른 개념입니다.

클래스에서 멤버 변수를 메서드에서 접근하기 위해 self 인자를 사용하는 것입니다.
클래스와 객체는 함수와는 다른 관점에서 보시기 바랍니다.

더 궁금한 것 있으시면 댓글 남겨주세요.^^
  • 오 * 진
  • 2019-02-13 (20:07)
조건이라고 이해하면 될라나요?
프로그램 내에서 어떤함수에서든 같은변수에 접근하기위해
global 을 써야하는 조건이 있는것처럼

클래스의 어떤 메서드에서든 똑같이 멤버변수에 접근하기위해서는 self 인자를 사용해서 객체자신을 전달해야하는
조건이 있다.  라고 이해하면 되나요?
  • 관 * 자
  • 2019-02-13 (20:45)
네. 비슷합니다. 그렇게 이해하셔도 될듯 합니다.^^