πŸ₯– Bread Basics/Swift

Obj-C 곡식 λ¬Έμ„œ 정리 - 객체, 클래슀, λ©”μ‹œμ§•

BreadDev 2025. 4. 11. 16:39
728x90

Objective-C 기초: 객체, 클래슀, λ©”μ‹œμ§• μ΄ν•΄ν•˜κΈ°

μ•ˆλ…•ν•˜μ„Έμš”! μ˜€λŠ˜μ€ Objective-C의 핡심 κ°œλ…μΈ 객체, 클래슀, λ©”μ‹œμ§•μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

πŸ“Œ λŸ°νƒ€μž„ μ‹œμŠ€ν…œ(Runtime System)

Objective-CλŠ” κ°€λŠ₯ν•œ λ§Žμ€ 결정을 컴파일 μ‹œκ°„μ΄λ‚˜ 링크 μ‹œκ°„μ΄ μ•„λ‹Œ λŸ°νƒ€μž„ μ‹œκ°„μœΌλ‘œ λ―Έλ£Ήλ‹ˆλ‹€. 객체 μƒμ„±μ΄λ‚˜ λ©”μ„œλ“œ 호좜과 같은 μž‘μ—…μ„ λ™μ μœΌλ‘œ μˆ˜ν–‰ν•˜λŠ” 것이 νŠΉμ§•μž…λ‹ˆλ‹€.

λŸ°νƒ€μž„(Runtime): ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆμ˜ ν™˜κ²½. Objective-Cμ—μ„œλŠ” λŸ°νƒ€μž„ μ‹œμŠ€ν…œμ΄ μ–Έμ–΄μ˜ 동적 νŠΉμ„±μ„ μ§€μ›ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ νŠΉμ„± λ•Œλ¬Έμ— Objective-CλŠ” 컴파일러뿐만 μ•„λ‹ˆλΌ 컴파일된 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ λŸ°νƒ€μž„ μ‹œμŠ€ν…œλ„ ν•„μš”ν•©λ‹ˆλ‹€. λŸ°νƒ€μž„ μ‹œμŠ€ν…œμ€ Objective-C μ–Έμ–΄μ˜ μΌμ’…μ˜ 운영체제 역할을 ν•©λ‹ˆλ‹€.

πŸ“Œ 객체(Objects)

객체의 κΈ°λ³Έ κ°œλ…

κ°μ²΄λŠ” 데이터와 κ·Έ 데이터λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ 영ν–₯을 쀄 수 μžˆλŠ” νŠΉμ • 연산을 μ—°κ²°ν•©λ‹ˆλ‹€. Objective-Cμ—μ„œ μ΄λŸ¬ν•œ 연산은 객체의 λ©”μ„œλ“œλΌκ³  ν•˜λ©°, 영ν–₯을 μ£ΌλŠ” λ°μ΄ν„°λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(λ‹€λ₯Έ ν™˜κ²½μ—μ„œλŠ” ivars λ˜λŠ” 멀버 λ³€μˆ˜λΌκ³ λ„ 함)μž…λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(Instance Variables): 객체 내뢀에 μ €μž₯된 λ°μ΄ν„°λ‘œ, 객체의 μƒνƒœλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
λ©”μ„œλ“œ(Methods): 객체가 μˆ˜ν–‰ν•  수 μžˆλŠ” λ™μž‘μ΄λ‚˜ κΈ°λŠ₯을 μ •μ˜ν•œ μ½”λ“œ λΈ”λ‘μž…λ‹ˆλ‹€.

본질적으둜, κ°μ²΄λŠ” 데이터 ꡬ쑰(μΈμŠ€ν„΄μŠ€ λ³€μˆ˜)와 ν”„λ‘œμ‹œμ € κ·Έλ£Ή(λ©”μ„œλ“œ)을 자체 ν¬ν•¨λœ ν”„λ‘œκ·Έλž˜λ° λ‹¨μœ„λ‘œ λ¬ΆμŠ΅λ‹ˆλ‹€.

id νƒ€μž…

Objective-Cμ—μ„œ 객체 μ‹λ³„μžλŠ” idλΌλŠ” κ³ μœ ν•œ 데이터 νƒ€μž…μž…λ‹ˆλ‹€. 이 νƒ€μž…μ€ ν΄λž˜μŠ€μ— 관계없이 λͺ¨λ“  μ’…λ₯˜μ˜ 객체에 λŒ€ν•œ 일반 νƒ€μž…μ΄λ©°, 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ 클래슀 객체 μžμ²΄μ— λͺ¨λ‘ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

id anObject;

id: ν΄λž˜μŠ€μ— 상관없이 λͺ¨λ“  객체λ₯Ό 가리킬 수 μžˆλŠ” 포인터 νƒ€μž…μž…λ‹ˆλ‹€.

ν‚€μ›Œλ“œ nil은 null 객체, 즉 값이 0인 id둜 μ •μ˜λ©λ‹ˆλ‹€.

동적 타이핑(Dynamic Typing)

id νƒ€μž…μ€ μ™„μ „νžˆ μ œν•œμ΄ μ—†μŠ΅λ‹ˆλ‹€. κ·Έ μžμ²΄λ‘œλŠ” 객체가 κ°μ²΄λΌλŠ” 사싀 μ™Έμ—λŠ” μ–΄λ–€ 정보도 μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨μ€ 일반적으둜 ν¬ν•¨ν•˜κ³  μžˆλŠ” 객체에 λŒ€ν•œ 더 ꡬ체적인 정보λ₯Ό μ•Œμ•„μ•Ό ν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€.

각 κ°μ²΄λŠ” isa μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό 톡해 μžμ‹ μ˜ 클래슀λ₯Ό μ‹λ³„ν•©λ‹ˆλ‹€. 같은 λ™μž‘(λ©”μ„œλ“œ)κ³Ό 같은 μ’…λ₯˜μ˜ 데이터(μΈμŠ€ν„΄μŠ€ λ³€μˆ˜)λ₯Ό κ°€μ§„ 객체듀은 같은 클래슀의 λ©€λ²„μž…λ‹ˆλ‹€.

isa 포인터: 객체가 μ–΄λ–€ ν΄λž˜μŠ€μ— μ†ν•˜λŠ”μ§€ λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.

κ°μ²΄λŠ” λŸ°νƒ€μž„μ— λ™μ μœΌλ‘œ νƒ€μž…μ΄ μ§€μ •λ©λ‹ˆλ‹€. λŸ°νƒ€μž„ μ‹œμŠ€ν…œμ€ ν•„μš”ν•  λ•Œλ§ˆλ‹€ 객체에 λ¬Όμ–΄λ΄„μœΌλ‘œμ¨ 객체가 μ†ν•œ μ •ν™•ν•œ 클래슀λ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ 관리

λͺ¨λ“  ν”„λ‘œκ·Έλž¨μ—μ„œ 객체가 더 이상 ν•„μš”ν•˜μ§€ μ•Šμ„ λ•Œ ν• λ‹Ή ν•΄μ œν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. Objective-CλŠ” λ‹€μŒκ³Ό 같은 μ„Έ κ°€μ§€ λ©”λͺ¨λ¦¬ 관리 λ©”μ»€λ‹ˆμ¦˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€:

  1. μžλ™ μ°Έμ‘° μΉ΄μš΄νŒ…(ARC): μ»΄νŒŒμΌλŸ¬κ°€ 객체의 수λͺ…을 μΆ”λ‘ ν•©λ‹ˆλ‹€.
  2. μˆ˜λ™ μ°Έμ‘° μΉ΄μš΄νŒ…(MRC): 객체의 수λͺ…을 κ²°μ •ν•˜λŠ” 것은 ꢁ극적으둜 개발자의 μ±…μž„μž…λ‹ˆλ‹€.
  3. κ°€λΉ„μ§€ μ»¬λ ‰μ…˜: 객체 수λͺ… κ²°μ •μ˜ μ±…μž„μ„ μžλ™ "컬렉터"μ—κ²Œ λ„˜κΉλ‹ˆλ‹€.

ARC(Automatic Reference Counting): μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ retain/release μ½”λ“œλ₯Ό μ‚½μž…ν•˜μ—¬ λ©”λͺ¨λ¦¬ 관리λ₯Ό λ„μ™€μ£ΌλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.

πŸ“Œ 객체 λ©”μ‹œμ§•(Object Messaging)

λ©”μ‹œμ§€ ꡬ문

객체가 무언가λ₯Ό ν•˜λ„λ‘ ν•˜λ €λ©΄ λ©”μ„œλ“œλ₯Ό μ μš©ν•˜λΌλŠ” λ©”μ‹œμ§€λ₯Ό λ³΄λƒ…λ‹ˆλ‹€. Objective-Cμ—μ„œ λ©”μ‹œμ§€ ν‘œν˜„μ‹μ€ λŒ€κ΄„ν˜Έλ‘œ λ¬Άμž…λ‹ˆλ‹€:

[receiver message]

μˆ˜μ‹ μžλŠ” 객체이고, λ©”μ‹œμ§€λŠ” 무엇을 ν•΄μ•Ό ν•˜λŠ”μ§€ μ•Œλ €μ€λ‹ˆλ‹€. μ†ŒμŠ€ μ½”λ“œμ—μ„œ λ©”μ‹œμ§€λŠ” λ‹¨μˆœνžˆ λ©”μ„œλ“œμ˜ 이름과 μ „λ‹¬λ˜λŠ” λ§€κ°œλ³€μˆ˜μž…λ‹ˆλ‹€.

[myRectangle display];

λ©”μ„œλ“œλŠ” λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ§ˆ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 단일 λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” λ©”μ‹œμ§€λŠ” 이름에 콜둠(:)을 뢙이고 콜둠 λ°”λ‘œ 뒀에 λ§€κ°œλ³€μˆ˜λ₯Ό λ„£μŠ΅λ‹ˆλ‹€:

[myRectangle setWidth:20.0];

μ—¬λŸ¬ λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” λ©”μ„œλ“œμ˜ 경우, Objective-C의 λ©”μ„œλ“œ 이름은 λ§€κ°œλ³€μˆ˜μ™€ ν•¨κ»˜ μΈν„°λ¦¬λΈŒλ©λ‹ˆλ‹€:

[myRectangle setOriginX:30.0 y:50.0];

μ…€λ ‰ν„°(Selector): λ©”μ‹œμ§€μ—μ„œ λ©”μ„œλ“œ 이름 λΆ€λΆ„μœΌλ‘œ, μ–΄λ–€ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν• μ§€ "선택"ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

nil에 λ©”μ‹œμ§€ 보내기

Objective-Cμ—μ„œλŠ” nil에 λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄λŠ” 것이 μœ νš¨ν•©λ‹ˆλ‹€. λŸ°νƒ€μž„μ—λŠ” 아무 νš¨κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€. nil에 보낸 λ©”μ‹œμ§€μ—μ„œ λ°˜ν™˜λ˜λŠ” 값도 μœ νš¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

  • λ©”μ„œλ“œκ°€ 객체λ₯Ό λ°˜ν™˜ν•˜λ©΄, nil에 보낸 λ©”μ‹œμ§€λŠ” 0(nil)을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • λ©”μ„œλ“œκ°€ 포인터 νƒ€μž…, μ •μˆ˜ 슀칼라, float, double 등을 λ°˜ν™˜ν•˜λ©΄, nil에 보낸 λ©”μ‹œμ§€λŠ” 0을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • λ©”μ„œλ“œκ°€ ꡬ쑰체λ₯Ό λ°˜ν™˜ν•˜λ©΄, nil에 보낸 λ©”μ‹œμ§€λŠ” λͺ¨λ“  ν•„λ“œμ— 0.0을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ‹€ν˜•μ„±(Polymorphism)

κ°μ²΄λŠ” μžμ‹ μ„ μœ„ν•΄ μ •μ˜λœ λ©”μ„œλ“œλ‘œλ§Œ μž‘λ™ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 두 κ°μ²΄λŠ” 같은 λ©”μ‹œμ§€μ— λ‹€λ₯΄κ²Œ 응닡할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€ν˜•μ„±(Polymorphism): 같은 λ©”μ‹œμ§€μ— λŒ€ν•΄ κ°μ²΄λ§ˆλ‹€ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ 응닡할 수 μžˆλŠ” λŠ₯λ ₯μž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, display λ©”μ‹œμ§€λ₯Ό λ°›λŠ” 각 μ’…λ₯˜μ˜ κ°μ²΄λŠ” κ³ μœ ν•œ λ°©μ‹μœΌλ‘œ μžμ‹ μ„ ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€. Circleκ³Ό Rectangle은 μ»€μ„œλ₯Ό μΆ”μ ν•˜λΌλŠ” λ™μΌν•œ μ§€μ‹œμ— λ‹€λ₯΄κ²Œ 응닡할 κ²ƒμž…λ‹ˆλ‹€.

동적 바인딩(Dynamic Binding)

ν•¨μˆ˜ 호좜과 λ©”μ‹œμ§€μ˜ μ€‘μš”ν•œ 차이점은 ν•¨μˆ˜μ™€ κ·Έ λ§€κ°œλ³€μˆ˜κ°€ 컴파일된 μ½”λ“œμ—μ„œ κ²°ν•©λ˜μ§€λ§Œ, λ©”μ‹œμ§€μ™€ μˆ˜μ‹  κ°μ²΄λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜κ³  λ©”μ‹œμ§€κ°€ 전솑될 λ•ŒκΉŒμ§€ κ²°ν•©λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

동적 바인딩(Dynamic Binding): λ©”μ‹œμ§€μ— 응닡할 λ©”μ„œλ“œκ°€ λŸ°νƒ€μž„μ— κ²°μ •λ˜λŠ” λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€.

λ©”μ‹œμ§€κ°€ μ „μ†‘λ˜λ©΄, λŸ°νƒ€μž„ λ©”μ‹œμ§• 루틴은 μˆ˜μ‹ μžμ™€ λ©”μ‹œμ§€μ—μ„œ μ§€μ •λœ λ©”μ„œλ“œλ₯Ό μ‚΄νŽ΄λ΄…λ‹ˆλ‹€. 이름과 μΌμΉ˜ν•˜λŠ” λ©”μ„œλ“œμ˜ μˆ˜μ‹ μž κ΅¬ν˜„μ„ μ°Ύμ•„ λ©”μ„œλ“œλ₯Ό "호좜"ν•˜κ³  μˆ˜μ‹ μžμ˜ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ— λŒ€ν•œ 포인터λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.

λ„νŠΈ ꡬ문(Dot Syntax)

Objective-CλŠ” μ ‘κ·Όμž λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•œ λŒ€μ•ˆμœΌλ‘œ 점(.) μ—°μ‚°μžλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€:

myInstance.value = 10;
printf("myInstance value: %d", myInstance.value);

객체와 ν•¨κ»˜ μ‚¬μš©ν•  λ•Œ, λ„νŠΈ ꡬ문은 "ꡬ문적 섀탕"으둜 μž‘μš©ν•©λ‹ˆλ‹€. μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μ ‘κ·Όμž λ©”μ„œλ“œ 호좜둜 λ³€ν™˜λ©λ‹ˆλ‹€:

[myInstance setValue:10];
printf("myInstance value: %d", [myInstance value]);

πŸ“Œ 클래슀(Classes)

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž¨μ€ 일반적으둜 λ‹€μ–‘ν•œ 객체둜 κ΅¬μ„±λ©λ‹ˆλ‹€. Objective-Cμ—μ„œλŠ” 클래슀λ₯Ό μ •μ˜ν•˜μ—¬ 객체λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

클래슀(Class): 객체의 μ’…λ₯˜μ— λŒ€ν•œ ν”„λ‘œν† νƒ€μž…. 클래슀의 λͺ¨λ“  멀버가 λ˜λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  클래슀의 λͺ¨λ“  객체가 μ‚¬μš©ν•  수 μžˆλŠ” λ©”μ„œλ“œ μ„ΈνŠΈλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

μ»΄νŒŒμΌλŸ¬λŠ” 각 ν΄λž˜μŠ€μ— λŒ€ν•΄ ν•˜λ‚˜μ˜ μ ‘κ·Ό κ°€λŠ₯ν•œ 객체, 즉 ν΄λž˜μŠ€μ— μ†ν•˜λŠ” μƒˆ 객체λ₯Ό λ§Œλ“œλŠ” 방법을 μ•„λŠ” 클래슀 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

상속(Inheritance)

클래슀 μ •μ˜λŠ” λˆ„μ λ©λ‹ˆλ‹€. μ •μ˜ν•˜λŠ” 각 μƒˆ ν΄λž˜μŠ€λŠ” λ©”μ„œλ“œμ™€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μƒμ†λ°›λŠ” λ‹€λ₯Έ 클래슀λ₯Ό 기반으둜 ν•©λ‹ˆλ‹€. μƒˆ ν΄λž˜μŠ€λŠ” λ‹¨μˆœνžˆ 상속받은 것에 μΆ”κ°€ν•˜κ±°λ‚˜ μˆ˜μ •ν•©λ‹ˆλ‹€.

상속(Inheritance): ν•˜μœ„ ν΄λž˜μŠ€κ°€ μƒμœ„ 클래슀의 속성과 λ©”μ„œλ“œλ₯Ό λ¬Όλ €λ°›λŠ” λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€.

상속은 단일 클래슀λ₯Ό 루트둜 ν•˜λŠ” 계측적 νŠΈλ¦¬μ— λͺ¨λ“  클래슀λ₯Ό μ—°κ²°ν•©λ‹ˆλ‹€. Foundation ν”„λ ˆμž„μ›Œν¬λ₯Ό 기반으둜 μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ, κ·Έ 루트 ν΄λž˜μŠ€λŠ” 일반적으둜 NSObjectμž…λ‹ˆλ‹€.

NSObject 클래슀

NSObjectλŠ” 루트 ν΄λž˜μŠ€μ΄λ―€λ‘œ μƒμœ„ ν΄λž˜μŠ€κ°€ μ—†μŠ΅λ‹ˆλ‹€. Objective-C 객체와 객체 μƒν˜Έ μž‘μš©μ˜ κΈ°λ³Έ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

NSObject: Objective-Cμ—μ„œ κ°€μž₯ 기본이 λ˜λŠ” 클래슀둜, λͺ¨λ“  객체의 곡톡 κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

NSObject ν΄λž˜μŠ€μ—μ„œ 상속받지 μ•Šμ•„λ„ λ˜λŠ” ν΄λž˜μŠ€λŠ” κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  NSObject 클래슀의 ν•˜μœ„ 클래슀둜 λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€. 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” μ΅œμ†Œν•œ λŸ°νƒ€μž„μ— Objective-C 객체처럼 λ™μž‘ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 상속

클래슀 객체가 μƒˆ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ, μƒˆ κ°μ²΄λŠ” ν΄λž˜μŠ€μ— λŒ€ν•΄ μ •μ˜λœ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λΏλ§Œ μ•„λ‹ˆλΌ μƒμœ„ ν΄λž˜μŠ€μ™€ μƒμœ„ 클래슀의 μƒμœ„ ν΄λž˜μŠ€μ— λŒ€ν•΄ μ •μ˜λœ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ„ ν¬ν•¨ν•©λ‹ˆλ‹€.

λ©”μ„œλ“œ 상속

κ°μ²΄λŠ” μžμ‹ μ˜ ν΄λž˜μŠ€μ— λŒ€ν•΄ μ •μ˜λœ λ©”μ„œλ“œλΏλ§Œ μ•„λ‹ˆλΌ μƒμœ„ 클래슀, 그리고 μƒμœ„ 클래슀의 μƒμœ„ 클래슀 λ“± 계측 ꡬ쑰의 λ£¨νŠΈκΉŒμ§€ μ •μ˜λœ λ©”μ„œλ“œμ—λ„ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

좔상 클래슀(Abstract Classes)

일뢀 ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ ν΄λž˜μŠ€κ°€ 상속받을 수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 좔상 ν΄λž˜μŠ€λŠ” μ—¬λŸ¬ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” λ©”μ„œλ“œμ™€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό 곡톡 μ •μ˜λ‘œ κ·Έλ£Ήν™”ν•©λ‹ˆλ‹€.

좔상 클래슀(Abstract Class): 직접 μΈμŠ€ν„΄μŠ€ν™”ν•˜μ§€ μ•Šκ³  주둜 λ‹€λ₯Έ ν΄λž˜μŠ€κ°€ 상속받기 μœ„ν•œ λͺ©μ μœΌλ‘œ μ„€κ³„λœ ν΄λž˜μŠ€μž…λ‹ˆλ‹€.

Cocoaμ—μ„œ NSObject ν΄λž˜μŠ€λŠ” 좔상 클래슀의 μ „ν˜•μ μΈ μ˜ˆμž…λ‹ˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ NSObject 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 직접 μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

πŸ“Œ 클래슀 객체(Class Objects)

클래슀 μ •μ˜μ—λŠ” λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ 정보가 ν¬ν•¨λ˜μ–΄ 있으며, λŒ€λΆ€λΆ„μ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ— κ΄€ν•œ κ²ƒμž…λ‹ˆλ‹€:

  • ν΄λž˜μŠ€μ™€ μƒμœ„ 클래슀의 이름
  • μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ„ΈνŠΈλ₯Ό μ„€λͺ…ν•˜λŠ” ν…œν”Œλ¦Ώ
  • λ©”μ„œλ“œ 이름과 λ°˜ν™˜ 및 λ§€κ°œλ³€μˆ˜ νƒ€μž… μ„ μ–Έ
  • λ©”μ„œλ“œ κ΅¬ν˜„

클래슀 객체(Class Object): λŸ°νƒ€μž„μ— 클래슀λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 객체둜, 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

μ»΄νŒŒμΌλŸ¬λŠ” 클래슀λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν•˜λ‚˜μ˜ 객체, 즉 클래슀 객체만 μƒμ„±ν•©λ‹ˆλ‹€. 클래슀 κ°μ²΄λŠ” ν΄λž˜μŠ€μ— λŒ€ν•œ λͺ¨λ“  정보에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€ 생성

클래슀 객체의 μ£Όμš” κΈ°λŠ₯은 μƒˆ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€:

id myRectangle;
myRectangle = [Rectangle alloc];

alloc λ©”μ„œλ“œλŠ” μƒˆ 객체의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ— λŒ€ν•œ λ©”λͺ¨λ¦¬λ₯Ό λ™μ μœΌλ‘œ ν• λ‹Ήν•˜κ³  λͺ¨λ‘ 0으둜 μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. 객체가 μœ μš©ν•˜λ €λ©΄ 일반적으둜 더 μ™„μ „νžˆ μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€:

myRectangle = [[Rectangle alloc] init];

alloc: 객체λ₯Ό μœ„ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.
init: 객체λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.

클래슀 객체 μ΄ˆκΈ°ν™”

클래슀 객체λ₯Ό μΈμŠ€ν„΄μŠ€ ν• λ‹Ή μ΄μ™Έμ˜ μš©λ„λ‘œ μ‚¬μš©ν•˜λ €λ©΄ μΈμŠ€ν„΄μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Objective-CλŠ” ν”„λ‘œκ·Έλž¨μ΄ 클래슀 객체λ₯Ό μ΄ˆκΈ°ν™”ν•  수 μžˆλŠ” 방법을 μ œκ³΅ν•©λ‹ˆλ‹€.

ν΄λž˜μŠ€κ°€ 정적 λ˜λŠ” μ „μ—­ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 경우, initialize λ©”μ„œλ“œλŠ” μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•˜κΈ°μ— 쒋은 μž₯μ†Œμž…λ‹ˆλ‹€.

initialize: ν΄λž˜μŠ€κ°€ 처음 μ‚¬μš©λ˜κΈ° 전에 ν˜ΈμΆœλ˜λŠ” 클래슀 λ©”μ„œλ“œλ‘œ, 클래슀의 μ΄ˆκΈ°ν™”λ₯Ό λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

μ†ŒμŠ€ μ½”λ“œμ—μ„œμ˜ 클래슀 이름

μ†ŒμŠ€ μ½”λ“œμ—μ„œ 클래슀 이름은 두 κ°€μ§€ 맀우 λ‹€λ₯Έ μ»¨ν…μŠ€νŠΈμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ»¨ν…μŠ€νŠΈλŠ” 데이터 νƒ€μž…μ΄μž κ°μ²΄λ‘œμ„œ 클래슀의 이쀑 역할을 λ°˜μ˜ν•©λ‹ˆλ‹€:

  1. 클래슀 이름은 객체의 νƒ€μž… μ΄λ¦„μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:
     
    Rectangle *anObject;
  2. λ©”μ‹œμ§€ ν‘œν˜„μ‹μ—μ„œ μˆ˜μ‹ μžλ‘œμ„œ 클래슀 이름은 클래슀 객체λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€:
     
    if ([anObject isKindOfClass:[Rectangle class]])
        ...

마무리

Objective-C의 객체, 클래슀, λ©”μ‹œμ§• μ‹œμŠ€ν…œμ€ μ–Έμ–΄μ˜ κ°•λ ₯함과 μœ μ—°μ„±μ„ μ œκ³΅ν•˜λŠ” 핡심 μš”μ†Œμž…λ‹ˆλ‹€.