SlideShare une entreprise Scribd logo
1  sur  54
Télécharger pour lire hors ligne
파이썬의 변수
– 16년차 소프트웨어 엔지니어
– PyCon Korea 2017 연사 (Python vs Java)
– (현) Elastic Sr. Support Engineer & Solutions Tech Lead
– (전) 두산중공업 Digital Innovation SW Architect & Agile Evangelist
– (전) 삼성SDS 프레임워크 팀 SW Architect & Engineer
– (전) 현대정보기술 해외금융기술팀SW Engineer
조인석 (Chris Cho)
강의 목표
● 변할 수 없는immutable
변수와 변할 수 있는mutable
변수의 차이점을 이해한다.
● 클래스class
변수와 인스턴스instance
변수의 차이점을 이해한다.
● 글로벌global
변수, 로컬local
변수와 논로컬nonlocal
변수의 차이점을 이해한다.
● 좋은 소스 코드를 작성하는데 도움이 되는 적합한 변수를 선택할 수 있다.
● 좋은 프로그래머가 되기 위한 기본 소양을 갖춘다.
강의 목표
● 변할 수 없는immutable
변수와 변할 수 있는mutable
변수의 차이점을 이해한다.
● 클래스class
변수와 인스턴스instance
변수의 차이점을 이해한다.
● 글로벌global
변수, 로컬local
변수와 논로컬nonlocal
변수의 차이점을 이해한다.
● 좋은 소스 코드를 작성하는데 도움이 되는 적합한 변수를 선택할 수 있다.
● 좋은 프로그래머가 되기 위한 기본 소양을 갖춘다.
● [NOT] 파이썬 내부 동작 원리를 깊이 이해한다.
컴퓨터의 기본 동작 원리와 변수의 역할
‘변수’는 데이터를 메모리에
저장할 때 물리적인 메모리 주소
대신 사용하는 기억하기 쉬운
단어로 구성된 꼬리표. 물리적인
메모리 주소는 항상 바뀔 수 있다.
https://brunch.co.kr/@insuk/4
동적 바인딩 (Duck Typing) & 강한 타입 언어
http://geek-and-poke.com/geekandpoke/2014/10/26/duck-typing-dogfooding https://pedrorijo.com/blog/strings-as-types/
immutable vs mutable
변할 수 없는 변할 수 있는
한번 맞춰 보세요!! >>> abcde_str = 'abcd'
>>> id(abcde_str)
4522087288
>>> abcde_str + 'e'
'abcde'
>>> abcde_str
'abcd'
>>> id(abcde_str)
4522087288
(문자열 값 덧붙이기)
???
???
한번 맞춰 보세요!! >>> abcde_str = 'abcd'
>>> id(abcde_str)
4522087288
>>> abcde_str + 'e'
'abcde'
>>> abcde_str
'abcd'
>>> id(abcde_str)
4522087288
동일 객체
값 변경 X
한번 맞춰 보세요!! >>> abcde_str = 'abcd'
>>> id(abcde_str)
4522087288
>>> abcde_str + 'e'
'abcde'
>>> abcde_str
'abcd'
>>> id(abcde_str)
4522087288
새로운 객체의
값
>>> abcde_str = 'abcd'
>>> id(abcde_str)
4522087288
>>> abcde_str + 'e'
'abcde'
>>> abcde_str
'abcd'
>>> id(abcde_str)
4522087288
>>> abcde_str = abcde_str + 'e'
>>> abcde_str
'abcde'
>>> id(abcde_str)
4574089144
새로운 객체로 변경
값 변경
객체 변경
>>> abcde_str = 'abcd'
>>> id(abcde_str)
4522087288
>>> abcde_str + 'e'
'abcde'
>>> abcde_str
'abcd'
>>> id(abcde_str)
4522087288
>>> abcde_list = ['a', 'b', 'c', 'd']
>>> id(abcde_list)
4574096456
>>> abcde_list.append('e')
>>> abcde_list
?
>>> id(abcde_list)
?
(리스트 값 덧붙이기)
???
???
>>> abcde_str = 'abcd'
>>> id(abcde_str)
4522087288
>>> abcde_str + 'e'
'abcde'
>>> abcde_str
'abcd'
>>> id(abcde_str)
4522087288
>>> abcde_list = ['a', 'b', 'c', 'd']
>>> id(abcde_list)
4574096456
>>> abcde_list.append('e')
>>> abcde_list
['a', 'b', 'c', 'd', 'e']
>>> id(abcde_list)
4574096456
값 변경
객체 변경 X
>>> abcde_str = 'abcd'
>>> id(abcde_str)
4522087288
>>> abcde_str + 'e'
'abcde'
>>> abcde_str
'abcd'
>>> id(abcde_str)
4522087288
>>> abcde_list = ['a', 'b', 'c', 'd']
>>> id(abcde_list)
4574096456
>>> abcde_list.append('e')
>>> abcde_list
['a', 'b', 'c', 'd', 'e']
>>> id(abcde_list)
4574096456
Immutable
(변경할 수 없는)
Mutable
(변경할 수 있는)
>>> abcde_str = 'abcd'
>>> id(abcde_str)
4522087288
>>> abcde_str + 'e'
'abcde'
>>> abcde_str
'abcd'
>>> id(abcde_str)
4522087288
>>> abcde_list = ['a', 'b', 'c', 'd']
>>> id(abcde_list)
4574096456
>>> abcde_list.append('e')
>>> abcde_list
['a', 'b', 'c', 'd', 'e']
>>> id(abcde_list)
4574096456
Immutable
(변경할 수 없는)
Mutable
(변경할 수 있는)
class vs instance
Programmer 클래스 정의
class Programmer:
languages = [] # 클래스 변수 선언
def __init__(self, name): # 초기화 함수 재정의
self.name = name # 인스턴스 변수 선언 및 초기화
def add_lang(self, lang):
self.languages.append(lang) # 클래스 변수 값 변경
>>> chris = Programmer('Chris Cho')
>>> chris.add_lang('Python')
>>> chris.add_lang('Java')
>>> chris.name
'Chris Cho'
>>> chris.languages
['Python', 'Java']
>>> ujin = Programmer('Ujin Cho')
>>> ujin.name
'Ujin Cho'
>>> ujin.languages
??? ???
언어 추가 X
한번 맞춰 보세요!!
>>> chris = Programmer('Chris Cho')
>>> chris.add_lang('Python')
>>> chris.add_lang('Java')
>>> chris.name
'Chris Cho'
>>> chris.languages
['Python', 'Java']
>>> ujin = Programmer('Ujin Cho')
>>> ujin.name
'Ujin Cho'
>>> ujin.languages
['Python', 'Java']
언어 추가 X
한번 맞춰 보세요!!
>>> chris = Programmer('Chris Cho')
>>> chris.add_lang('Python')
>>> chris.add_lang('Java')
>>> chris.name
'Chris Cho'
>>> chris.languages
['Python', 'Java']
>>> ujin = Programmer('Ujin Cho')
>>> ujin.name
'Ujin Cho'
>>> ujin.languages
['Python', 'Java']
언어 추가 X
한번 맞춰 보세요!!
Programmer 클래스 제대로 정의
class Programmer:
def __init__(self, name):
self.name = name
self.languages = []
def add_lang(self, lang):
self.languages.append(lang)
class Programmer:
languages = []
def __init__(self, name):
self.name = name
def add_lang(self, lang):
self.languages.append(lang)
정리해 볼까요?
‘클래스 변수’ :
클래스에 의해 생성된 모든 객체가 같은 값을 조회할 때 사용하는 변수
‘인스턴스 변수’ :
인스턴스화 될 때마다 새로운 값이 할당되며 서로 다른 객체 간에는 값을 공유할 수 없는 변수
⇒ 객체 단위로 값이 따로 관리되는 변수는 반드시 인스턴스 변수 사용
Wait a minute!!
BookReader 클래스 정의
class BookReader:
country = 'South Korea' # 클래스 변수 country 선언
def __init__(self, name): # 초기화 함수 재정의
self.name = name # 인스턴스 변수 name 선언
def read_book(self):
print(self.name, 'is reading in', self.country)
>>> chris = BookReader('Chris Cho')
>>> anna = BookReader('Anna Cho')
>>> chris.read_book()
Chris Cho is reading in South Korea
>>> anna.read_book()
Anna Cho is reading in South Korea
한번 더 맞춰 보세요!!
>>> chris.country = 'U.S.A'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in South Korea???
클래스 변수
값 변경
>>> chris = BookReader('Chris Cho')
>>> anna = BookReader('Anna Cho')
>>> chris.read_book()
Chris Cho is reading in South Korea
>>> anna.read_book()
Anna Cho is reading in South Korea
한번 더 맞춰 보세요!!
>>> chris.country = 'U.S.A'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in South Korea
>>> chris = BookReader('Chris Cho')
>>> anna = BookReader('Anna Cho')
>>> chris.read_book()
Chris Cho is reading in South Korea
>>> anna.read_book()
Anna Cho is reading in South Korea
한번 더 맞춰 보세요!!
>>> chris.country = 'U.S.A'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in South Korea
Immutable 객체의 값을 변경하니,
객체가 바뀌어 버린 경우
One more time!!!
>>> BookReader.country = 'Italy'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in Italy
>>> sean = BookReader('Sean Cho')
>>> sean.read_book()
Sean Cho is reading in Italy
한번 더 맞춰 보세요!!
>>> chris.country = 'U.S.A'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in South Korea
???
???
???
올바른 클래스 변수 접근 방법
>>> BookReader.country = 'Italy'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in Italy
>>> sean = BookReader('Sean Cho')
>>> sean.read_book()
Sean Cho is reading in Italy
한번 더 맞춰 보세요!!
>>> chris.country = 'U.S.A'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in South Korea
>>> BookReader.country = 'Italy'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in Italy
>>> sean = BookReader('Sean Cho')
>>> sean.read_book()
Sean Cho is reading in Italy
한번 더 맞춰 보세요!!
>>> chris.country = 'U.S.A'
>>> chris.read_book()
Chris Cho is reading in U.S.A
>>> anna.read_book()
Anna Cho is reading in South Korea
Immutable 클래스 변수 값을
변경하여 객체가 교체되면,
변경 전에 생성된 객체의
클래스 변수는 낙동강 오리알
신세가 됩니다.
SKBookReader 클래스 제대로 정의
class SKBookReader:
_COUNTRY = 'South Korea'
def __init__(self, name):
self.name = name
def read_book(self):
print(self.name, 'is reading in', SKBookReader._COUNTRY)
1) 내부용 변수 이름은 언더스코어
(_)로 시작
2) 상수는 대문자로 표기
3) 클래스 변수 접근은 객체(self)가
아닌, 클래스 이름으로
이번에는?
>>> insuk = SKBookReader('조인석')
>>> insuk.name
'조인석'
>>> insuk.read_book()
조인석 is reading in South Korea
>>> insuk._COUNTRY
'South Korea'
>>> insuk._COUNTRY = 'U.K'
>>> insuk.read_book()
조인석 is reading in South Korea???
이번에는?
>>> insuk = SKBookReader('조인석')
>>> insuk.name
'조인석'
>>> insuk.read_book()
조인석 is reading in South Korea
>>> insuk._COUNTRY
'South Korea'
>>> insuk._COUNTRY = 'U.K'
>>> insuk.read_book()
조인석 is reading in South Korea
다시 정리해 볼까요?
‘클래스 변수’ :
클래스에 의해 생성된 모든 객체가 인스턴스화되는 시점에 같은 값을 조회할 때 사용
‘인스턴스 변수’ :
인스턴스화 될 때마다 새로운 값이 할당되며 서로 다른 객체 간에는 값을 공유할 수 없는 변수
⇒ 객체 단위로 값이 따로 관리 되는 변수는 반드시 인스턴스 변수 사용
⇒ 클래스 변수는 객체 이름이 아닌 클래스 이름으로 접근, 되도록 값이 변경되지 않는
경우에 사용하는 것이 안전하다!
global vs local vs nonlocal
어떤 결과가 나오나요?
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
???
???
???
???
어떤 결과가 나오나요?
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
???
???
???
https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
어떤 결과가 나오나요?
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
???
???
https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
어떤 결과가 나오나요?
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
???
https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
어떤 결과가 나오나요?
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
어떤 결과가 나오나요?
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
어떤 결과가 나오나요?
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
⇐ 좋은 코드인가요?
https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
Style Guide for Python Code
https://www.python.org/dev/peps/pep-0008/
PEP 8
구글 파이썬 코드 스타일 가이드
https://google.github.io/styleguide/pyguide.html
구글 파이썬 코드 스타일 가이드
https://google.github.io/styleguide/pyguide.html
구글 파이썬 코드 스타일 가이드
https://google.github.io/styleguide/pyguide.html
기억하세요!!
● 파이썬 변수에 대입되는 객체는 데이터 타입에 따라 변할 수 있거나mutable
변할 수
없는immutable
성질을 갖는다.
● 위 성질에 따라 객체 변경시 서로 다르게 동작하니, 주의하여 사용해야 한다.
● 클래스/인스턴스 변수, 글로벌/로컬 변수는 서로 다른 유효 범위scope
를 갖는다. 단,
mutable 여부에 따라 예상치 못하게 변경될 수 있다.
● 어떤 변수를 써야 할 지 애매하다면, 유효 범위가 좁은 변수(인스턴스, 로컬)를 사용하는
것이 안전하다.
● 변수를 내부용으로 강제하고 싶다면, 변수 이름을 언더스코어(_)로 시작하자.
● 글로벌 변수 사용은 가능한 피하자.
● 파이썬 코딩 스타일 가이드(PEP 8)를 꼭 따르자.
행복한 코딩하세요!!
Thank you
조 인 석 (Chris Cho)
https://www.facebook.com/pythonmento
isi.cho@gmail.com

Contenu connexe

Tendances

엄준일 04일차 HTML/Javascript 교육
엄준일 04일차 HTML/Javascript 교육엄준일 04일차 HTML/Javascript 교육
엄준일 04일차 HTML/Javascript 교육준일 엄
 
Scala self type inheritance
Scala self type inheritanceScala self type inheritance
Scala self type inheritanceYong Joon Moon
 
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기NAVER D2
 
스칼라 클래스 이해하기 _Scala class understanding
스칼라 클래스 이해하기 _Scala class understanding스칼라 클래스 이해하기 _Scala class understanding
스칼라 클래스 이해하기 _Scala class understandingYong Joon Moon
 

Tendances (7)

엄준일 04일차 HTML/Javascript 교육
엄준일 04일차 HTML/Javascript 교육엄준일 04일차 HTML/Javascript 교육
엄준일 04일차 HTML/Javascript 교육
 
Scala self type inheritance
Scala self type inheritanceScala self type inheritance
Scala self type inheritance
 
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
[D2 campus seminar]스칼라를 통한 다양한 언어의 패러다임 맛보기
 
Java inner class
Java inner classJava inner class
Java inner class
 
Java extends
Java extendsJava extends
Java extends
 
스칼라 클래스 이해하기 _Scala class understanding
스칼라 클래스 이해하기 _Scala class understanding스칼라 클래스 이해하기 _Scala class understanding
스칼라 클래스 이해하기 _Scala class understanding
 
Java class
Java classJava class
Java class
 

Similaire à [PyCon Korea 2019] 파이썬의 변수

파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304Yong Joon Moon
 
9 object class
9 object class9 object class
9 object class웅식 전
 
[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성NAVER D2
 
Python if loop-function
Python if loop-functionPython if loop-function
Python if loop-function건희 김
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summarySehyeon Nam
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
외계어 스터디 2/5 - Expressions & statements
외계어 스터디 2/5 - Expressions & statements외계어 스터디 2/5 - Expressions & statements
외계어 스터디 2/5 - Expressions & statements민태 김
 
Jupyter notebook 이해하기
Jupyter notebook 이해하기 Jupyter notebook 이해하기
Jupyter notebook 이해하기 Yong Joon Moon
 
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여iamprogrammerofficial
 
MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기Seongkuk Park
 
Use JavaScript more strictly (feat. TypeScript, flow)
Use JavaScript more strictly (feat. TypeScript, flow)Use JavaScript more strictly (feat. TypeScript, flow)
Use JavaScript more strictly (feat. TypeScript, flow)Mark Lee
 
게임프로그래밍입문 7
게임프로그래밍입문 7게임프로그래밍입문 7
게임프로그래밍입문 7Yeonah Ki
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기Yongha Yoo
 
파이썬 class 및 function namespace 이해하기
파이썬 class 및 function namespace 이해하기파이썬 class 및 function namespace 이해하기
파이썬 class 및 function namespace 이해하기Yong Joon Moon
 
Python datatype
Python datatypePython datatype
Python datatype건희 김
 
Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기JangHyuk You
 
인프콘-타입스크립트는 왜 그럴까?-이정환.pdf
인프콘-타입스크립트는 왜 그럴까?-이정환.pdf인프콘-타입스크립트는 왜 그럴까?-이정환.pdf
인프콘-타입스크립트는 왜 그럴까?-이정환.pdf이정환
 
코드잇-타스-특강.pdf
코드잇-타스-특강.pdf코드잇-타스-특강.pdf
코드잇-타스-특강.pdf이정환
 

Similaire à [PyCon Korea 2019] 파이썬의 변수 (20)

Scala
ScalaScala
Scala
 
파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304
 
9 object class
9 object class9 object class
9 object class
 
[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성
 
Python if loop-function
Python if loop-functionPython if loop-function
Python if loop-function
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summary
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
외계어 스터디 2/5 - Expressions & statements
외계어 스터디 2/5 - Expressions & statements외계어 스터디 2/5 - Expressions & statements
외계어 스터디 2/5 - Expressions & statements
 
Jupyter notebook 이해하기
Jupyter notebook 이해하기 Jupyter notebook 이해하기
Jupyter notebook 이해하기
 
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
 
MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기MongoDB 하루만에 끝내기
MongoDB 하루만에 끝내기
 
Use JavaScript more strictly (feat. TypeScript, flow)
Use JavaScript more strictly (feat. TypeScript, flow)Use JavaScript more strictly (feat. TypeScript, flow)
Use JavaScript more strictly (feat. TypeScript, flow)
 
게임프로그래밍입문 7
게임프로그래밍입문 7게임프로그래밍입문 7
게임프로그래밍입문 7
 
스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기
 
파이썬 class 및 function namespace 이해하기
파이썬 class 및 function namespace 이해하기파이썬 class 및 function namespace 이해하기
파이썬 class 및 function namespace 이해하기
 
Python datatype
Python datatypePython datatype
Python datatype
 
C++ stl
C++ stlC++ stl
C++ stl
 
Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기
 
인프콘-타입스크립트는 왜 그럴까?-이정환.pdf
인프콘-타입스크립트는 왜 그럴까?-이정환.pdf인프콘-타입스크립트는 왜 그럴까?-이정환.pdf
인프콘-타입스크립트는 왜 그럴까?-이정환.pdf
 
코드잇-타스-특강.pdf
코드잇-타스-특강.pdf코드잇-타스-특강.pdf
코드잇-타스-특강.pdf
 

[PyCon Korea 2019] 파이썬의 변수

  • 2. – 16년차 소프트웨어 엔지니어 – PyCon Korea 2017 연사 (Python vs Java) – (현) Elastic Sr. Support Engineer & Solutions Tech Lead – (전) 두산중공업 Digital Innovation SW Architect & Agile Evangelist – (전) 삼성SDS 프레임워크 팀 SW Architect & Engineer – (전) 현대정보기술 해외금융기술팀SW Engineer 조인석 (Chris Cho)
  • 3. 강의 목표 ● 변할 수 없는immutable 변수와 변할 수 있는mutable 변수의 차이점을 이해한다. ● 클래스class 변수와 인스턴스instance 변수의 차이점을 이해한다. ● 글로벌global 변수, 로컬local 변수와 논로컬nonlocal 변수의 차이점을 이해한다. ● 좋은 소스 코드를 작성하는데 도움이 되는 적합한 변수를 선택할 수 있다. ● 좋은 프로그래머가 되기 위한 기본 소양을 갖춘다.
  • 4. 강의 목표 ● 변할 수 없는immutable 변수와 변할 수 있는mutable 변수의 차이점을 이해한다. ● 클래스class 변수와 인스턴스instance 변수의 차이점을 이해한다. ● 글로벌global 변수, 로컬local 변수와 논로컬nonlocal 변수의 차이점을 이해한다. ● 좋은 소스 코드를 작성하는데 도움이 되는 적합한 변수를 선택할 수 있다. ● 좋은 프로그래머가 되기 위한 기본 소양을 갖춘다. ● [NOT] 파이썬 내부 동작 원리를 깊이 이해한다.
  • 5.
  • 6.
  • 7.
  • 8. 컴퓨터의 기본 동작 원리와 변수의 역할 ‘변수’는 데이터를 메모리에 저장할 때 물리적인 메모리 주소 대신 사용하는 기억하기 쉬운 단어로 구성된 꼬리표. 물리적인 메모리 주소는 항상 바뀔 수 있다. https://brunch.co.kr/@insuk/4
  • 9. 동적 바인딩 (Duck Typing) & 강한 타입 언어 http://geek-and-poke.com/geekandpoke/2014/10/26/duck-typing-dogfooding https://pedrorijo.com/blog/strings-as-types/
  • 10. immutable vs mutable 변할 수 없는 변할 수 있는
  • 11. 한번 맞춰 보세요!! >>> abcde_str = 'abcd' >>> id(abcde_str) 4522087288 >>> abcde_str + 'e' 'abcde' >>> abcde_str 'abcd' >>> id(abcde_str) 4522087288 (문자열 값 덧붙이기) ??? ???
  • 12. 한번 맞춰 보세요!! >>> abcde_str = 'abcd' >>> id(abcde_str) 4522087288 >>> abcde_str + 'e' 'abcde' >>> abcde_str 'abcd' >>> id(abcde_str) 4522087288 동일 객체 값 변경 X
  • 13. 한번 맞춰 보세요!! >>> abcde_str = 'abcd' >>> id(abcde_str) 4522087288 >>> abcde_str + 'e' 'abcde' >>> abcde_str 'abcd' >>> id(abcde_str) 4522087288 새로운 객체의 값
  • 14. >>> abcde_str = 'abcd' >>> id(abcde_str) 4522087288 >>> abcde_str + 'e' 'abcde' >>> abcde_str 'abcd' >>> id(abcde_str) 4522087288 >>> abcde_str = abcde_str + 'e' >>> abcde_str 'abcde' >>> id(abcde_str) 4574089144 새로운 객체로 변경 값 변경 객체 변경
  • 15. >>> abcde_str = 'abcd' >>> id(abcde_str) 4522087288 >>> abcde_str + 'e' 'abcde' >>> abcde_str 'abcd' >>> id(abcde_str) 4522087288 >>> abcde_list = ['a', 'b', 'c', 'd'] >>> id(abcde_list) 4574096456 >>> abcde_list.append('e') >>> abcde_list ? >>> id(abcde_list) ? (리스트 값 덧붙이기) ??? ???
  • 16. >>> abcde_str = 'abcd' >>> id(abcde_str) 4522087288 >>> abcde_str + 'e' 'abcde' >>> abcde_str 'abcd' >>> id(abcde_str) 4522087288 >>> abcde_list = ['a', 'b', 'c', 'd'] >>> id(abcde_list) 4574096456 >>> abcde_list.append('e') >>> abcde_list ['a', 'b', 'c', 'd', 'e'] >>> id(abcde_list) 4574096456 값 변경 객체 변경 X
  • 17. >>> abcde_str = 'abcd' >>> id(abcde_str) 4522087288 >>> abcde_str + 'e' 'abcde' >>> abcde_str 'abcd' >>> id(abcde_str) 4522087288 >>> abcde_list = ['a', 'b', 'c', 'd'] >>> id(abcde_list) 4574096456 >>> abcde_list.append('e') >>> abcde_list ['a', 'b', 'c', 'd', 'e'] >>> id(abcde_list) 4574096456 Immutable (변경할 수 없는) Mutable (변경할 수 있는)
  • 18. >>> abcde_str = 'abcd' >>> id(abcde_str) 4522087288 >>> abcde_str + 'e' 'abcde' >>> abcde_str 'abcd' >>> id(abcde_str) 4522087288 >>> abcde_list = ['a', 'b', 'c', 'd'] >>> id(abcde_list) 4574096456 >>> abcde_list.append('e') >>> abcde_list ['a', 'b', 'c', 'd', 'e'] >>> id(abcde_list) 4574096456 Immutable (변경할 수 없는) Mutable (변경할 수 있는)
  • 20. Programmer 클래스 정의 class Programmer: languages = [] # 클래스 변수 선언 def __init__(self, name): # 초기화 함수 재정의 self.name = name # 인스턴스 변수 선언 및 초기화 def add_lang(self, lang): self.languages.append(lang) # 클래스 변수 값 변경
  • 21. >>> chris = Programmer('Chris Cho') >>> chris.add_lang('Python') >>> chris.add_lang('Java') >>> chris.name 'Chris Cho' >>> chris.languages ['Python', 'Java'] >>> ujin = Programmer('Ujin Cho') >>> ujin.name 'Ujin Cho' >>> ujin.languages ??? ??? 언어 추가 X 한번 맞춰 보세요!!
  • 22. >>> chris = Programmer('Chris Cho') >>> chris.add_lang('Python') >>> chris.add_lang('Java') >>> chris.name 'Chris Cho' >>> chris.languages ['Python', 'Java'] >>> ujin = Programmer('Ujin Cho') >>> ujin.name 'Ujin Cho' >>> ujin.languages ['Python', 'Java'] 언어 추가 X 한번 맞춰 보세요!!
  • 23. >>> chris = Programmer('Chris Cho') >>> chris.add_lang('Python') >>> chris.add_lang('Java') >>> chris.name 'Chris Cho' >>> chris.languages ['Python', 'Java'] >>> ujin = Programmer('Ujin Cho') >>> ujin.name 'Ujin Cho' >>> ujin.languages ['Python', 'Java'] 언어 추가 X 한번 맞춰 보세요!!
  • 24. Programmer 클래스 제대로 정의 class Programmer: def __init__(self, name): self.name = name self.languages = [] def add_lang(self, lang): self.languages.append(lang) class Programmer: languages = [] def __init__(self, name): self.name = name def add_lang(self, lang): self.languages.append(lang)
  • 25. 정리해 볼까요? ‘클래스 변수’ : 클래스에 의해 생성된 모든 객체가 같은 값을 조회할 때 사용하는 변수 ‘인스턴스 변수’ : 인스턴스화 될 때마다 새로운 값이 할당되며 서로 다른 객체 간에는 값을 공유할 수 없는 변수 ⇒ 객체 단위로 값이 따로 관리되는 변수는 반드시 인스턴스 변수 사용
  • 27. BookReader 클래스 정의 class BookReader: country = 'South Korea' # 클래스 변수 country 선언 def __init__(self, name): # 초기화 함수 재정의 self.name = name # 인스턴스 변수 name 선언 def read_book(self): print(self.name, 'is reading in', self.country)
  • 28. >>> chris = BookReader('Chris Cho') >>> anna = BookReader('Anna Cho') >>> chris.read_book() Chris Cho is reading in South Korea >>> anna.read_book() Anna Cho is reading in South Korea 한번 더 맞춰 보세요!! >>> chris.country = 'U.S.A' >>> chris.read_book() Chris Cho is reading in U.S.A >>> anna.read_book() Anna Cho is reading in South Korea??? 클래스 변수 값 변경
  • 29. >>> chris = BookReader('Chris Cho') >>> anna = BookReader('Anna Cho') >>> chris.read_book() Chris Cho is reading in South Korea >>> anna.read_book() Anna Cho is reading in South Korea 한번 더 맞춰 보세요!! >>> chris.country = 'U.S.A' >>> chris.read_book() Chris Cho is reading in U.S.A >>> anna.read_book() Anna Cho is reading in South Korea
  • 30. >>> chris = BookReader('Chris Cho') >>> anna = BookReader('Anna Cho') >>> chris.read_book() Chris Cho is reading in South Korea >>> anna.read_book() Anna Cho is reading in South Korea 한번 더 맞춰 보세요!! >>> chris.country = 'U.S.A' >>> chris.read_book() Chris Cho is reading in U.S.A >>> anna.read_book() Anna Cho is reading in South Korea Immutable 객체의 값을 변경하니, 객체가 바뀌어 버린 경우
  • 32. >>> BookReader.country = 'Italy' >>> chris.read_book() Chris Cho is reading in U.S.A >>> anna.read_book() Anna Cho is reading in Italy >>> sean = BookReader('Sean Cho') >>> sean.read_book() Sean Cho is reading in Italy 한번 더 맞춰 보세요!! >>> chris.country = 'U.S.A' >>> chris.read_book() Chris Cho is reading in U.S.A >>> anna.read_book() Anna Cho is reading in South Korea ??? ??? ??? 올바른 클래스 변수 접근 방법
  • 33. >>> BookReader.country = 'Italy' >>> chris.read_book() Chris Cho is reading in U.S.A >>> anna.read_book() Anna Cho is reading in Italy >>> sean = BookReader('Sean Cho') >>> sean.read_book() Sean Cho is reading in Italy 한번 더 맞춰 보세요!! >>> chris.country = 'U.S.A' >>> chris.read_book() Chris Cho is reading in U.S.A >>> anna.read_book() Anna Cho is reading in South Korea
  • 34. >>> BookReader.country = 'Italy' >>> chris.read_book() Chris Cho is reading in U.S.A >>> anna.read_book() Anna Cho is reading in Italy >>> sean = BookReader('Sean Cho') >>> sean.read_book() Sean Cho is reading in Italy 한번 더 맞춰 보세요!! >>> chris.country = 'U.S.A' >>> chris.read_book() Chris Cho is reading in U.S.A >>> anna.read_book() Anna Cho is reading in South Korea Immutable 클래스 변수 값을 변경하여 객체가 교체되면, 변경 전에 생성된 객체의 클래스 변수는 낙동강 오리알 신세가 됩니다.
  • 35. SKBookReader 클래스 제대로 정의 class SKBookReader: _COUNTRY = 'South Korea' def __init__(self, name): self.name = name def read_book(self): print(self.name, 'is reading in', SKBookReader._COUNTRY) 1) 내부용 변수 이름은 언더스코어 (_)로 시작 2) 상수는 대문자로 표기 3) 클래스 변수 접근은 객체(self)가 아닌, 클래스 이름으로
  • 36. 이번에는? >>> insuk = SKBookReader('조인석') >>> insuk.name '조인석' >>> insuk.read_book() 조인석 is reading in South Korea >>> insuk._COUNTRY 'South Korea' >>> insuk._COUNTRY = 'U.K' >>> insuk.read_book() 조인석 is reading in South Korea???
  • 37. 이번에는? >>> insuk = SKBookReader('조인석') >>> insuk.name '조인석' >>> insuk.read_book() 조인석 is reading in South Korea >>> insuk._COUNTRY 'South Korea' >>> insuk._COUNTRY = 'U.K' >>> insuk.read_book() 조인석 is reading in South Korea
  • 38. 다시 정리해 볼까요? ‘클래스 변수’ : 클래스에 의해 생성된 모든 객체가 인스턴스화되는 시점에 같은 값을 조회할 때 사용 ‘인스턴스 변수’ : 인스턴스화 될 때마다 새로운 값이 할당되며 서로 다른 객체 간에는 값을 공유할 수 없는 변수 ⇒ 객체 단위로 값이 따로 관리 되는 변수는 반드시 인스턴스 변수 사용 ⇒ 클래스 변수는 객체 이름이 아닌 클래스 이름으로 접근, 되도록 값이 변경되지 않는 경우에 사용하는 것이 안전하다!
  • 39. global vs local vs nonlocal
  • 40. 어떤 결과가 나오나요? After local assignment: test spam After nonlocal assignment: nonlocal spam After global assignment: nonlocal spam In global scope: global spam https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example ??? ??? ??? ???
  • 41. 어떤 결과가 나오나요? After local assignment: test spam After nonlocal assignment: nonlocal spam After global assignment: nonlocal spam In global scope: global spam ??? ??? ??? https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
  • 42. 어떤 결과가 나오나요? After local assignment: test spam After nonlocal assignment: nonlocal spam After global assignment: nonlocal spam In global scope: global spam ??? ??? https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
  • 43. 어떤 결과가 나오나요? After local assignment: test spam After nonlocal assignment: nonlocal spam After global assignment: nonlocal spam In global scope: global spam ??? https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
  • 44. 어떤 결과가 나오나요? After local assignment: test spam After nonlocal assignment: nonlocal spam After global assignment: nonlocal spam In global scope: global spam https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
  • 45. 어떤 결과가 나오나요? After local assignment: test spam After nonlocal assignment: nonlocal spam After global assignment: nonlocal spam In global scope: global spam https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
  • 46. 어떤 결과가 나오나요? After local assignment: test spam After nonlocal assignment: nonlocal spam After global assignment: nonlocal spam In global scope: global spam ⇐ 좋은 코드인가요? https://docs.python.org/3.7/tutorial/classes.html#scopes-and-namespaces-example
  • 47. Style Guide for Python Code
  • 49. 구글 파이썬 코드 스타일 가이드 https://google.github.io/styleguide/pyguide.html
  • 50. 구글 파이썬 코드 스타일 가이드 https://google.github.io/styleguide/pyguide.html
  • 51. 구글 파이썬 코드 스타일 가이드 https://google.github.io/styleguide/pyguide.html
  • 52. 기억하세요!! ● 파이썬 변수에 대입되는 객체는 데이터 타입에 따라 변할 수 있거나mutable 변할 수 없는immutable 성질을 갖는다. ● 위 성질에 따라 객체 변경시 서로 다르게 동작하니, 주의하여 사용해야 한다. ● 클래스/인스턴스 변수, 글로벌/로컬 변수는 서로 다른 유효 범위scope 를 갖는다. 단, mutable 여부에 따라 예상치 못하게 변경될 수 있다. ● 어떤 변수를 써야 할 지 애매하다면, 유효 범위가 좁은 변수(인스턴스, 로컬)를 사용하는 것이 안전하다. ● 변수를 내부용으로 강제하고 싶다면, 변수 이름을 언더스코어(_)로 시작하자. ● 글로벌 변수 사용은 가능한 피하자. ● 파이썬 코딩 스타일 가이드(PEP 8)를 꼭 따르자.
  • 54. Thank you 조 인 석 (Chris Cho) https://www.facebook.com/pythonmento isi.cho@gmail.com