본문 바로가기
대동단결 Python

스크립트언어 파이썬에서 변수 유효범위 및 접근범위

by 즐거운 지니 2020. 7. 12.
반응형
  • 파이썬은 스크립트언어인데, 컴파일러언어와 달리 코드가 작성된 순서대로 실행된다. 변수에 관해 이에 따른 특징들이 있다. 
  • 함수는 호출하기 전에 반드시 정의 되어 있어야 한다. 함수가 코드의 뒷부분에 정의되어 있다 하더라도 먼저 호출하면 실행되지 않는다. 반면, 컴파일러 언어는 소스코드 내 어딘가 정의되어 있는 함수이면 실행된다.
  • 함수는 정의될 때 실행되지 않는다. 이건 함수의 근본적인 속성이므로 모든 언어에서 동일하다. 
  • 클래스는 객체화(인스탄스화)되기전에 반드시 정의되어 있어야 한다. 즉 클래스가 정의된 부분이 먼저 실행되어야 한다. 반면 컴파일러 언어에서는 클래스 정의된 부분이 소스코드 뒷부분에 있어도 좋다.
  • 클래스 내부의 실행문은 정의될 때(읽혀질 때) 실행된다.
  • 함수 내부의 실행문은 호출 될 때 실행됨. 클래스 내부의 함수(매소드)도 호출될 때 실행된다.
  • 프로그램 최외각 변수는 global 변수이고 어디서든 읽고 쓸 수 있다. 다만, 동일한 이름으로 재정의 되었다면 지역적일 수록 먼저 호출된다. 
  • 파이썬에서 변수는 로컬변수(함수내부변수), 클래스변수, 인스탄스변수, 글로벌변수로 구분할 수 있는데, 로컬변수는 함수내부에서 읽고 쓸 수 있으며, 인스탄스변수는 객체화된 후 객체주소를 통해 접근할 수 있으며, 클래스변수는 클래스가 정의된 이후 객체화 여부와 상관없이 읽고 쓸 수 있으며, 글로벌 변수는 언제나 읽고 쓸 수 있다. 더 지역적이라 하면 함수 내부가 가장 지역적이라 할 수 있고, 인스탄스, 클래스, 글로벌 순으로 덜 지역적이라 한다. 
  • 프로그램의 어떤 함수 내부에서 볼 때 다른 함수 내부에서 정의된 함수는 읽거나 쓸 수 없다. 즉, 어떤 함수이던, 내부에서 정의된 로컬변수는 그 함수 내부에서만 읽고 쓸 수 있음.
  • 인스탄스변수는 매소드 내부에서 self.변수명 형식으로 정의되고, 객체화 된 이후 어디서든 접근 가능. 단, 동일한 클래스로 파생된 다른 인스탄스(물리적으로 다른 객체)에서는 다른 값으로 존재함. (심지어 객체화 된 이후 외부에서 인스탄스명.새변수 = 값 형식으로 생성할 수도 있음)
  • 객체화된 (존재하는) 인스탄스변수는 항상 접근 가능. 그러나 주의해서 사용해야 한다. 존재하지 않는 인스탄스변수를 접근하면 에러남. (소스 편집 중 에러인지 알 수없음. 왜냐하면 정의되어 있지 않아도 외부에서 인스탄스변수를 생성할 수 있으므로) try.. except..를 사용하여 방지할 수 있다.
  • 존재하는(읽혀진) 클래스 변수는 항상 접근 가능.
  • 클래스변수 변수는 정의된 이후 외부에서 클래스명.변수명 으로 접근할 수 있다. 단 동일한 이름으로 인스탄스변수명이 존재하지 않는다면 인스탄스.변수명 혹은 self.변수명으로도 접근 가능하다. 이는 파이썬 인터프리터가 로컬에 변수명이 존재하지 않으면 scope를 넓혀가며 찾기 때문이다. 
  • 자신을 상속받은 자식클래스의 모든 변수명은 부모클래스 입장에서 접근 불가.
  • 상속받은 부모클래스 내부 변수는 언제나 내 클래스 인 양 사용가능. (상속의 개념)
  • 상속이 아닌, 자신을 객체화한 부모 클래스 의 클래스 변수는 언제나 접근할 수 있고(부모클래스명.변수명), 인스탄스 변수는 그 인스탄스를 파라미터로 받은다음 그 주소를 통해 접근 가능. 예를들어 클래스 생성자에 부모클래스 주소를 입력 받게 한 뒤 def __init__(self, perant=None): 이후 perant.변수명 의 형색으로 접근할 수 있다. 

 

반응형

댓글