
우리는 파이썬의 변수와 메모리를 알고, 객체지향 프로그래밍인 파이썬의 값객체 참조객체를 이해하여 함수를 호출하고 사용하는 방법을 이해한다. 이를 통해서 파이썬의 기초인 리스트, 딕셔너리, 튜플을 다음시간 설명 때 더 명확히 이해하고 직접 기본적인 코드예시를 들어 설명력을 높일 예정이다.
파이썬 변수와 메모리
변수(Variable)란 사용할 데이터를 저장하는 공간이다. 즉, 변수는 값을 저장하는 상자로 생각할 수 있으며, 변수는 메모리에 저장된다. C언어에서 변수는 데이터 타입을 사용하여 변수 선언을 해야 한다. 아니면 읽히지 않는다. 허나, 파이썬에서는 변수는 데이터 타입을 생략하고 변수 선언이 가능하다. 아래 예시를 보면 같은 방식으로 입력했지만, a는 'int'형 b는 'float'형태로 입력되며, a+b를 더한 c의 형태도 역시 'float'형태를 취한다. 즉 파이썬에서는 변수의 데이터 형식은 값을 넣는 순간마다 변경될 수 있는 유연한 구조를 가진다. 왜냐하면, 변수는 객체를 가리키는 ID값을 담고 있는 저장공간이기 때문이다.
a = 10
type(a)
<class 'int'>
b = 10.5
type(b)
<class 'float'>
c =a + b
type(c)
print(id(a))
print(id(b))
print(id(c))
값객체 참조객체
파이썬은 모두 객체이므로 변경여부 관리가 중요하다. 객체가 생성되고 함수 파라미터 등으로 전달될 때에도 변경이 가능한 객체와 불가능한 객체를 동일한 방식으로 관리한다. 여기서 값객체와 참조객체로 나뉘게 되는데, 값객체(Immutable)이란, 변수에 저장된 것을 값으로 인식하며 변수는 치환이 가능하지만 변경은 안된다. 무문자열은 임의적으로 값 객체로 정의한다고 볼 수 있다. 참조객체(Mutable)는 변수에 저장된 것은 객체의 요소(값)들이 저장된 참조이므로 실제 값들이 변경이 가능하다. 함수 파라미터, 할당을 할 경우 참조만 넘어가므로 요소들이 변경이 가능하다. 즉, 이건 우린 Swallow copy라고 이야기한다. 만약 참조객체를 처리할 경우 처음 값이 변경되지 않으려면 참조만 복사하지 말고 전체 값을 복사해야 별도의 참조가 생겨 다른 값 객체로 인식한다. 이것은 우린 deep copy라고 명명한다. 즉 값객체들은 숫자형(numbers), 문자열형(string), 튜플형(tuple)이라고 볼 수 있고, 참조객체들은 리스트형(list), 사전형(dict), 집합형(set)이라고 볼 수 있다.
# Shallow copy
a = [1,2,3]
b =a
id(a), id(b)
# (40410824, 40410824)
# Deep copy
a = [1,2,3]
b=a[:]
id(a), id(b)
# (48792072, 48792392)
함수 개념 호출방법
함수는 독립적으로 수행하는 프로그램 단위로 특정 작업을 수행하는 명령어들의 모음에 이름을 붙인 것이다. 프로그램에서 반복적으로 수행되는 기능을 함수로 만들어 호출하는 것이라고 보면 된다. 함수는 작업에 필요한 데이터(매개변수)를 전달받을 수 있으며, 작업이 완료된 후에는 작업의 결과를 호출자에게 반환할 수 있다. 그럼 함수는 왜 필요한 것인가? 함수는 주어진 문제를 작은 문제, 즉 여러 함수로 나누어 생각할 수 있으므로 함수를 만드는 것은 문제 해결의 하나의 방법이다. 즉, 함수로 구성된 프로그램은 함수 단위로 구성되어 있어, 읽기 쉽고, 이해하기 쉽다. 이미 정의된 함수는 여러 번 호출이 가능하므로 소스의 중복을 최소화하여 프로그램의 양을 줄이는 효과를 가져올 수 있다.
# 함수정의
# 함수의 선언은 def로 시작하고 콜론(:)으로 끝낸다.
# 함수의 시작과 끝은 코드의 들여쓰기로 구분
# 시작과 끝을 명시해 줄 필요가 없음
def 함수이름 (입력변수) :
수행할 문장
.....
return 반환값
#함수 호출
명명 = 함수이름(100)
print(명명)
함수호출방법은 크게 두 가지가 있다. 값에 의한 호출(Call by value)과 참조의 의한 호출(call by reference)이 존재한다. call by value는 함수에 인자를 넘길 때 값만 넘기는 것이고, 함수 내에 인자값 변경 시, 호출자에 영향을 주지 않는다. call by reference는 함수에 인자를 넘길 때 메모리 주소를 넘긴다. 함수 내에 이인자값 변경 시, 호출자의 값도 변경됨을 인지할 필요가 있다. 간단하게 변수와 메모리, 객체, 함수에 대해 설명하였다. 앞에 파이썬의 개요를 살펴보면서 전체적인 WrapUp을 할 필요가 있다.
'AI기초' 카테고리의 다른 글
구조체의 정의 및 리스트(List) 튜플(Tuple) 딕셔너리(Dictionary) (0) | 2023.03.16 |
---|---|
파이썬(Python)의 개요 인터프리터 언어 객체지향 프로그래밍 동적타이핑언어 (0) | 2023.03.16 |
API(Application Programming Interface)의 개념 예시와 종류 (0) | 2023.03.14 |
컴퓨팅 사고력의 정의 구성요소 문제구조화 최근교육사례 (0) | 2023.03.09 |
댓글