Python Class and Access Modifier

Python Class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Account:
# constructor
# 객체를 생성할 때 "반드시" 한 번 호출한다.
def __init__(self, cus_name, init_balance):
# instance member
self.name = cus_name
self.balance = init_balance

# descructor
# 객체가 소멸될 때 "반드시" 한 번 호출
def __del__(self):
pass

# instance method(operator)
def deposit(self, money):
if money < 0:
print('0보다 작은 값을 저금할 수 없습니다.')
return False

self.balance += money
print(f'잔고 {self.balance}')
return True

def withdraw(self, money):
if money > self.balance:
print('잔고보다 출금하려는 돈이 더 많습니다.')
return False

self.balance -= money
print(f'잔고 {self.balance}')
return money

def transfer(self, other, money):
self.balance -= money
# 다른 object의 member에 바로 접근하지 않는다!! (private없어서 접근 할 수는 있음(뭐임?))
# 다른 object의 member는 "반드시" 상대 object의 method를 호출해서 접근해야 한다. - Message Passing
other.deposit(money)
print(f'잔고 {self.balance}')

Object : abstraction method (추상화 도구)

  • 관련 있는 변수(member)와 기능(operator, method)를 묶어서 하나의 object로 만든다.
  • Operator를 통해서만 member에 접근할 수 있다.

Class와 Instance, object의 차이

  • 클래스(class)란 똑같은 무엇인가를 계속해서 만들어낼 수 있는 설계 도면 같은 것이고(과자 틀), 객체(object)란 클래스에 의해서 만들어진 피조물(과자틀에 의해서 만들어진 과자)을 뜻한다.
  • class에 의해서 만들어진 Object를 instance라고도 한다. 그렇다면 Object와 Instance의 차이는 무엇일까?
    이렇게 생각해 보자. a = Cookie() 이렇게 만들어진 a는 Object이다. 그리고 a라는 Object는 Cookie의 Instance이다.
  • 즉, Instance라는 말은 특정 Object(a)가 어떤 Class(Cookie)의 객체인지를 관계 위주로 설명할 때 사용된다. 즉, “a는 instance” 보다는 “a는 object”라는 표현이 어울리며, “a는 Cookie의 object” 보다는 “a는 Cookie의 instance”라는 표현이 훨씬 잘 어울린다.

Public, Private and Protected | Python Access Modifier

C++, Java와 같이 클래식한 object-oriented 언어에서는 public, private, protected와 같은 키워드로 class의 member에 대한 접근을 제어한다. Class의 Private member는 class 외부에서 접근이 불가능하며 class 내부에서만 접근될 수 있다.

Class 내의 Public member는 class 외부에서도 접근할 수 있다. 같은 class의 object는 public method를 호출하도록 요구된다. Private instance variable과 public method를 함께 써야지만 데이터 encapsulation의 원칙에 따르는 것이다.

Class의 protected member는 오직 해당 class와 그 class를 상속받은 child class만이 접근할 수 있다. 이는 parent class가 child class에게 특정한 리소스를 상속할 수 있게 한다.

그런데 Python은 instance variable과 method에 대해서 접근 제한을 하는 방식이 따로 없다. Python vaiable이나 method의 이름 앞에 한개 또는 2개의 _(underscore)를 붙여서 protected와 private으로 구분하기로 약속한다.

Public Attributes

1
2
3
4
5
class Account:
def __init__(self, cus_name, init_balance):
# instance member
self.name = cus_name
self.balance = init_balance

Protected Attribute

1
2
3
4
5
class Account:
def __init__(self, cus_name, init_balance):
# instance member
self._name = cus_name
self._balance = init_balance

Private Attribute

1
2
3
4
5
class Account:
def __init__(self, cus_name, init_balance):
# instance member
self.__name = cus_name
self.__balance = init_balance

그런데 웃긴 건, underscore로 name mangling한 private variable을 class 외부에서 접근이 가능하다는 것이다. 다음의 방법을 사용하면 된다.

1
2
myAccount = Account('subin', 10000)
myAccount._Account__balance

정말 필요하다면 접근할 수 있지만, Python에서는 접근하지 말 것을 권고하고 있다.


참고 자료

Call by Value, Call by Reference and Call by Object Reference

우선 Parameter와 Argument의 차이를 짚고 가도록 한다.

Parameter

The names given in the function definition are called Parameters.

Argument

The values supplied in the function call are called Arguments.

Call by Value

  • 함수를 호출할 때, 변수의 값을 복사하여 argument로 넘기는 것

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>

    void change_value(int x, int val) {
    x = val;
    printf("x : %d in change_value \n", *x);
    }

    int main(void) {
    int x = 10;
    change_value(x, 20);
    printf("x : %d in main \n", x);
    }

    Call by Value

    • 위 코드에서는 단순히 x에 10이라는 값이 복사되어 들어가기 때문에, change_value(x, 20)에서 x를 변경하더라도 main 함수에서의 x에 영향을 미치지 못한다.

Call by Reference

  • 함수를 호출할 때 변수의 값을 넘기는 것이 아니라, 변수의 주소(변수의 위치)를 복사하여 함수에 넘긴다.

  • 넘겨받은 주소로 실제 변수에 접근하고 값을 변경할 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>

    void change_value(int * x, int val) {
    *x = val;
    printf("x : %d in change_value \n", *x);
    }

    int main(void) {
    int x = 10;
    change_value(&x, 20);
    printf("x : %d in main \n", x);
    }

    Call by Reference

  • 주소값을 전달 (참조값을 전달) : 주소값을 알고 있으면 해당 memory 주소에 저장되어있는 값을 참조할 수 있다.

  • *x가 x를 참조하고 있다 : 가리키고 있다.

    이를 이해하기 위해서는 pointer에 대한 이해가 필요하다.

  • Pointer

    1
    2
    3
    int *pnum;
    int num = 12345;
    pnum = &num //num의 주소값을 return하여 pnum에 저장
    • 변수를 만들 때 변수 이름 앞에 *를 붙이면 pointer 변수 됨
    • &연산자: &오른쪽에 오는 피연산자의 주소값을 반환
    • *연산자: 포인터가 가리키는 메모리 공간에 접근할 때 사용되는 연산자. 포인터 변수를 이용해 포인터 변수가 가리키는 변수의 값을 바꿀 수도 있다.

Call by Assignment (Call by Object Reference)

The actual parameters (arguments) to a function call are introduced in the local symbol table of the called function when it is called; thus, arguments are passed using call by value (where the value is always an object reference, not the value of the object). [1] When a function calls another function, a new local symbol table is created for that call.

이 문장이 나를 얼마나 헷갈리게 했는지 모른다. 그러니까 Python에서는 function의 argument가 call by value로 넘어오는데, 그 value는 언제나 object의 값이 아닌 object의 reference라는 것이다.

Actually, call by object reference would be a better description, since if a mutable object is passed, the caller will see any changes the callee makes to it (items inserted into a list).

정확하게는 call by object reference라는 설명이 더 맞다. 왜냐면 mutable 객체가 넘어올 때에는 call by reference처럼 원본 값을 변경할 수 있기 때문이다.

  • 파이썬은 모든 것이 object이고, Object에는 두 종류가 있다.
  1. Immutable object
    • int, float, str, tuple
    • Immtable 객체가 함수의 인자로 전달되면, 처음에는 call by reference로 받지만 값이 변경되면 call by value로 동작한다.
    • 즉, 함수 내에서 formal parameter 값이 바뀌어도 actual parameter에는 영향이 없다.
    • 함수 내부에서 값을 변경할 수 없다!
    • 그래서 tuple은 변경하려면 함수에서 element와 tuple 인자로 넘겨 아예 새로 할당해줘야 함
  2. Mutable object
    • list, dict, set
    • Mutable 객체가 함수의 인자로 넘어가면 call by reference도 동작한다. 즉, object referene가 전달되어 actual parameter의 값에 영향을 미칠 수도 있다.
    • 새로운 객체를 할당하는 게 아니라면, 함수 내부에서 값을 변경할 수 있다!

정리

  • Python은 함수를 실행할때 Call by reference같은 느낌으로 reference를 넘겨준다. 하지만 이때 넘겨주는 것은 변수(Variable)의 reference가 아니라 변수가 담고 있는 자료(Data)의 reference이다.
  • 자료가 mutable하다면 변경해도 reference가 보존되므로 결과적으로 Call by reference처럼 보일 것이고, 자료가 immutable하다면 결과적으로 Call by value처럼 보일 것이다.

Local Variable and Global Variable

전역변수 (global variable) / 지역변수 (local variable)

  1. 변수의 scope와 lifetime
  • 변수는 선언하는 순간부터 속한 scope 내에서 lifetime을 가진다. 즉, 특정 범위의 코드가 실행되고 있을 때는 메모리에 존재하지만, 실행이 끝나면 이 변수는 메모리에서 사라진다.
  1. 변수의 선언 위치

    a. Block 외부 : block({})으로 감싸진 main 함수와 여러 함수들의 외부 공간에 변수를 선언할 수 있다.

    b. Block 내부 : block 내부에 변수를 선언할 수 있다. C는 block의 최상단에 모든 지역변수를 선언해야한다.

    c. 함수의 parameter : 함수의 매개변수는 그 함수의 block 내에서 선언된 변수와 동일한 효과를 갖는다.

  2. 전역변수 (a case)

  • Block 외부에 선언되는 변수. 전역 변수는 프로그램이 시작되는 순간부터 종료되는 순간까지 메모리를 차지하고 있으며 사라지지 않는다.

  • C라면 main() 위, #include <stdio.h>와 함수 원형 밑 그 사이에 선언

  • 전역변수는 어느 block에서도 언제든지 접근이 가능하다 > sycncrinize 고려

  1. 지역변수 (b case, c case)
  • 지역변수는 block 내부에서 선언되는 변수이다. { } 안에 선언되어있다면 무조건 지역변수

  • 지역변수는 선언된 block 내부로 scope가 한정되며 그 block의 실행이 끝나면 lifetime 또한 소멸된다.

  • 함수의 parameter로서 선언되는 local variable도 이와 같다. 함수 body 내에서 선언되는 것과 똑같다.

Python Data Type and Data Structure | Jupyter 사용방법

Jupyter 사용법 | Python Data Type

Jupyter notebook

  1. window 사용을 기준으로 Window PowerShell을 실행한다.

  2. pwd로 현재 폴더를, ls로 현재 폴더에 존재하는 file들을 확인 후 mkdir 폴더이름 command로 python file을 만들고 실습할 폴더 하나를 생성한다.

  3. 나는 python-basic이라는 폴더를 만들고 cd python-basic 명령으로 해당 폴더로 이동했다.

  4. 만든 폴더로 이동한 후 cmd에 jupyter notebook command를 입력한다.

    PowerShell에 jupyter notebook 입력

  5. 조금 기다리다보면 (10초 이상 소요) 브라우저 새 창으로 jupyter notebook이 실행된다.

    jupyter notebook 실행화면

  6. 그림과 같이 우측의 new button을 눌러 새로운 python file을 생성한다.

    create new python file

  7. 그럼 새로운 탭에 생성된 file이 보여진다.

    untitled.ipynb

  8. 제목을 수정하고 실습을 시작하면 된다!

  • method 이름을 치고 Shift + Tab을 하면 function의 signature를 확인할 수 있다.

    function signature 확인 단축키 : shift + tab

  • object (variable)을 입력한 상태에서 Tab 키를 누르면 사용 가능한 method들을 확인할 수 있다.

    method 확인 단축키 : tab

  • instruction을 작성한 후 Shift + Enter를 누르면 해당 line이 실행된다.

  • 어떤 line에 focus가 있는 상태에서, ESC + m을 누르고 Enter를 치면 markdown으로 작성할 수 있다.

Python Data Type

  1. Number Type : Int, Float

    Python Number Type

    javaScript와 다르게 C처럼 int, float등 정수형과 실수형을 구분한다.

  2. String

  • character와 string의 구분 없이 str type을 가진다.

String

Python Data Structure

Mutable and Immutable Object

Mutable object (변경 가능 객체)

  1. list
  2. dictionary
  3. set

Immutable object (변경 불가능 객체)

  1. int, float 등 숫자는 immutable : 값을 덮어쓰는 것이 아니라 새로운 memory 공간에 할당하고 그 값을 가리킨다. 이름 객체가 값 객체를 가리키는 것을 binding이라고 한다.
  2. string
  3. Tuple

Dynamic Typing

Dynamic Typing

Python은 Dynamic typing 언어로, C / C++ 같은 정적 타이핑 언어처럼 자료형을 미리 선언하지 않아도 알아서 동적으로 자료형을 할당할 수 있다.

Data Assignment

Memory Assignment (C / Python)

  • C : char a = 10;
    • A라는 이름을 가진 공간에 10의 값이 저장된다.
    • 20으로 변경시 같은 메모리 공간의 값을 변경한다.
  • Python : a = 10;
    • 10이라는 값을 가진 객체가 생기고, a라는 이름을 가진 객체가 10을 가리키게 된다.
    • 만약 a=20으로 재할당할 경우 20이라는 값을 가진 객체가 생기고 a는 20을 가리켜, 10은 자신을 가리키는 객체가 없으므로 제거된다.
    • 20으로 변경시 10의 메모리공간을 건드리지 않고 새로운 공간을 만든다.
  • Integer, float등 number type은 immutable 객체

Python 성질

  1. 모든 것이 객체
    : integer가 그냥 4 byte가 아니라 객체로 필요한 것들이 붙어있어 크기를 더 차지함
  2. Overflow
    : overflow 되는 대신 4 byte를 8 byte로 늘림. 대신 경계검사 하므로 속도 저하

Language Abstraction

  • Hardware 의존적인 Assembly 언어에서 벗어나 하드웨어 독립적인 C언어로 Coding하고 각 하드웨어 별 어셈블러로 해석하게끔 함 ▶ 하드웨어 추상화 (각 어셈블러가 어떻게 동작하는지 몰라도 C로 코딩하면 됨)
  • Assembly : low level language
  • C / C++ : hardware abstraction 됐으나 memory abstraction X ▶ 메모리를 직접 할당, 해제
  • Java / C# : 언어 자체에서 메모리 할당, 해제 ▶ garbage collection. Memory abstraction O 그러나 Data Type은 선언해줘야함
  • Python / javaScript : Data type abstraction. Interpreter Language
  • Level은 abstraction level을 말하는 것이지 급을 나누는 것이 아님
  • 성능은 C/C++ 생산성은 Python

Python 3.7.3 | Jupyter 설치

Window Python 3.7.3 및 Jupyter 설치

파이썬을 공부하기 위해 작업환경을 우선 구축하기로 한다.

Python 3.7.3 설치

  1. Python 최신 릴리즈인 3.7.3 다운로드 페이지로 이동한다.

www.python.org/download

  1. Download for Windows의 Python 3.7.3 버튼을 누르면 자동으로 설치 실행 파일이 다운로드 된다.

  2. 다운받은 python-3.7.3.exe 파일을 관리자 권한으로 실행 후, 설치를 진행한다. PATH를 자동으로 생성하는 것이 좋다!

  3. 다운로드가 완료되면 cmd 창을 열어 python --version 명령어로 설치가 제대로 되었는지 확인한다.

    python 설치 확인

Jupyter 설치

위의 Python 설치 4단계에서, cmd 명령으로 확인을 정상적으로 마쳤다면 추가적인 명령 한 줄로 Jupyter를 설치할 수 있다.

  1. cmd 창에 pip install jupyter를 입력한다.
    jupyter 설치

여기까지 하면 Python 사용을 위한 간단한 작업 환경 구성이 완료된다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×