Deep_Lee
article thumbnail

 

1. πŸ“–ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œ

ν”„λ‘œνΌν‹° : 클래슀, ꡬ쑰체 λ˜λŠ” μ—΄κ±°ν˜• 등에 κ΄€λ ¨λœ κ°’

λ©”μ„œλ“œ    : νŠΉμ • νƒ€μž…μ— κ΄€λ ¨λœ 힘수

 

2. πŸ“– ν”„λ‘œνΌν‹°

  1.  μ €μž₯ ν”„λ‘œνΌν‹° : μΈμŠ€ν„΄μŠ€μ˜ λ³€μˆ˜ λ˜λŠ” μƒμˆ˜
  2.  μ—°μ‚° ν”„λ‘œνΌν‹° : 값을 μ €μž₯ν•œ 것이 μ•„λ‹ˆλΌ νŠΉμ • 연산을 μ‹€ν–‰ν•œ κ²°κ³Όκ°’ ( 클래슀, ꡬ쑰체, μ—΄κ±°ν˜•μ— μ‚¬μš© )
  3.  νƒ€μž… ν”„λ‘œνŒŒν‹° : νŠΉμ • νƒ€μž…μ— μ‚¬μš©λ˜λŠ” ν”„λ‘œνΌν‹° ( 클래슀 λ³€μˆ˜ ) 
  4.  ν”„λ‘œνΌν‹° κ°μ‹œμž = ν”„λ‘œνΌν‹°μ˜ 값이 λ³€ν•˜λŠ” 것을 κ°μ‹œ ( 값이 λ³€ν•  λ•Œ κ°’μ˜ 변화에 λ”°λ₯Έ νŠΉμ • μž‘μ—… μ‹€ν–‰ )

 

2.0.1. πŸ“Œ μ €μž₯ ν”„λ‘œνΌν‹°

 ν΄λž˜μŠ€ λ˜λŠ” ꡬ쑰체의 μΈμŠ€ν„΄μŠ€μ™€ μ—°κ΄€λœ 값을 μ €μž₯ν•˜λŠ” κ°€μž₯ λ‹¨μˆœν•œ κ°œλ…μ˜ ν”„λ‘œνΌν‹°

 var λ₯Ό μ‚¬μš©ν•˜λ©΄ λ³€μˆ˜ μ €μž₯ ν”„λ‘œνΌν‹°

 let 을 μ‚¬μš©ν•˜λ©΄ μƒμˆ˜ μ €μž₯ ν”„λ‘œνΌν‹° 

 πŸŽ ꡬ쑰체와 클래슀의 μ €μž₯ ν”„λ‘œνΌν‹°
ꡬ쑰체의 μ €μž₯ ν”„λ‘œνΌν‹°κ°€ μ˜΅μ…”λ„μ΄ μ•„λ‹ˆλ”λΌλ„, κ΅¬μ‘°μ²΄λŠ” μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό λͺ¨λ‘ ν¬ν•¨ν•˜λŠ” μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•œλ‹€.
ν•˜μ§€λ§Œ 클래슀의 μ €μž₯ ν”„λ‘œνΌν‹°λŠ” μ˜΅μ…”λ„μ΄ μ•„λ‹ˆλΌλ©΄ ν”„λ‘œνΌν‹° 기본값을 μ§€μ •ν•΄μ£Όκ±°λ‚˜ μ‚¬μš©μž μ •μ˜ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 톡해 λ°˜λ“œμ‹œ μ΄ˆκΈ°ν™”ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. 또, 클래슀 μΈμŠ€ν„΄μŠ€μ˜ μƒμˆ˜ ν”„λ‘œνΌν‹°λŠ” μΈμŠ€ν„΄μŠ€κ°€ μ΄ˆκΈ°ν™”(μ΄λ‹ˆμ…œλΌμ΄μ¦ˆ)될 λ•Œ ν•œλ²ˆλ§Œ 값을 ν• λ‹Ή ν•  수 있으며, μžμ‹ν΄λž˜μŠ€μ—μ„œ 이 μ΄ˆκΈ°ν™”λ₯Ό λ³€κ²½(μž¬μ •μ˜)ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 

 

μ €μž₯ ν”„λ‘œνΌν‹°μ˜ μ„ μ–Έ 및 μΈμŠ€ν„΄μŠ€ 생성

<swift />
// μ’Œν‘œ struct CoordinatePoint{ var x: Int // μ €μž₯ ν”„λ‘œνΌν‹° var y: Int // μ €μž₯ ν”„λ‘œνΌν‹° } // κ΅¬μ‘°μ²΄μ—λŠ” 기본적으둜 μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ κ°–λŠ” μ΄λ‹ˆμ…œλΌμ΄μ €κ°€ μžˆμŠ΅λ‹ˆλ‹€. let yagomPoint: CoordinatePoint = CoordinatePoint(x: 10, y: 5) class Position{ var point: CoordinatePoint // μ €μž₯ ν”„λ‘œνΌν‹°(λ³€μˆ˜) - μœ„μΉ˜(point)λŠ” 변경될 수 μžˆμŒμ„ λœ»ν•œλ‹€. let name: String // μ €μž₯ ν”„λ‘œνΌν‹° (μƒμˆ˜) // ν”„λ‘œνΌν‹° 기본값을 μ§€μ •ν•΄μ£Όμ§€ μ•ŠλŠ”λ‹€λ©΄ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό λ”°λ‘œ μ •μ˜ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. init(name: String, currentPoint: CoordinatePoint){ self.name=name self.poin=currentPoint } } // μ‚¬μš©μž μ •μ˜ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό ν˜ΈμΆœν•΄μ•Όλ§Œ ν•œλ‹€. // κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ ν”„λ‘œνΌν‹° μ΄ˆκΈ°κ°’μ„ ν• λ‹Ήν•  수 μ—†κΈ° λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€ 생성이 λΆˆκ°€λŠ₯ν•˜λ‹€. let yagomPosition: Position = Position(name: "yagom", currentPoint: yagomPoint)

 

2.0.2. πŸ“Œ μ§€μ—° μ €μž₯ ν”„λ‘œνΌν‹°

 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ ν”„λ‘œνΌν‹°μ— 값이 ν•„μš” μ—†λ‹€λ©΄ ν”„λ‘œνΌν‹°λ₯Ό μ˜΅μ…”λ„λ‘œ μ„ μ–Έν•΄ 쀄 수 μžˆλ‹€. 그런데 κ·Έκ²ƒκ³ΌλŠ” 쑰금 λ‹€λ₯Έ μš©λ„λ‘œ ν•„μš”ν•  λ•Œ 값이 ν• λ‹Ήλ˜λŠ”κ²ƒμ΄ μ§€μ—°μ €μž₯ ν”„λ‘œνΌν‹°μ΄λ‹€. 

  • 호좜이 μžˆμ–΄μ•Ό 값을 μ΄ˆκΈ°ν™”ν•œλ‹€.
  • lazy ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. 
  • ν•„μš”ν• λ•Œ 값을 ν• λ‹Ήν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

 

2.0.3. πŸ“Œ μ—°μ‚° ν”„λ‘œνΌν‹°

 μ‹€μ œ 값을 μ €μž₯ν•˜λŠ” ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλΌ, νŠΉμ • μƒνƒœμ— λ”°λ₯Έ 값을 μ—°μ‚°ν•˜λŠ” ν”„λ‘œνΌν‹°μ΄λ‹€.

 μΈμŠ€ν„΄μŠ€ λ‚΄/μ™ΈλΆ€μ˜ 값을 μ—°μ‚°ν•˜μ—¬ μ μ ˆν•œ 값을 λŒλ €μ£ΌλŠ” μ ‘κ·Όμžμ˜ μ—­ν• μ΄λ‚˜ μ€λ‹‰ν™”λœ λ‚΄λΆ€μ˜ ν”„λ‘œνΌν‹° 값을 κ°„μ ‘μ μœΌλ‘œ μ„€μ •ν•˜λŠ” μ„€μ •μž   μ—­ν• λ„ ν•  수 μžˆλ‹€.

🍎 ꡳ이 λ©”μ„œλ“œλ₯Ό 두고 μ™œ μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν• κΉŒ?
μΈμŠ€ν„΄μŠ€ μ™ΈλΆ€μ—μ„œ λ©”μ„œλ“œλ₯Ό 톡해 μΈμŠ€ν„΄μŠ€ λ‚΄λΆ€ 값에 μ ‘κ·Όν•˜λ €λ©΄ λ©”μ„œλ“œλ₯Ό 두 개(μ ‘κ·Όμž, μ„€μ •μž) λͺ¨λ‘ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€. λ˜ν•œ 이λ₯Ό κ°μˆ˜ν•˜κ³  λ©”μ„œλ“œλ‘œ κ΅¬ν˜„ν•œλ‹€ ν•˜λ”λΌκ³  두 λ©”μ„œλ“œκ°€ λΆ„μ‚° κ΅¬ν˜„λ˜μ–΄ μ½”λ“œμ˜ 가독성이 λ‚˜λΉ μ§ˆ μœ„ν—˜μ΄ μžˆλ‹€. ν”„λ‘œνΌν‹°κ°€ λ©”μ„œλ“œ ν˜•μ‹λ³΄λ‹€ 훨씬 더 κ°„νŽΈν•˜κ³  직관적이닀.

λ‹€λ§Œ μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” μ ‘κ·ΌμžμΈ get λ©”μ„œλ“œλ§Œ κ΅¬ν˜„ν•΄λ‘” κ²ƒμ²˜λŸΌ 읽기 μ „μš© μƒνƒœλ‘œ κ΅¬ν˜„ν•˜κΈ° μ‰½μ§€λ§Œ, μ“°κΈ° μ „μš© μƒνƒœλ‘œ κ΅¬ν˜„ν•  수 μ—†λ‹€λŠ” 단점이 μžˆλ‹€. λ©”μ„œλ“œλ‘œλŠ” μ„€μ •μž λ©”μ„œλ“œλ§Œ κ΅¬ν˜„ν•˜μ—¬ μ“°κΈ° μ „μš© μƒνƒœλ‘œ κ΅¬ν˜„ν•  수 μžˆμ§€λ§Œ μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” λΆˆκ°€λŠ₯ν•˜λ‹€.

 

μ—°μ‚° ν”„λ‘œνΌν‹°μ˜ μ •μ˜μ™€ μ‚¬μš©

<swift />
struct CoordinatePoint{ var x: Int // μ €μž₯ ν”„λ‘œνΌν‹° var y: Int // μ €μž₯ ν”„λ‘œνΌν‹° // λŒ€μΉ­ μ’Œν‘œ var oppositePoint: CoordinatePoint { // μ—°μ‚° ν”„λ‘œνΌν‹° //μ ‘κ·Όμž get{ return CoordinatePoint(x: -x, y: -y) } // μ„€μ •μž set(opposite) { x = -opposite.x y = -opposite.y } } } var yagomPoint: CoordinatePoint = CoordinatePoint(x: 10, y:20) // ν˜„μž¬ μ’Œν‘œ print(yagomPosition) // 10, 20 // λŒ€μΉ­ μ’Œν‘œ print(yagomPosition.oppositePoint) // -10,-20 // λŒ€μΉ­ μ’Œν‘œλ₯Ό (15,10)으둜 μ„€μ •ν•œλ‹€λ©΄ yagomPosition.opppsitePoint = CoordinatePoint(x: 15, y:10) // ν˜„μž¬ μ’Œν‘œλŠ” -15, -10으둜 μ„€μ •λœλ‹€. print(yagomPosition) // -15, -10

 

πŸ“Œ ν”„λ‘œνΌν‹° κ°μ‹œμž
ν”„λ‘œνΌν‹°μ˜ 값이 변경됨에 따라 μ μ ˆν•œ μž‘μ—…μ„ μ·¨ν•  수 μžˆλ‹€.

ν”„λ‘œνΌν‹°μ˜ 값이 μƒˆλ‘œ 할당될 λ•Œλ§ˆλ‹€ ν˜ΈμΆœν•œλ‹€. 이 λ•Œ, λ³€κ²½λ˜λŠ” 값이 ν˜„μž¬μ˜ κ°’κ³Ό 같더라도 ν˜ΈμΆœν•œλ‹€.

  • willSet : ν”„λ‘œνΌν‹° 값이 λ³€κ²½λ˜κΈ° 직전에 호좜
  • didSet : ν”„λ‘œνΌν‹° 값이 λ³€κ²½λœ 직후에 호좜 

willSet λ©”μ„œλ“œμ™€ didSet λ©”μ„œλ“œμ—λŠ” λ§€κ°œλ³€μˆ˜κ°€ ν•˜λ‚˜μ”© μžˆλ‹€. 

willSet λ©”μ„œλ“œμ— μ „λ‹¬λ˜λŠ” μ „λ‹¬μΈμžλŠ” ν”„λ‘œνΌν‹°κ°€ 변경될 값이고, didSet λ©”μ„œλ“œμ— μ „λ‹¬λ˜λŠ” μ „λ‹¬μΈμžλŠ” ν”„λ‘œνΌν‹°κ°€ λ³€κ²½λ˜κΈ° μ „μ˜ κ°’

 

ν”„λ‘œνΌν‹° κ°μ‹œμž

<swift />
class Account { var credit: Int = 0 willSet { print("μž”μ•‘μ΄ \(credit)μ›μ—μ„œ \(newValue)μ›μœΌλ‘œ 변경될 μ˜ˆμ •μž…λ‹ˆλ‹€.") } didSet { print("μž”μ•‘μ΄ \(oldValue)μ›μ—μ„œ \(credit)μ›μœΌλ‘œ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.") } } } let myAccount = Account() // μž”μ•‘μ΄ 0μ›μ—μ„œ 1000μ›μœΌλ‘œ 변경될 μ˜ˆμ •μž…λ‹ˆλ‹€. myAccount.credit=1000 // μž”μ•‘μ΄ 0μ›μ—μ„œ 1000μ›μœΌλ‘œ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

πŸ’‘μ „μ—­λ³€μˆ˜μ™€ μ§€μ—­λ³€μˆ˜

μ €μž₯λ³€μˆ˜ : 값을 μ €μž₯ν•˜λŠ” μ—­ν•  ( μ „μ—­λ³€μˆ˜, μ§€μ—­λ³€μˆ˜ )

 

 

2.0.4. πŸ“Œ νƒ€μž… ν”„λ‘œνΌν‹°

νƒ€μž… ν”„λ‘œνŒŒν‹° : 각각의 μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ νƒ€μž… μžμ²΄μ— μ†ν•˜λŠ” ν”„λ‘œνΌν‹°

  • νƒ€μž… μžμ²΄μ— 영ν–₯을 λ―ΈμΉ˜λŠ” ν”„λ‘œνΌν‹°
  • μΈμŠ€ν„΄μŠ€μ˜ 생성 여뢀와 상관없이 νƒ€μž… ν”„λ‘œνΌν‹°μ˜ 값은 ν•˜λ‚˜λ©°, κ·Έ νƒ€μž…μ˜ λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” κ°’
  • λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ—μ„œ 곡용으둜 μ ‘κ·Όν•˜κ³  값을 λ³€κ²½ν•  수 μžˆλŠ” λ³€μˆ˜ 등을 μ •μ˜ν•  λ•Œ 유용

1. μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹°

  • λ³€μˆ˜ λ˜λŠ” μƒμˆ˜λ‘œ μ„ μ–Έ
  • λ°˜λ“œμ‹œ μ΄ˆκΈ°κ°’ μ„€μ •ν•΄μ•Όν•˜λ©° μ§€μ—° μ—°μ‚° λœλ‹€.
  • lazy ν‚€μ›Œλ“œ μ‚¬μš© X

2. μ—°μ‚° νƒ€μž… ν”„λ‘œνΌν‹°

  • λ³€μˆ˜λ‘œλ§Œ μ„ μ–Έ  

 

νƒ€μž… ν”„λ‘œνΌν‹°μ™€ μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°

<swift />
class AClass{ // μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹° static var typeProperty: Int = 0 // μ €μž₯ μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹° var instanceProperty: Int = 0 { didSet{ // Self.typePropertyλŠ” AClass.typeProperty와 같은 ν‘œν˜„ Self.typeProperty = instanceProperty + 100 } } // μ—°μ‚° νƒ€μž… ν”„λ‘œνΌν‹° static var typeComputedProperty: Int{ get { return typeProperty } set { typeProperty = new Value } } } AClass.typeProperty = 123 let classInstance: AClass = AClass() classInstance.instanceProperty = 100 print(AClass.typeProperty) // 200 print(AClass.typeComputedProperty) // 200

 

 

3. πŸ“– λ©”μ„œλ“œ

νŠΉμ • νƒ€μž…μ— κ΄€λ ¨λœ ν•¨μˆ˜

3.0.1. πŸ“Œ  μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ

νŠΉμ • νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€μ— μ†ν•œ ν•¨μˆ˜

  • μΈμŠ€ν„΄μŠ€ λ‚΄λΆ€μ˜ ν”„λ‘œνΌν‹° 값을 λ³€κ²½ν•˜κ±°λ‚˜ νŠΉμ • μ—°μ‚° κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λŠ” λ“± μΈμŠ€ν„΄μŠ€μ™€ κ΄€λ ¨λœ κΈ°λŠ₯ μ‹€ν–‰
  • ν•¨μˆ˜μ™€ 문법이 κ°™μ§€λ§Œ, ν•¨μˆ˜μ™€ 달리 νŠΉμ • νƒ€μž… 내뢀에 κ΅¬ν˜„ν•œλ‹€. λ”°λΌμ„œ μΈμŠ€ν„΄μŠ€κ°€ μ‘΄μž¬ν•  λ•Œλ§Œ μ‚¬μš©κ°€λŠ₯
  • κ΅¬μ‘°μ²΄λ‚˜ μ—΄κ±°ν˜• 등은 κ°’ νƒ€μž…μ΄λ―€λ‘œ λ©”μ„œλ“œ μ•žμ— mutating ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ„œ ν•΄λ‹Ή λ©”μ„œλ“œκ°€ μΈμŠ€ν„΄μŠ€ λ‚΄λΆ€μ˜ 값을 λ³€κ²½ν•œλ‹€.

πŸ’‘ self ν”„λ‘œνΌν‹°

  • λͺ¨λ“  μΈμŠ€ν„΄μŠ€λŠ” μ•”μ‹œμ μœΌλ‘œ μƒμ„±λœ self ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ”λ‹€. μžλ°”μ˜ this와 λΉ„μŠ·ν•˜λ‹€.
  • self ν”„λ‘œνΌν‹°λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 더 λͺ…ν™•νžˆ μ§€μΉ­ν•˜κ³  μ‹Άμ„λ•Œ μ‚¬μš©ν•œλ‹€.
  • κ°’ νƒ€μž… μΈμŠ€ν„΄μŠ€ 자체의 값을 μΉ˜ν™˜ν•  수 μžˆλ‹€.

 

selfν”„λ‘œνΌν‹°μ˜ μ‚¬μš©

<swift />
class LevelClass{ var level: Int = 0 func jumpLevel(to level: Int){ print("Jump to \(level)") self.level = level } }

 

πŸ’‘ μΈμŠ€ν„΄μŠ€λ₯Ό ν•¨μˆ˜μ²˜λŸΌ ν˜ΈμΆœν•˜λ„λ‘ ν•˜λŠ” λ©”μ„œλ“œ

callAsFunction μ΄λΌλŠ” μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜λ©΄ λœλ‹€. 

λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜ νƒ€μž…λ§Œ λ‹€λ₯΄λ‹€λ©΄ κ°œμˆ˜μ— μ œν•œ 없이 μ›ν•˜λŠ” 만큼 λ§Œλ“€ 수 있고, mutating, throws, rethrows도 ν•¨κ»˜ μ‚¬μš© κ°€λŠ₯

 

 

3.0.2. πŸ“Œ νƒ€μž… λ©”μ„œλ“œ

νƒ€μž… μžμ²΄μ— 호좜이 κ°€λŠ₯ν•œ λ©”μ„œλ“œ ( ν”νžˆ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ§€μΉ­ν•˜λŠ” 클래슀 λ©”μ„œλ“œμ™€ μœ μ‚¬ )

  • static ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. 
  • 클래슀의 νƒ€μž… λ©”μ„œλ“œλŠ” static ν‚€μ›Œλ“œμ™€ class ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ”λ°, static으둜 μ •μ˜ν•˜λ©΄ 상속 ν›„ λ©”μ„œλ“œ μž¬μ •μ˜κ°€ λΆˆκ°€λŠ₯ν•˜κ³  class둜 μ •μ˜ν•˜λ©΄ 상속 ν›„ λ©”μ„œλ“œ μž¬μ •μ˜κ°€ κ°€λŠ₯ν•˜λ‹€.

 

클래슀의 νƒ€μž… λ©”μ„œλ“œ

<swift />
class AClass{ static func staticTypeMethod() { print("AClass staticTypeMethod") } class func classTypeMethod() { print("AClass classTypeMethod") } } class BClass : AClass { /* // 였λ₯˜ λ°œμƒ! μž¬μ •μ˜ λΆˆκ°€! override static func staticTypeMethod(){ } */ override class func classTypeMethod() { print("BClass class Method") } } AClass.staticTypeMethod() // AClass staticTypeMethod AClass.classTypeMethod() // AClass classTypeMethod BClass.classTypeMethod() // BClass classTypeMethod

 

μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ—μ„œλŠ” selfκ°€ μΈμŠ€ν„΄μŠ€λ₯Ό 가리킨닀면

νƒ€μž… λ©”μ„œλ“œμ˜ selfλŠ” νƒ€μž…μ„ 가리킨닀.