당신은 멋쟁이, 우리는 장고쟁이~

0%

Python 기초 18편 - 파이썬 클래스

Python Class


소개글


객체 지향 프로그래밍의 기본 아이디어는 데이터와 연관된 순서들 (메서드)을 데이터에 작용하는 하나의 단위로 묶는것입니다. 이 하나로 묶인 단위를 객체라고 부릅니다.


파이썬은 객체 지향 프로그래밍 언어 입니다.

파이썬에 모든것은 객체 입니다,


우리는 이미 몇가지 파이썬 객체들을 가지고 작업한 적이 있습니다.


예를들면,


  • 문자열
  • 리스트

이렇게 파이썬에서 기본으로 제공하는 기능들도 파이썬 객체 입니다.


파이썬에서는, 객체를 선언하고, type() 함수를 사용하여, 객체의 타입을 확인할수 있습니다.



또한, dir() 함수를 사용하여, 해당 객체에서 사용할수 있는 속성들을 확인해 볼수 있습니다.


1
2
3
4
5
6
7
8
9
# 두개의 객체를 생성하고, type 확인 하기 
# type() 함수를 사용하여 확인할수 있습니다.

string1 = "안녕하세요"
print(type(string1))
print(dir(string1))

number_list = [1, 133, 12.5]
print(type(number_list))

파이썬에서는, 파이썬 객체의 속성들을 dir() 을 사용하여 확인 해보고, 사용도 해볼수 있습니다.


아래 예시에서는, lower()upper() 메서드들을 사용해 보았습니다.


1
2
3
4
5
6
7
8
9
10
# dir 로 확인해 보았을때, 
# upper() 와 lower() 메서드가 있는것을 확인할수 있는데
# .upper() 와 .lower() 를 사용하여, 객체를 소문자 대문자를 지정하여 출력할수 있습니다.

string2 = "hello world"
print(type(string2))
print(dir(string2))
print()
print(string2.lower())
print(string2.upper())

클래스에 대해서 더 알아보기 이전에, 아래 사항들을 잘 숙지하고 있어야 이해하기가 쉽습니다.


  • 로컬 변수
  • 글로벌 변수
  • global 문
  • nonlocal 문
  • namespace
  • scope 규칙

Class 를 이해하기 위해 알아야할 사항들


local variables (로컬변수)


함수 안에 변수가 선언되면, 해당 변수는 오로지, 해당 변수가 선언된 함수 내에서 혹은 코드 블럭에서만 접근이 가능합니다. 함수 안에 선언된 변수는, 함수 밖에 선언된 그 어떤 변수들과는 관계가 없습니다.


따라서, 해당 변수는, 변수가 선언된 함수 내부의 local 변수 입니다.


예시를 들면,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# local variable 
# 로컬 변수

def function_local(a):
print('a 는 -> ', a) # 파라미터로 전달된 값을 a 로 가집니다
a = 50
print('새로운 값을 가진 a 는 -> ', a) # 윗줄에서 a 는 50으로 할당 되었기 때문에 a는 50

# 함수 밖에 변수 a 는 100 으로 할당 되었습니다.
a = 100

# 함수를 호출
function_local(40)

print('a의 값은 - > ', a)

global 문


global 문의 목적은, 함수밖에 선언된 변수에 값을 할당 하기 위함 입니다. 예를들면,


1
2
3
4
5
6
7
8
9
10
11
12
13
# global statement 
# global 문

def function_local():
global a # 함수밖에 있는 a 의 값을 로컬 변수로 가져와서 사용합니다
print('a 는 - > ', a)
a = 50
print('함수안에 새로운값 이후에 a 는 - > ', a) # 50 이 할당된 변수를 출력합니다

a = 100
function_local()

print('a의 값은 -> ', a) # a 는 50이기 때문에, 50을 출력합니다

nonlocal 문


nonlocal 문은 안쪽에 존재하는 함수안에 변수를, 밖에 있는 변수와 묶어줄때 사용합니다.

예시를 들자면,


1
2
3
4
5
6
7
8
9
10
11
12
13
def outside():
a = 10
def inside():
a = 20
print("안쪽에 있는 a ->", a)
inside()
print('바깥쪽 a ->', a)

outside()


안쪽에 있는 a - > 20
바깥쪽 a -> 10

nonlocal 을 사용하면, 아래와 같이 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
def outside():
a = 10
def inside():
nonlocal a
a = 20
print("inside() 안에 있는 a 는 -", a)
inside()
print("outside()안에 있는 a 의 값 - ", a)

outside()


inside() 안에 있는 a 는 - 20
outside() 안에 있는 a 의 값 - 20

Python scope 와 Namespaces


Scope 와 Namespace 개념은, 처음에는 이해하기 어려운 개념입니다.


대부분의 경우, namespace 즉 이름공간은. 고유한 이름을 짓기위한 시스템입니다.


일상생활에서, 각 기차역 이름, 공항이름, 혹은 각 국가의 수도명은 각각 고유한 이름을 가지고 있습니다.


또한, 파일 시스템 디렉토리 구조들도 고유한 이름들을 가지고 있습니다.



namespaces,

이름 공간은, 변수들이 살고 있는 공간들입니다.


위의 이미지를 보면, 다른 이름공간 영역들이 보이는데, 각 영역들에 속한 변수들 끼리는 서로 연관이 없습니다.


만약 두개의 변수가 있다고 가정하고, 이 두변수들의 변수명이 서로 같다 하더라도, 다른 이름공간안에 살고 있다면, 해당 변수들은 서로 전혀 연관이 없고, 각각 고유한 변수 입니다.


변수명이 같다 하더라도, 다른 공간안에 있다면, 다른 변수로 생각해도 괜찮습니다.



Namespace, 즉 이름공간들은 아래와 같이 생성이 됩니다.


  1. built-in namespace - 파이썬 인터프리터가 시작될때 생성되고, 절대 삭제되지 않습니다
  2. global namespace for module - 모듈이 불려질때 생성되고, 인터프리터가 종료될때까지 살아 있습니다
  3. local namespace for function - 함수가 호출될때 생성되고, 함수가 반환될때 없어집니다.

Scope 는,

파이썬 프로그램안의 영역들로, namespace 가 바로 접근이 가능한 영역들입니다.



보편적으로, 파이썬에서 영역들은 아래와 같이 정리가 될수 있습니다.


  1. built-in 영역
  2. Global 영역
  3. Enclosed 영역
  4. local 영역

변수를 찾을때의 순서는 아래 그림과 같은 순서로 진행 될수 있습니다.


  1. 변수는, 함수안에서 local 변수 영역에서 먼저 찾고, 접근 가능합니다
  2. 변수는, 함수가 중첩되어 있는 구조, 즉 enclosed 일때에, 안쪽에 있는 함수의 밖의 함수 에서 변수를 찾아보고, 접근이 가능합니다
  3. enclosed 여역 밖의 global 영역에서 변수를 찾고 접근이 가능합니다
  4. built-in 영역에서 변수를 찾고, 접근 합니다