🐍 [Python] α„€α…’α†¨α„Žα…¦(Object) α„‹α…΅α„’α…’α„’α…‘α„€α…΅

λ“€μ–΄κ°€λ©°

ν΄λž˜μŠ€μ™€ 객체의 κ°œλ…

1. Class λΌλŠ” 것은 μƒˆλ‘œμš΄ 데이터 νƒ€μž…μ΄λ‹€

μ‚¬μš©μžκ°€ μ •μ˜ν•œ 데이터 νƒ€μž…μœΌλ‘œ λ³€μˆ˜λ₯Ό μ„ ν—Œ ν›„, new μ—°μ‚°μž, μƒμ„±μžλ₯Ό μ΄μš©ν•΄ λ©”λͺ¨λ¦¬λ₯Ό λ§Œλ“ λ‹€. (λ©”λͺ¨λ¦¬μ˜ 생성: 데이터 νƒ€μž…μ— ν•΄λ‹Ήν•˜λŠ” 만큼의 λ©”λͺ¨λ¦¬λ₯Ό ν™•λ³΄ν•˜λŠ” 일)

2. μƒˆλ‘œμš΄ 클래슀λ₯Ό ν•˜λ‚˜ λ§Œλ“œλŠ” 것

μƒˆλ‘œμš΄ 클래슀λ₯Ό ν•˜λ‚˜ λ§Œλ“œλŠ” 것은 λ‹€μŒκ³Ό 같은 말둜 λŒ€μΉ˜κ°€ κ°€λŠ₯ν•˜λ‹€.

  1. μƒˆλ‘œμš΄ 데이터 νƒ€μž…μ„ λ§Œλ“œλŠ” 것

  2. 이 νƒ€μž…μœΌλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έ/ν™œμš© ν•  수 μžˆλ‹€.

    μ΄λ•Œ 클래슀λ₯Ό μ΄μš©ν•œ λ³€μˆ˜λ₯Ό 객체 λ˜λŠ” 객체 λ³€μˆ˜λΌκ³  ν•œλ‹€. (단, 객체, 객체 λ³€μˆ˜λŠ” κΈ°λ³Έ 데이터 λ³€μˆ˜μ™€ λ‹€λ₯΄λ‹€. 객체 λ³€μˆ˜ μ„ μ–Έ ν›„ λ©”λͺ¨λ¦¬λ₯Ό μƒμ„±ν•΄μ€˜μ•Ό μ™„μ „ν•œ 객체가 λœλ‹€.)

Top t = new Top();


λ©”λͺ¨λ¦¬ 생성

μžλ°” μ–Έμ–΄μ—μ„œλŠ” μ£Όμ†Œλ₯Ό λ°”λ‘œ 주지 μ•ŠλŠ”λ‹€.

클래슀둜 λ§Œλ“  데이터 νƒ€μž…μœΌλ‘œ λ³€μˆ˜μ™€ λ©”λͺ¨λ¦¬λ₯Ό 생성 햇을 λ•Œ μ£Όμ†Œλ₯Ό μ°Ύμ•„λ³΄κΈ°λŠ” νž˜λ“€λ‹€. μžλ°”μ—μ„œλŠ” 객체의 μ£Όμ†Œ λŒ€μ‹  μ°Έμ‘°κ°’μ΄λΌλŠ” 것을 ν• λ‹Ή λ°›κ²Œ λœλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μžλ°”μ—μ„œλŠ” 객체 λ³€μˆ˜(Reference Variable)λ₯Ό μ°Έμ‘° λ³€μˆ˜λΌκ³  λ§ν•œλ‹€.

// 1. 클래슀 μ„ μ–Έ
public class Sun{
  public int distance;
  public int data;
}

// 2. 객체 λ³€μˆ˜ μ„ μ–Έ: λ©”λͺ¨λ¦¬ μƒμ„±μ „μ΄λ―€λ‘œ μ΄ˆκΈ°ν™”
Sun s1 = null;
Sun s2 = null;

// 3. 객체 λ³€μˆ˜μ— λŒ€ν•œ λ©”λͺ¨λ¦¬ 생성
s1 = new Sun();
s2 = new Sun();

μœ„μ™€ 같이 λ©”λͺ¨λ¦¬κ°€ μƒμ„±λ˜λ©΄ λ‚΄λΆ€μ˜ 인덱슀 ν…Œμ΄λΈ”μ—μ„œ μ£Όμ†Œ 맀핑 ν›„ 참쑰값을 λ§Œλ“€κ³  참쑰값은 μ°Έμ‘° λ³€μˆ˜ s1, s2 에 ν• λ‹Ή λ©λ‹ˆλ‹€.

μ°Έμ‘°λ³€μˆ˜μ˜ νŠΉμ§•

**μ°Έμ‘° 횟수 계산 방식 **(reference counting)

μ°Έμ‘° 횟수 계산 방식(reference counting)은 λ©”λͺ¨λ¦¬λ₯Ό μ œμ–΄ν•˜λŠ” 방법 쀑 ν•˜λ‚˜λ‘œ, μ“°λ ˆκΈ° μˆ˜μ§‘μ˜ ν•œ 방식이닀. ꡬ성 방식은 λ‹¨μˆœν•˜λ‹€. μ–΄λ–€ ν•œ 동적 λ‹¨μœ„(객체, Object)κ°€ 참쑰값을 가지고 이 λ‹¨μœ„ 객체가 μ°Έμ‘°(μ°Έμ‘° 볡사)되면 참쑰값을 늘리고 μ°Έμ‘°ν•œ λ‹€μŒ 더이상 μ‚¬μš©ν•˜μ§€ μ•Šκ²Œ 되면 참쑰값을 쀄이면 λœλ‹€. 보톡 참쑰값이 0이 되면 더이상 μœ νš¨ν•œ λ‹¨μœ„ 객체둜 보지 μ•Šμ•„ λ©”λͺ¨λ¦¬μ—μ„œ μ œκ±°ν•œλ‹€.

좜처: μ°Έμ‘° 횟수 계산 방식 - μœ„ν‚€λ°±κ³Ό, 우리 λͺ¨λ‘μ˜ 백과사전

사전적 μ„€λͺ… 보닀 μ‰½κ²Œ μ„€λͺ… ν•˜λ©΄ 가비지 μ½œλ ‰μ…˜(Garbage Collection)μ΄λž€ λ©”λͺ¨λ¦¬ 관리 방법 쀑 ν•˜λ‚˜λ‘œ, ν”„λ‘œκ·Έλž˜λ¨Έκ°€ λ™μ μœΌλ‘œ ν• λ‹Ήν•œ λ©”λͺ¨λ¦¬ μ˜μ—­ 쀑 더 이상 쓰이지 μ•ŠλŠ” μ˜μ—­μ„ μžλ™μœΌλ‘œ μ°Ύμ•„λ‚΄μ–΄ ν•΄μ œν•˜λŠ” κΈ°λŠ₯이닀.

μ°Έμ‘° 횟수 계산 방법은 μ΄λŸ¬ν•œ 가비지 μ½œλ ‰μ…˜μ˜ ν•œ 가지 λ°©μ‹μœΌλ‘œ μ–΄λ–€ 객체가 참쑰값을 가지며, 객체가 참쑰되면 참쑰값을 늘리고, 더 이상 μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ 참쑰값을 μ€„μž…λ‹ˆλ‹€. 보톡 참쑰값이 0이 되면 더 이상 μœ νš¨ν•œ 객체둜 κ°„μ£Όν•˜μ§€ μ•Šμ•„ λ©”λͺ¨λ¦¬μ—μ„œ μ œκ±°ν•˜κ²Œ λ©λ‹ˆλ‹€.

Call by reference vs. Call by Value

νŒŒμ΄μ¬μ—μ„œλŠ” 객체의 μ’…λ₯˜μ— λ‹€λΌμ„œ Call by reference λ˜λŠ” Call by Valueκ°€ κ²°μ • λ©λ‹ˆλ‹€. str, int κ³Ό 같은 λΆˆλ³€ 객체 일 경우 call by value에 μ˜ν•΄μ„œ 관리 되고, list', dict κ³Ό 같은 변이 κ°μ²΄μ—μ„œλŠ” object referece둜 관리 λ©λ‹ˆλ‹€.



파이썬의 객체 ꡬ쑰

νŒŒμ΄μ¬μ€ 정적이 μ•„λ‹Œ 동적 νƒ€μž…μ΄λ‹€.

이것은 ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ, μΈν„°ν”„λ¦¬ν„°λŠ” μ •μ˜λœ λ³€μˆ˜μ˜ μœ ν˜•μ„ μ•Œκ³  μžˆμ§€ μ•Šλ‹€λŠ”κ²ƒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. Cλ³€μˆ˜μ™€ 파이썬 λ³€μˆ˜μ˜ μ°¨μ΄λŠ” μ•„λž˜ 그림으둜 μš”μ•½ λ©λ‹ˆλ‹€. C μ–Έμ–΄ λ³€μˆ˜μ˜ 경우, μ»΄νŒŒμΌλŸ¬λŠ” 단지 κ·Έ μ •μ˜λ§ŒμœΌλ‘œλ„ λ³€μˆ˜μ˜ μœ ν˜•μ„ μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, νŒŒμ΄μ¬μ—μ„œλŠ” λ³€μˆ˜λ₯Ό μ„ μ–Έ ν•  λ•Œ μ–΄λ– ν•œ λ³€μˆ˜ νƒ€μž…μΈμ§€ λͺ…μ‹œν•˜μ§€ μ•Šκ³  λ˜ν•œ λ³€μˆ˜μ—λŠ” λ‹€μ–‘ν•œ μžλ£Œν˜•μ„ ν• λ‹Ή ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ’€μ—μ„œ μ„€λͺ…ν•˜κ² μ§€λ§Œ μ΄λŸ¬ν•œ 동적 타이핑이 κ°€λŠ₯ν•œ μ΄μœ λŠ” νŒŒμ΄μ¬μ—μ„œμ˜ λ³€μˆ˜ 할당을 객체λ₯Ό 톡해 이루어지기 λ•Œλ¬Έμž…λ‹ˆλ‹€. (λ³€μˆ˜μ— 값을 ν• λ‹Ήν•œλ‹€λŠ” ν‘œν˜„ λ³΄λ‹€λŠ” 객체에 λ³€μˆ˜ 이름을 라벨링(Labeling)ν•œλ‹€λŠ” ν‘œν˜„μ΄ 더 μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ ν‘œν˜„ μž…λ‹ˆλ‹€. )

1*vrwoH-6VhOUJ2bcGwbGWZw

C μ»΄νŒŒμΌλŸ¬λŠ” μ‹œμž‘ν•  λ•ŒλΆ€ν„° a와 bλŠ” μ •μˆ˜ν˜•μ΄λΌλŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ, λ‹¨μˆœν•œ 어떀것도 ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μ •μˆ˜ν˜•μ„ μ•„λŠ”κ²ƒμœΌλ‘œλŠ” λ©”λͺ¨λ¦¬ μƒμ˜ λ‹¨μˆœν•œ 값에 두 개의 μ •μˆ˜λ₯Ό λ”ν•˜κ³ , 이λ₯Ό λ‹€λ₯Έ μ •μˆ˜λ‘œ λ°˜ν™˜ν•˜λŠ” 루틴을 ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. 개랡적인 λ„μ‹μœΌλ‘œ λ‚˜νƒ€λ‚΄λ©΄ 이벀트의 μˆœμ„œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

C λ§μ…ˆ

Cμ—μ„œ λ‹€μŒμ„ μž‘μ„±ν•˜λŠ” 경우:

/* C code */ 
int a = 1; 
int b = 2; 
int c = a + b;


계산과정:

  1. 1을 a에 ν• λ‹Ή
  2. 2을 b에 ν• λ‹Ή
  3. binary_add<int, int>(a,b) 호좜
  4. κ²°κ³Όλ₯Ό c에 ν• λ‹Ή


Python λ§μ…ˆ

νŒŒμ΄μ¬μ—μ„œμ˜ 같은 μ—­ν• μ˜ μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

# python code
a = 1
b = 2
c = a + b


계산과정:

  1. a 에 1을 ν• λ‹Ή
    1. a -> PyObject_HEAD -> typecode μ •μˆ˜ μ„€μ •
    2. a -> val=1 μ„€μ •
  2. b에 2λ₯Ό ν• λ‹Ή
    1. b-> PyObject_HEAD -> typecode μ •μˆ˜ μ„€μ •
    2. b -> val=2 μ„€μ •
  3. binary_add(a,b) 호좜
    1. a->PyObject_HEAD μ—μ„œ typecode μ°ΎκΈ°
    2. aλŠ” μ •μˆ˜ν˜•; κ°’ a->val
    3. b->PyObject_HEAD μ—μ„œ typecode μ°ΎκΈ°
    4. bλŠ” μ •μˆ˜ν˜•; κ°’ b->val
    5. binary_add<int, int>(a->val, b->val) 호좜
    6. μ •μˆ˜ν˜• κ²°κ³Όκ°’ result
  4. 파이썬 개체 c 생성
    1. c->PyObject_HEAD->typecode μ •μˆ˜ μ„€μ •
    2. c->val에 result μ„€μ •

동적 타이핑은 정적 타이핑에 λΉ„ν•΄ 더 λ§Žμ€ 단계λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 이유 λ•Œλ¬Έμ— 파이썬이 C보닀 느린 μ΄μœ μ΄κΈ°λ„ ν•©λ‹ˆλ‹€.