λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

인곡지λŠ₯

[Day 4] Python

πŸ“ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° 파이썬(Python Object-Oriented Programming)

  πŸ”₯ OOP(객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°)

    - 객체: 속성(Attrivute, λ³€μˆ˜(variable))κ³Ό 행동(Action, ν•¨μˆ˜(method))을 가짐

              ex) AI 좕ꡬ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•œλ‹€κ³  κ°€μ •ν•œλ‹€λ©΄,

                    객체 μ’…λ₯˜: νŒ€, μ„ μˆ˜, μ‹¬νŒ, 곡 λ“±

                     Action: μ„ μˆ˜ - 곡을 μ°¨λ‹€, νŒ¨μŠ€ν•˜λ‹€          μ‹¬νŒ - νœ˜μŠ¬μ„ λΆˆλ‹€, κ²½κ³ λ₯Ό μ£Όλ‹€

                     Attribution: μ„ μˆ˜ - μ„ μˆ˜ 이름, ν¬μ§€μ…˜, μ†Œμ† νŒ€          νŒ€ - νŒ€ 이름, νŒ€ μ—°κ³ μ§€, νŒ€ μ†Œμ† μ„ μˆ˜

    - 클래슀(Class)와 μ‹€μ œ κ΅¬ν˜„μ²΄μΈ μΈμŠ€ν„΄μŠ€(Instance)둜 λ‚˜λˆ”

κ°μ²΄λŠ” λ‹€μ–‘ν•œ ν˜•νƒœκ°€ μ‘΄μž¬ν•  수 μžˆλ‹€.

  πŸ”₯ Class μ„ μ–Έ: Class example(object) 의 ν˜•μ‹

    - method κ΅¬ν˜„: ν•¨μˆ˜ κ΅¬ν˜„κ³Ό λΉ„μŠ·ν•˜λ‚˜ λ°˜λ“œμ‹œ selfλ₯Ό μΆ”κ°€ν•΄ μ£Όμ–΄μ•Όν•œλ‹€.

            class exmaple():

               def a(self, a):

                   statements

    - object(instance) μ‚¬μš©ν•˜κΈ°: object 이름 μ„ μ–Έκ³Ό μ΄ˆκΈ°κ°’ μž…λ ₯(쑴재 ν•œλ‹€λ©΄)

           a = example(oop)   --->   def __init__(self, oop)    /   μ—¬κΈ°μ„œ __init__은 객체 μ΄ˆκΈ°ν™” μ˜ˆμ•½ ν•¨μˆ˜μ΄λ‹€.

 

  πŸ“Œ Class Naming

    -> ν•¨μˆ˜μ™€ λ³€μˆ˜λͺ…μ—μ„œλŠ” snake_caseλ₯Ό 많이 μ‚¬μš©ν•˜κ³ , ν΄λž˜μŠ€μ—μ„œλŠ” CamelCase둜 이름을 λΆ™μ΄λŠ” 것이 자리작고 μžˆλ‹€.

 

  πŸ“Œ '_'λŠ” λ¬΄μ—‡μΈκ°€μš”?

    -> '_'λŠ” νŒŒμ΄μ¬μ—μ„œ λͺ‡κ°€μ§€ κΈ°λŠ₯을 κ°€μ§€κ³  μžˆλ‹€.

      1. μΈν„°ν”„λ¦¬ν„°μ—μ„œμ˜ λ§ˆμ§€λ§‰ κ°’

 κ·Έλ¦Όκ³Ό 같이 3+3의 κ²°κ³Όλ₯Ό '_'둜 λ°›μ•„ 연산을 μ§„ν–‰ν•˜λŠ” 것을 μ•Œ 수 μžˆλ‹€.

 

 

      2. λ¬΄μ‹œν•˜λŠ” κ°’

 κ·Έλ¦Όκ³Ό 같이 listμ—μ„œ unpaking해쀄 λ•Œμ— 4λŠ” λ°›μ§€ μ•Šκ³  싀행이 κ°€λŠ₯ν•˜λ‹€. λ˜ν•œ '*'λ₯Ό ν™œμš©ν•΄ μ€‘κ°„μ˜ μ—¬λŸ¬ 값을 λ¬΄μ‹œν•  μˆ˜λ„ μžˆλ‹€.

ex) a, *_, e = tmp_list  -> a = 1, e = 5의 값이 μ €μž₯됨.

 

      3. 숫자의 자릿수 ꡬ뢄

κ·Έλ¦Όκ³Ό 같이 숫자의 자릿수λ₯Ό κ΅¬λΆ„ν•˜μ—¬ μ‚¬μš©μžλ‘œ ν•˜μ—¬κΈˆ 쑰금 보기 νŽΈν•˜κ²Œ μž‘μ„±ν•  수 μžˆλ‹€.

 

 

      4. '_' λ‘κ°œλ₯Ό μ‚¬μš©ν•œ 넀이밍

        - μ•žμ— '_'κ°€ 두 개 뢙은 경우: 맹글링(mangling)으둜 λ³€μˆ˜λ₯Ό privateν•˜κ²Œ λ§Œλ“€μ–΄ λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜κ²Œ ν•œλ‹€.

  μ½”λ“œλ₯Ό 보게되면 example 클래슀λ₯Ό λ§Œλ“€μ—ˆλ‹€. κ·ΈλŸ°ν›„ a와 __bλ₯Ό ν˜ΈμΆœν•΄ λ³΄μ•˜μ„ λ•Œ, __bλŠ” attributeμ—λŸ¬κ°€ λ‚˜λŠ” 것을 μ•Œ 수 μžˆλ‹€.

이 κ²½μš°μ— μ–΄λ–»κ²Œ ν˜ΈμΆœν•  수 μžˆμ„κΉŒ?

λŒ€λΆ€λΆ„ ν•¨μˆ˜λ₯Ό ν•˜λ‚˜ 더 λ§Œλ“€μ–΄ 값을 λ³€κ²½ν•˜μ§€ λͺ»ν•˜κ³  읽게만 λ§Œλ“€ 수 μžˆλ‹€.

 

 

        - μ•ž λ’€λ‘œ '_'κ°€ 두 개 뢙은 경우: νŒŒμ΄μ¬μ—μ„œ νŠΉλ³„ν•˜κ²Œ μ •μ˜ν•œ λ³€μˆ˜λ‚˜ ν•¨μˆ˜μ— μ‚¬μš©λœ 것.(__init__, __main__ λ“±) 맀직 λ©”μ†Œλ“œλΌκ³ λ„ λΆˆλ¦°λ‹€κ³  ν•œλ‹€.

 

 

  πŸ“Œ self λŠ” λ¬΄μ—‡μΈκ°€μš”?

  -> μƒμ„±λœ intance 자기 μžμ‹ μ„ κ°€λ¦¬ν‚€λŠ” 말둜 classλ₯Ό μ‚¬μš©ν•΄ instanceλ₯Ό μƒμ„œν•˜λ©΄ classλ‚΄λΆ€μ—μ„œλŠ” self둜, μ™ΈλΆ€μ—μ„œλŠ” instance 이름(생성될 λ‹Ήμ‹œ)으둜 λœλ‹€.

 

  πŸ”₯ 상속(Inheritance): λΆ€λͺ¨ ν΄λž˜μŠ€λ‘œλΆ€ν„° 속성과 행동을 λ¬Όλ €λ°›λŠ” μžμ‹ 클래슀λ₯Ό μƒμ„±ν•˜λŠ” 것. super()을 μ‚¬μš©ν•΄ 뢈러옴

            class A():     ->     class B(A):      BλŠ” Aλ₯Ό μƒμ†λ°›μ•˜λ‹€κ³  ν•˜κ³  Aλ₯Ό λΆ€λͺ¨ν΄λž˜μŠ€, Bλ₯Ό μžμ‹ν΄λž˜μŠ€λΌκ³  ν•œλ‹€.

 

  πŸ”₯ λ‹€ν˜•μ„±(Polymorphism): 같은 이름 λ©”μ†Œλ“œμ˜ λ‚΄λΆ€ 쑰직듀을 λ‹€λ₯΄κ²Œ μž‘μ„±ν•˜λŠ” 것.

 

  πŸ”₯ κ°€μ‹œμ„±(Visibility): 객체의 정보λ₯Ό λ³Ό 수 μžˆλŠ” 레벨둜 μ‘°μ ˆν•˜λŠ” κ²ƒμœΌλ‘œ 객체 μ•ˆμ˜ λ³€μˆ˜λ₯Ό μž„μ˜λ‘œ μˆ˜μ •, 접근을 μ œν•œν•˜λŠ” 것.

                             μΊ‘μŠν™”μ˜ κ°œλ…μ— 속할 수 있음. λ˜ν•œ 접근을 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€κ³  μ‹Άλ‹€λ©΄ λ°μ½”λ ˆμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ κ°€λŠ₯

 

  πŸ”₯ Decorateλ₯Ό μœ„ν•œ ν•™μŠ΅

      - Fist-Class Object(일등 ν•¨μˆ˜, 일급 객체): νŒŒμ΄μ¬μ—μ„œ ν•¨μˆ˜λ₯Ό κ°€λ₯΄ν‚€λ©° λ³€μˆ˜λ‚˜ 데이터 ꡬ쑰에 할당이 κ°€λŠ₯ν•œ 객체둜 parameter둜 전달이 κ°€λŠ₯ν•˜κ³  λ¦¬ν„΄κ°’μœΌλ‘œ μ‚¬μš© κ°€λŠ₯ν•œ 객체λ₯Ό λ§ν•œλ‹€.

            def square(x):

               return x*x

            f = square  -> ν•¨μˆ˜λ₯Ό λ³€μˆ˜λ‘œ μ‚¬μš©

 

      - inner function: ν•¨μˆ˜ 내에 또 λ‹€λ₯Έ ν•¨μˆ˜κ°€ 쑴재.

            def p_msg(m):

               def printer():

                   print(m)

               printer()   ->   p_msg호좜 μ‹œ λ‚΄λΆ€μ—μ„œ printerλ₯Ό λ‹€μ‹œ 호좜

 

      - Closures: inner function을 return κ°’μœΌλ‘œ λ°˜ν™˜.

            def p_msg(m):

               def printer():

                   print(m)

               return printer     ->   a = p_msg("a")λ₯Ό μ§€μ •ν–ˆλ‹€λ©΄ a()λ₯Ό ν• λ•Œ aλ₯Ό 좜λ ₯ν•œλ‹€.

 

  πŸ”₯ λ°μ½”λ ˆμ΄ν„°(Decorator)

      - ν•¨μˆ˜λ₯Ό λ°›μ•„ λͺ…령을 μΆ”κ°€ν•œ λ’€ 이λ₯Ό λ‹€μ‹œ ν•¨μˆ˜ ν˜•νƒœλ‘œ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ‘œ ν•¨μˆ˜ λ‚΄λΆ€λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³  κΈ°λŠ₯에 λ³€ν™”λ₯Ό μ£Όκ³  싢을 λ•Œ μ‚¬μš©ν•œλ‹€. 일반적으둜 ν•¨μˆ˜μ˜ μ „μ²˜λ¦¬λ‚˜ ν›„μ²˜λ¦¬μ— λŒ€ν•œ ν•„μš”κ°€ μžˆμ„ λ•Œ μ‚¬μš©ν•œλ‹€.

      - λ³΅μž‘ν•œ closureν•¨μˆ˜λ₯Ό κ°„λ‹¨ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€.

 

 

πŸ“ λͺ¨λ“ˆκ³Ό ν”„λ‘œμ νŠΈ(Module and Project)

  πŸ”₯ λͺ¨λ“ˆ(Module): μ–΄λ–€ λŒ€μƒμ˜ λΆ€λΆ„ ν˜Ήμ€ 쑰각을 λ§ν•˜λŠ” κ²ƒμœΌλ‘œ ν”„λ‘œκ·Έλž¨(λͺ¨λ“ˆ + λͺ¨λ“ˆ + ... = 큰 ν”„λ‘œκ·Έλž¨)

    - νŒ¨ν‚€μ§€(package): λͺ¨λ“ˆμ„ λͺ¨μ•„놓은 λ‹¨μœ„, ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨

    - 같은 폴더에 module에 ν•΄λ‹Ήν•˜λŠ” .py 파일과 μ‹€ν–‰ν•  .py νŒŒμΌμ„ μ €μž₯ν•œ ν›„ import 문을 μ‚¬μš©ν•΄ module 호좜

    - namespace: 호좜 μ‹œ λ²”μœ„λ₯Ό μ •ν•˜λŠ” λ°©λ²•μœΌλ‘œ fromκ³Ό importλ₯Ό μ‚¬μš©(λͺ¨λ“ˆμ—λŠ” ν•¨μˆ˜μ™€ 클래슀 등이 μ‘΄μž¬ν•  수 있음)

                       Alias 섀정이 κ°€λŠ₯ν•˜κ³  λͺ¨λ“ˆμ—μ„œ νŠΉμ • ν•¨μˆ˜ or ν΄λž˜μŠ€λ‚˜ λͺ¨λ“  ν•¨μˆ˜ or 클래슀λ₯Ό 호좜 ν•  수 μžˆλ‹€.

    - built-in module: python이 기본으둜 μ œκ³΅ν•˜λŠ” 라이브러리둜 문자 처리, μ›Ή, μˆ˜ν•™ λ“± 닀양함(ex. random, time λ“±)

 

  πŸ”₯ νŒ¨ν‚€μ§€(Package): ν•˜λ‚˜μ˜ λŒ€ν˜• ν”„λ‘œμ νŠΈλ₯Ό λ§Œλ“œλŠ” μ½”λ“œμ˜ 묢음으둜 λ‹€μ–‘ν•œ λͺ¨λ“ˆλ“€μ˜ ν•©, ν΄λ”λ‘œ μ—°κ²° 됨

                             __init__, __main__λ“± ν‚€μ›Œλ“œ 파일λͺ…이 μ‚¬μš©λ¨.

    - ν˜ΈμΆœλ°©λ²•: μƒλŒ€ μ°Έμ‘° - from .render import A      -> '.'은 ν˜„μž¬ μœ„μΉ˜λ₯Ό 말함

                    μ ˆλŒ€ μ°Έμ‘° - from game.graphic.render import A

                    λΆ€λͺ¨λ₯Ό ν†΅ν•œ μ°Έμ‘° - from ..sound.echo import B    -> '..' μƒμœ„ 폴더λ₯Ό 말함

    - Open sourceλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ install ν•˜λŠ” 방법이 있음

          -> Anaconda μ‚¬μš©μ‹œ conda install νŒ¨ν‚€μ§€λͺ…

    * ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰μ‹œ λ§Žμ€ 경우 κ°€μƒν™˜κ²½μ„ λ§Œλ“€μ–΄μ€Œ - 버전 차이, ν•„μš” νŒ¨ν‚€μ§€λ“±μ„ κ³ λ €ν•˜κΈ° μœ„ν•¨

          -> Anaconda κ°€μƒν™˜κ²½: conda create -n project_name python=3.8

 

'인곡지λŠ₯' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Day 6] Math for AI - 1. numpy  (0) 2021.01.25
[Day 5] Python  (2) 2021.01.22
[Day 3] Python  (0) 2021.01.20
[Day 2] Python  (0) 2021.01.19
[Day 1] Python  (0) 2021.01.18