Deep_Dev
article thumbnail

 

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

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

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

 

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

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

 

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

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

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

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

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

 

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

// μ’Œν‘œ
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)

 

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

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

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

 

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

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

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

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

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

 

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

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 λ©”μ„œλ“œμ— μ „λ‹¬λ˜λŠ” μ „λ‹¬μΈμžλŠ” ν”„λ‘œνΌν‹°κ°€ λ³€κ²½λ˜κΈ° μ „μ˜ κ°’

 

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

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

let myAccount = Account()
// μž”μ•‘μ΄ 0μ›μ—μ„œ 1000μ›μœΌλ‘œ 변경될 μ˜ˆμ •μž…λ‹ˆλ‹€.
myAccount.credit=1000
// μž”μ•‘μ΄ 0μ›μ—μ„œ 1000μ›μœΌλ‘œ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

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

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

 

 

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

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

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

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

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

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

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

 

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

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

 

 

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

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


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

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

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

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

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

 

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

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

 

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

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

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

 

 

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

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

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

 

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

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λŠ” νƒ€μž…μ„ 가리킨닀.