변수가 선언되어 해당 변수가 영향을 미치는 영역
범위에는 크게 다음 4가지가 있습니다.
- Local Scope
- Enclosed Scope
- Global Scope
- Built-in Scope

Local scope을 가지고 있는 변수나 함수 혹은 객체는 이름 그대로 특정 범위에서만 유효합니다.
주로 함수 안에서 선언된 변수나 함수가 local scope을 가지고 있습니다. 그리고 이러한 변수들은 해당 함수 안에서만 유효합니다.

Enclosing Scope는 중첩함수가 있을때 적용되는 scope입니다.
부모 함수에서 선언된 변수는 중첩함수 안에서도 유효한 범위를 가지고 있습니다.

Global scope은 함수 안에서 선언된것이 아닌 함수 밖에서 선언된 변수나 함수를 이야기 합니다.
본 강의에 앞부분에서 설명했듯이, 변수나 함수는 선언된 지점과 동일한 level의 지역, 그리고 더 안쪽의 지역들까지 범위가 유효합니다.
그리고 global scope을 가지고 있는 변수와 함수들은 선언된 지점이 해당 파일에서 가장 바깥쪽에서 선언되므로 해당 파일에서 선언된 지점 아래로는 다 유효한 범위를 가지고 있습니다. 그래서 "Global" scope 이라고 하는 것입니다.

Built-in scope은 scope중 가장 광범위한 scope입니다.
파이썬안에 내장되어 있는, 파이썬이 제공하는 함수 또는 속성들이 built-in scope를 가지고 있습니다.
그리고 built-in scope는 따로 선언이 없이도 모든 파이썬 파일에서 유효한 범위를 가지고 있습니다.
예를 들어, list등과 같은 자료구조의 element 총 개수를 리턴하는 len 함수가 바로 built-in scope를 가지고 있습니다.
파이썬은 변수나 함수의 정의를 찾을때 다음 순서의 scope들 안에서 찾습니다.
Local => Enclosing => Global => Built-in
즉 가장 좁은 유효범위 부터 시작 해서 넓은 범위로 나아가며 사용되는 변수나 함수의 정의를 찾습니다.
그러므로 만일 동일한 이름의 변수들이 서로 다른 scope에서 선언이 되면 더 좁은 범위에 있는 변수(혹은 함수)가 더 넓은 범위에 있는 변수를 가리는 (shadowing)효과가 나타납니다.

클래스(class)는 프로그램이 실행되었을 때 생성되는 객체가 어떤 멤버변수와 메소드를 가지는지 정의해둔 것을 말합니다.
파이썬 프로그램이 실행되면 클래스 정의는 메모리로 로드되어 그 정의에 기반한 객체를 생성할 수 있도록 준비가 됩니다.
파이썬에서 class를 선언하기 위해서는 다음과 같이 class 키워드를 사용하면 됩니다.

참고로 class 이름은 각 단어의 앞글자를 대문자로 사용합니다.
예를들어, Car, Comedian 처럼 말이죠. 만일 한단어 이상으로 이루어져 있다면 밑줄(underscore) 없이 모든 단어를 다 붙이되 각 단어의 앞글자는 대문자로 해서 단어를 구분하게 됩니다. 다음 처럼 말이죠
Car class는 다음처럼 정의 할 수 있습니다.

class가 정의되면, class로 부터 실체화(instantiate) 할 수 있습니다. 클래스를 실체화 하는 방법은 간단합니다. 다음과 같이 함수를 호출 하듯이 클래스도 호출 하면 됩니다.

Car class를 실체(instance)화 한것이 hyundai와 bmw라는 객체(object) 인것입니다.
하지만 Car class는 아직 아무것도 안하는 비어있는 class 입니다.
앞서 class는 부류 라고 배웠습니다. 그리고 부류란 어떠한 공통점들을 가지고 있는 것/사람 들을 이야기 한다고 배웠습니다.
즉 공통점이 중요한데요, 자동차라면 브랜드, 엔진의 마력, 연비 등등이 공통 요소가 될것 입니다.
이러한 공통 요소들을 class 에서 정의를 해주어야 합니다.
그럼 하나 하나씩 공통 요소들을 정의해 보겠습니다.
class에 정의되는 공통 요소들을 전문어로 class의 attribute(성질 혹은 속성) 이라고 합니다.
모든 자동차는 다음과 같은 공통 요소를 가지고 있습니다.
위 3개의 속성들을 class에서 정의하기 위해서는 다음과 같이 __init__ 함수를 통해서 정의 해주면 됩니다.
(참고로 class 안에서 정의해주는 함수(function)는 function이라고 하지 않고 method 라고 합니다)

먼저 __init__ 메소드의 이름을 자세히 보겠습니다. init 이라는 단어의 앞 뒤에 밑줄 2개가 있습니다.
이렇게 앞뒤로 밑줄 2개가 있는 메소드들을 special methods라고 합니다. 이들은 특별 취급을 받습니다.
그 중 __init__ 메소드는 class가 실체화 될때 사용되는 함수 입니다.

여기서 이미 __init__ 메소드가 호출이 됐습니다. __init__ 이라고 메소드 이름을 명확하게 명시하지는 않았지만 클래스가 실체화 될때 자동으로 __init__ 메소드가 호출이 됩니다.

자 근데 여기서 이상한점이 있습니다. 눈치 채셨나요?
네, __init__ 메소드의 parameter는 총 4개인데, 앞서 클래스를 실체화 할때는 3개만 넘겨주었습니다.
self 파라미터를 빼먹었는데요, 이 self 파라미터는 도대체 무엇이길래 빼먹는걸까요?
그렇다면 class에서 "self" 는 누구를 말하는 걸까요? Class 자체를 말하는것은 아닐겁니다.
왜냐하면 앞서 보았듯이 class 자체는 공통점이 있는 부류를 가리키는 개념 이기 때문입니다.
반면에 self는 어떠한 실체를 가르키는 단어입니다.
그렇다면... 당연히 class에서 self는 class의 실체(instance)를 가르키겠죠!!
네, self는 class의 실체(instance)인 객체(object)를 가르킵니다!
그러므로 Car class에서 "self" 는 Car class의 객체인 hyundai나 bmw를 가르키는 거죠.
그리고 클래스를 실체화 할때 파이썬이 해당 객체(self)를 자동으로 __init__ 함수에 넘겨줍니다.
__init__ 메소드는 클래스가 실체화 될때 자동으로 호출이 된다.__init__ 메소드의 self 파라미터는 클래스가 실체화된 객체를 넘겨주어야 하며, 파이썬이 자동으로 넘겨준다.__init__ 메소드의 self 파라미터는 항상 정의되어야 있어야 하며 맨 처음 파라미터로 정의 되어야 한다 (그래야 파이썬이 알아서 넘겨줄 수 있으므로)