scope(범위)
- 프로그래밍 언어에서 scope은 어떠한 객체(변수, 함수)가 유효한 범위를 이야기 하며 범위를 벗어나면 해당 객체는 사용될 수 없다.
- 파이썬에서 스코프는 항상 객체가 선언된 지점에서 위로는 상위 객체까지 아래로는 모든 하위 객체들과 그 안에까지가 범위이다.
- local scope #가장 제한적이다.
- enclosed scope
- global scope
- built in scope #가장 범위가 광범위하다.
1. local scope
- local scope를 가지고 있는 변수나 함수 혹은 객체는 이름 그대로 특정 범위에서만 유효하다.
- 주로 함수 안에서 선언된 변수나 함수가 local scope을 가지고 있으며 이러한 변수들은 해당 함수 안에서만 유효하다.
2. enclosing scope
- 중첩함수가 있을 때 적용되는 스코프로 부모함수에서 선언된 변수는 중첩함수 안에서도 유효한 범위를 가지고 있다.
3. global scope
- 함수 안에서 선언된것이 아닌 함수 밖에서 선언된 변수나 함수를 이야기한다.
- 변수나 함수는 선언된 지점과 동일한 level의 지역 그리고 더 안쪽의 지역들까지 범위가 유효하다.
- global scope을 가지고 있는 변수와 함수들은 선언된 지점이 해당 파일에서 가장 바깥쪽에서 선언되므로 해당 파일에서 선언된 지점 아래로는 다 유효한 범위를 가지고 있다.
4. built in scope
- scope중 가장 광범위한 scope로 파이썬 안에 내장되어 있는 파이썬이 제공하는 함수 또는 속성들이 built-in scope를 가지고 있다.
- 따로 선언이 없이도 모든 파이썬 파일에서 유효한 범위를 가지고 있다.
예를 들어 list등과 같은 자료구조의 element 총 개수를 리턴하는 len함수가 built-in scope를 가지고 있다
4. shdowing
- 파이썬은 변수나 함수의 정의를 찾을 때 다음 순서의 scope들 안에서 찾는다
local —> enclosing —> global —>built in
- 가장 좁은 유효범위부터 시작해서 넓은 범위로 나아가며 사용되는 변수나 함수의 정의를 찾기 때문에 만일 동일한 이름의 변수들이 서로 scope에서 선언이 되면 더 좁은 범위에 있는 변수 혹은 함수가 더 넓은 범위에 있는 변수를 가리는 (shadowing)효과가 나타난다.
class
1. class정의하기
- 파이썬에서 class를 선언하기 위해서는 다음과 같이 class 키워드를 사용하면 된다
class Classname:
...class 내용 코드들
- 클래스 이름은 각 단어의 앞글자를 대문자로 사용한다.
- 만일 한 단어 이상으로 이루어져 있다면 밑줄(underscore)없이 모든 단어를 다 붙이되 각 단어의 앞글자를 대문자로 해서 단어를 구분하게 된다.(ScotchWhiskey)
- class가 정의되면 class로부터 실체화(instantiate)할 수 있으며 클래스를 실체화 하는 방법은 함수를 호출하듯이 클래스도 호출하면 된다.
hyundai = car()
- Car class를 실체(instance)화 한것이 hyundai와 bmw라는 객체(object)이다
2. class의 attribute(속성)
- class에 정의되는 공통 요소들을 attribute(성질 혹은 속성)라고 한다.
- 속성들을 class에서 정의하기 위해서는 다음과 같이
__init__
함수를 통해서 정의해주면 되며, class안에서 정의해주는 함수(function)는 function이라고 하지 않고 method라고 한다.
class Car:
def __init__(self, maker, model, horse_power)
self.maker = maker
self.model = model
self.hose_power = horse_power
__init__
init이라는 단어 앞 뒤에 밑줄 2개가 있다. 이렇게 앞뒤로 밑줄 2개가 있는 메소드들을 special methods라고 하며 class가 실체화 될 때 사용되는 함수이다.
hyundai = Car("현대', "제네시스", 500)
- 여기서 이미
__init__
메소드가 호출이 됐다 메소드 이름을 명화하게 명시하지는 않았지만 클래스가 실체화 될 때 자동으로 __init__
메소드가 호출이 된다.
- class 자체는 공통점이 있는 부류를 가리키는 개념인 반면에 self는 어떠한 실체를 가르키는 단어이다.
- self는 clss의 실체(instance)인 객체(object)이다.
- 클래스를 실체화 할 때 해당 객체(self)를 자동으로
__init__
함수에 넘겨준다.
-__init__
메소드는 클래스가 실체화 될 때 자동으로 호출이 된다.
-__init__
메소드의 self파라미터는 클래스가 실체화된 객체를 넘겨주어야 하며 파이썬이 자동으로 넘겨준다.
-__init__
메소드의 self 파라미터는 항상 정의되어 있어야하며 맨 처음 파라미터로 정의되어야 한다.(그래야 파이썬이 알아서 넘겨줄 수 있다)
class Car:
def __init__(self, maker, model, horse_power)
self.maker = maker
self.model = model
self.hose_power = horse_power
- parameter로 넘겨진 것들이 동일한 이름으로 self에 지정한다.
- self는 객체이므로 객체에 maker, model, horse_power를 나중에 다른 메소드에서 다시 사용하기 위해서 저장한다.
3. class method
- 클래스에서
__init__
말고도 다른 메소드를 원하는대로 추가할 수 있다.
- method와 attribute(속성)의 차이는 명사와 동사의 차이와 비슷하다.
- 속성은 해당 객체의 이름 등의 정해진 성질인 반면 메소드는 Move, eat 등 객체가 행할 수 있는 어떠한 action같은 느낌이다.
class Car:
def __init__(self, maker, model, horse_power)
self.maker = maker
self.model = model
self.hose_power = horse_power
def honk(self):
return "빠밤"
hyundai = Car("현대", "제네시스", 500)
hyundai.honk()
>"빠밤"
- 이렇게 객체에서 메소드를 사용할때는 dot(.)을 사용하여 개체를 호출하며 이를 dot nation이라고 한다.
<객체>.<메소드>
-honk메소드에서 해당객체의 회사 정보를 알기 위해서는 __init__
메소드에서 self객체에 해당 정보들을 저장해 놓았기 때문에 다음처럼 사용한다.
def honk(self):
return f"{self.maker} 빠밤"
- class 는 언제 쓰나요?
클래스를 사용하면 코드의 구조를 더 효과적으로 구현할 수 있으며 이렇게 코드를 클래스 위주로 작성하는 것을 object oriented programming(객체 지향 프로그래밍)이라고 한다.