β­οΈμƒμ†πŸ§‘πŸ»β€πŸ’»

DEVJUNΒ·2022λ…„ 6μ›” 18일
0

Swift 문법

λͺ©λ‘ 보기
11/14
post-thumbnail

Β  μƒμ†μ΄λž€ 'ν•œ ν΄λž˜μŠ€κ°€ λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ μ •μ˜λœ ν”„λ‘œνΌν‹°λ‚˜ λ©”μ†Œλ“œλ₯Ό λ¬Όλ €λ°›μ•„ μ‚¬μš©ν•˜λŠ” 것' 이닀.

Β  상속을 ν•˜λ©΄ 이미 λ§Œλ“€μ–΄μ§„ λ‹€λ₯Έ 클래슀의 κΈ°λŠ₯μ΄λ‚˜ ν”„λ‘œνΌν‹°λ₯Ό 직접 κ΅¬ν˜„ν•˜μ§€ μ•Šκ³ λ„ μ‚¬μš©ν•  수 있고, μΆ”κ°€λ‘œ ν•„μš”ν•œ κΈ°λŠ₯μ΄λ‚˜ ν”„λ‘œνΌν‹°λ§Œ μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

  • ν”„λ‘œνΌν‹°μ™€ λ©”μ†Œλ“œλ₯Ό λ¬Όλ €μ€€ 클래슀 = λΆ€λͺ¨ν΄λž˜μŠ€ = μƒμœ„ν΄λž˜μŠ€ = 슈퍼클래슀 = 기본클래슀

  • ν”„λ‘œνΌν‹°μ™€ λ©”μ†Œλ“œλ₯Ό λ¬Όλ € 받은 클래슀 = μžμ‹ν΄λž˜μŠ€ = ν•˜μœ„ν΄λž˜μŠ€ = μ„œλΈŒν΄λž˜μŠ€ = νŒŒμƒν΄λž˜μŠ€
	class A {
    	var name = "Class A"
        
        var description: String {
        	return "This class name is \(self.name)"
        }
    	
        func foo() {
        	print("\(self.name)'s method foo is called")
        }    
    }
	
    
    // 클래슀 Aλ₯Ό 상속받아 μƒˆλ‘œμš΄ 클래슀 μ •μ˜: μ„œλΈŒν΄λž˜μ‹±μ΄λΌκ³  함
    class B: A {
    	var prop = "Class B"
        
        func boo() -> String {
        	return "Class B prop = \(self.prop)"
        }
    }
    
    let b =B()
    b.prop // "Class B"
    b.boo() // Class B prop = Class B
    
    b.name // "Class A"
    b.foo() // "Class A's method foo is called"
    
    b.name = "Class C"
    b.foo() // "Class C's method foo is called"

Β  μœ„ μ½”λ“œμ—μ„œ 클래슀 Bμ—λŠ” λΆ„λͺ… name ν”„λ‘œνΌν‹°μ™€ foo λ©”μ†Œλ“œκ°€ μ •μ˜λ˜μ–΄ μžˆμ§€ μ•ŠμŒμ—λ„ λΆˆκ΅¬ν•˜κ³ , μΈμŠ€ν„΄μŠ€ bλŠ” 이듀을 μ‚¬μš©ν•˜κ³  μžˆλ‹€. μ΄λŠ” 클래슀 Bκ°€ Aλ₯Ό 상속받아 λͺ¨λ“  ν”„λ‘œνΌν‹°μ™€ λ©”μ†Œλ“œλ₯Ό λ¬Όλ €λ°›μ•˜κΈ° λ•Œλ¬Έμ΄λ‹€.


μ˜€λ²„λΌμ΄λ”©πŸš² , Β  μ˜€λ²„λ‘œλ”© πŸš΄πŸΌβ€β™‚οΈ


Β  μ˜€λ²„λΌμ΄λ”©μ΄λž€ μžμ‹ ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 ν”„λ‘œνΌν‹°λ‚˜ λ©”μ†Œλ“œλ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜μ§€ μ•Šκ³  이λ₯Ό λ‹€μ‹œ μž¬μ •μ˜ν•˜λŠ” 것이닀.

Β  μ˜€λ²„λΌμ΄λ”©ν•œ λ‚΄μš©μ€ 자기 μžμ‹  λ˜λŠ” μžμ‹ μ„ μ„œλΈŒν΄λž˜μ‹±ν•œ ν•˜μœ„ ν΄λž˜μŠ€μ—λ§Œ μ μš©λœλ‹€. 즉 λΆ€λͺ¨ ν΄λž˜μŠ€μ—κΉŒμ§€λŠ” μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것이닀.

Β  μŠ€μœ„ν”„νŠΈμ—μ„œλŠ” μ˜€λ²„λΌμ΄λ”© ν•˜λ €λŠ” λ©”μ†Œλ“œλ‚˜ ν”„λ‘œνΌν‹°μ˜ μ„ μ–Έ μ•žμ— override ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ•Ό ν•œλ‹€. λ§Œμ•½ μ˜€λ²„λΌμ΄λ”©μ΄ μ•„λ‹˜μ—λ„ overrideλ₯Ό 뢙이면 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

Β  ν”„λ‘œνΌν‹°λ₯Ό μ˜€λ²„λΌμ΄λ”© ν•  λ•ŒλŠ” μƒμœ„ ν΄λž˜μŠ€μ—μ„œ μ €μž₯ ν”„λ‘œνΌν‹°μ˜€κ±΄, μ—°μ‚° ν”„λ‘œνΌν‹°μ˜€κ±΄ 관계없이 μ—°μ‚° ν”„λ‘œνΌν‹°μ˜ ν˜•νƒœλ‘œ μ˜€λ²„λΌμ΄λ”© ν•΄μ•Όν•œλ‹€.

Β  λ˜ν•œ get, set ꡬ문을 λͺ¨λ‘ μ œκ³΅ν•΄μ•Ό ν•œλ‹€. μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό 읽기 μ „μš© μ—°μ‚° ν”„λ‘œνΌν‹°λ‘œ μ˜€λ²„λΌμ΄λ”© ν•  μˆ˜λŠ” μ—†λ‹€.

	class Vehicle {
    	var currentSpeed = 0.0
        
        var description: String {
        	return "μ‹œκ°„λ‹Ή \(self.currentSpeed)의 μ†λ„λ‘œ μ΄λ™ν•˜κ³  μžˆλ‹€."
        }
        
        func makeNoise() {
        // 경적 κ΄€λ ¨ λ©”μ†Œλ“œ
        }
    }
    
    
    class Car: Vehicle {
    	var gear = 0
        var engineLevel = 0
        
        override var currentSpeed: Double {
        	get {
            	return Double(self.engineLevel * 50)
            }
            set {
            
            }
        }
        
        override var description: String {
        	get {
            	return "Car : engineLevel = \(self.engineLevel), so currentSpeed=\(self.currentSpeed)"
            }
            set {
            	print("New Value is \(newValue)")
            }      
        }
    }
    	
    let c = Car()
    c.engineLevel = 5
    c.currentSpeed // 250
    c.description = "New Class Car"
    
    print(c.desription)
    
    //μ‹€ν–‰ κ²°κ³Ό
    New Value is New Class Car
    Car: engineLevel=5, so currentSpeed=250.0
    

Β  μœ„ μ½”λ“œμ—μ„œ Vehicleμ΄λΌλŠ” 클래슀λ₯Ό Car ν΄λž˜μŠ€μ—μ„œ 상속받고 μžˆλ‹€. Vehicle 클래슀의 μ €μž₯ ν”„λ‘œνΌν‹°μΈ currentSpeedλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ μ—°μ‚° ν”„λ‘œνΌν‹°λ‘œ λ°”κΎΈκ³  있고, 읽기 μ „μš© ν”„λ‘œνΌν‹°μΈ description λ˜ν•œ μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ 읽고 μ“°κΈ°κ°€ λͺ¨λ‘ κ°€λŠ₯ν•œ ν”„λ‘œνΌν‹°λ‘œ λ°”κΏ”μ£Όκ³  μžˆλ‹€.

Β  상속받은 ν”„λ‘œνΌν‹°λ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜λŠ” κ³Όμ •μ—μ„œ μš°λ¦¬λŠ” ν•„μš”μ— 따라 ν”„λ‘œνΌν‹° μ˜΅μ €λ²„λ₯Ό 뢙일 수 μžˆλ‹€. λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ ν”„λ‘œνΌν‹°κ°€ μƒμˆ˜λ‘œ μ„ μ–Έλ˜μ—ˆκ±°λ‚˜ 읽기 μ „μš© ν”„λ‘œνΌν‹°λ‘œ μ„ μ–Έλ˜μ§€λ§Œ μ•Šμ•˜λ‹€λ©΄ ν”„λ‘œνΌν‹°λ₯Ό μ˜€λ²„λΌμ΄λ”©ν•  λ•Œ ν”„λ‘œνΌν‹° μ˜΅μ €λ²„ ꡬ문을 μΆ”κ°€ν•˜λ©΄ λœλ‹€.

class AutomaticCar: Car {
	override var currentSpeed: Double {
    	didSet {
        	self.gear = Int(currentSpeed / 10.0) + 1
        }
    }
}

Β  μžλ™ κΈ°μ–΄ μ°¨λŸ‰μ€ μ‚¬μš©μžκ°€ 직접 κΈ°μ–΄μˆ˜λ₯Ό μ‘°μ •ν•˜λŠ” λŒ€μ‹  ν˜„μž¬ 속도에 따라 μžλ™μœΌλ‘œ κΈ°μ–΄ λ‹¨μˆ˜κ°€ κ²°μ •λ˜μ–΄μ•Ό ν•œλ‹€. 이λ₯Ό μœ„ν•΄ ν˜„μž¬ 속도가 λ³€ν•  λ•Œ 그에 따라 κΈ°μ–΄ μˆ˜λ„ ν•¨κ»˜ 변경될 수 μžˆλ„λ‘ currentSpeed 속성에 didSet μ˜΅μ €λ²„λ₯Ό μΆ”κ°€ν•˜κ³  μžˆλ‹€.



Β  λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ˜€λ²„λΌμ΄λ”© λŒ€μƒμ΄ λ˜λŠ” λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜ κ°œμˆ˜λ‚˜ νƒ€μž…, 그리고 λ°˜ν™˜ νƒ€μž…μ€ λ³€κ²½ν•  수 없닀❗️

	class Bike: Vehicle {
    	override func makeNoise(){
        	print("빠라빠라빠라밀")
        }
    }
    
    let bk = Bike()
    bk.makeNoise()
    

Β  Bike ν΄λž˜μŠ€κ°€ Vehicle 클래슀λ₯Ό 상속받아 makeNoise λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©(μž¬μ •μ˜)ν•˜κ³ μžˆλ‹€. λ©”μ†Œλ“œμ˜ 경우 μ˜€λ²„λΌμ΄λ”©μ˜ μ œμ•½ 쑰건으둜 λ§€κ°œλ³€μˆ˜ νƒ€μž…μ΄λ‚˜ λ°˜ν™˜ νƒ€μž…μ„ κ·ΈλŒ€λ‘œ μœ μ§€ν•΄μ•Ό ν•˜λŠ” 것은 μŠ€μœ„ν”„νŠΈκ°€ λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”©(Overloading)을 μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

Β  μ˜€λ²„λ‘œλ”©μ΄λž€ 적재라고 ν•΄μ„λ˜λŠ”λ° 차곑차곑 μŒ“λŠ”λ‹€λŠ” 뜻으둜, ν•˜λ‚˜μ˜ λ©”μ†Œλ“œ μ΄λ¦„μœΌλ‘œ μ—¬λŸ¬κ°€μ§€ λ©”μ†Œλ“œλ₯Ό λ§Œλ“€μ–΄ μŒ“λŠ” 것이닀.

Β  같은 μ΄λ¦„μ˜ λ©”μ†Œλ“œλΌλ„ μ •μ˜λœ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ΄ λ‹€λ₯΄λ©΄ μ„œλ‘œ λ‹€λ₯Έ λ©”μ†Œλ“œλ₯Ό μ²˜λ¦¬ν•˜λŠ” 것이 μ˜€λ²„λ‘œλ”©μ΄λ‹€.

Β  λ”°λΌμ„œ 이름이 κ°™κ³  λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜κΉŒμ§€ μΌμΉ˜ν•˜λ”λΌλ„ νƒ€μž…μ΄ λ‹€λ₯΄λ©΄ μ„œλ‘œ λ‹€λ₯Έ λ©”μ†Œλ“œλ‘œ κ°„μ£Όν•œλ‹€. λ˜ν•œ λ§€κ°œλ³€μˆ˜λͺ…κΉŒμ§€ λ©”μ†Œλ“œμ˜ μ •μ˜μ— ν¬ν•¨λ˜λ―€λ‘œ λ§€κ°œλ³€μˆ˜μ˜ 개수, νƒ€μž…μ΄ λͺ¨λ‘ μΌμΉ˜ν•˜μ—¬λ„ λ§€κ°œλ³€μˆ˜λͺ…이 λ‹€λ₯΄λ©΄ μƒˆλ‘œμš΄ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•œ 것이 λœλ‹€.



	class HybridCar: Car {
    	// 아무것도 μΆ”κ°€ μ„ μ–Έν•˜μ§€ μ•ŠμŒ
    }
	
    class KickBoard: Vehicle {
    	// 아무것도 μΆ”κ°€ μ„ μ–Έν•˜μ§€ μ•ŠμŒ
    }
	
    
    let h = HybridCar()
    h.description
    // "Car : engineLevel=0 so currentSpeed=0.0"
    
    let k = KickBoard()
    k.description
    //"μ‹œκ°„λ‹Ή 0.0의 μ†λ„λ‘œ μ΄λ™ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€"

Β  μœ„ μ½”λ“œμ—μ„œ Car ν΄λž˜μŠ€μ™€ KickBoard ν΄λž˜μŠ€λŠ” Vehicle 클래슀λ₯Ό 상속 λ°›κ³  있고, HybridCar ν΄λž˜μŠ€λŠ” Car 클래슀λ₯Ό 상속 λ°›κ³  μžˆλ‹€. 즉 HybridCar 클래슀 KickBoard 클래슀 λͺ¨λ‘ μ΅œμ’…μ μΈ μƒμœ„ν΄λž˜μŠ€λŠ” Vehicle이닀. λ˜ν•œ λ‘˜ λͺ¨λ‘μ— description ν”„λ‘œνΌν‹°κ°€ κ³΅ν†΅μœΌλ‘œ μ‘΄μž¬ν•˜μ§€λ§Œ, ν”„λ‘œνΌν‹°κ°€ λ‹΄κ³  μžˆλŠ” 값은 λ‹€λ₯Έ 것을 μ•Œ 수 μžˆλ‹€.

Β  ν”„λ‘œνΌν‹°λ‚˜ λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜λ©΄ λ”λŠ” 본래의 κ°’μ΄λ‚˜ κΈ°λŠ₯을 μ‚¬μš©ν•  수 없을 것같이 λ³΄μ΄μ§€λ§Œ μŠ€μœ„ν”„νŠΈμ—μ„œλŠ” 상속받은 λΆ€λͺ¨ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλ„λ‘ ⭐️superβœ¨λΌλŠ” 객체λ₯Ό μ œκ³΅ν•˜μ—¬ 이 객체λ₯Ό μ΄μš©ν•˜μ—¬ 점 ꡬ문을 μ‚¬μš©ν•˜λ©΄ λΆ€λͺ¨ 클래슀의 ν”„λ‘œνΌν‹°λ‚˜ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€. μ˜€λ²„λΌμ΄λ”©μ€ ν˜„μž¬μ˜ μžμ‹  ν΄λž˜μŠ€λΆ€ν„° μ μš©λ˜λŠ” κ²ƒμ΄λ―€λ‘œ λΆ€λͺ¨ 클래슀의 ν”„λ‘œνΌν‹°λ‚˜ λ©”μ†Œλ“œμ—λŠ” 본래의 κ°’κ³Ό κΈ°λŠ₯이 κ·ΈλŒ€λ‘œ μ •μ˜λ˜μ–΄ μžˆλ‹€.

Β  예λ₯Ό λ“€μ–΄ someMethod()λΌλŠ” μ΄λ¦„μ˜ μ˜€λ²„λΌμ΄λ”©λœ λ©”μ†Œλ“œλŠ” λΆ€λͺ¨ 클래슀 λ ˆλ²¨μ—μ„œ μ •μ˜λœ someMethod()λ₯Ό super.someMethod()λΌλŠ” ν‘œν˜„μœΌλ‘œ ν˜ΈμΆœν•  수 μžˆλ‹€. λΆ€λͺ¨ 클래슀의 ν”„λ‘œνΌν‹°λ‚˜ λ©”μ†Œλ“œλ₯Ό μ°Έμ‘°ν•  λ•ŒλŠ” μžμ‹ μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό self객체λ₯Ό μ΄μš©ν•˜μ—¬ μ°Έμ‘°ν•˜λŠ” κ²ƒμ²˜λŸΌ self λŒ€μ‹  super객체λ₯Ό μ‚¬μš©ν•˜κΈ°λ§Œ ν•˜λ©΄λ˜λŠ” 것이닀.

Β  κ²½μš°μ— 따라 μ˜€λ²„λΌμ΄λ”©μ„ 막아야 ν•˜λŠ” κ²½μš°λ„ μžˆλ‹€. μŠ€μœ„ν”„νŠΈμ—μ„œλŠ” μƒμœ„ν΄λž˜μŠ€μ—μ„œ μ •μ˜ν•œ λ©”μ†Œλ“œλ‚˜ ν”„λ‘œνΌν‹°κ°€ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©λ˜λŠ” 것을 차단할 수 μžˆλ„λ‘ finalν‚€μ›Œλ“œλ₯Ό μ œκ³΅ν•œλ‹€. λ§Œμ•½ μ •μ˜ν•œ λ©”μ†Œλ“œλ‚˜ ν”„λ‘œνΌν‹°κ°€ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”© λ˜λŠ” 것을 μ›μΉ˜ μ•ŠλŠ”λ‹€λ©΄ ν”„λ‘œνΌν‹°λ‚˜ λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•˜λŠ” var, func λ“±μ˜ ν‚€μ›Œλ“œ μ•žμ— final ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ£Όλ©΄ λœλ‹€.

Β  λ˜ν•œ final ν‚€μ›Œλ“œλŠ” ν”„λ‘œνΌν‹° λ©”μ†Œλ“œ 뿐 μ•„λ‹ˆλΌ 클래슀 μžμ²΄μ—λ„ 뢙일 수 μžˆλŠ”λ° 이 경우 ν΄λž˜μŠ€λŠ” 상속 μžμ²΄κ°€ μ°¨λ‹¨λ˜μ–΄, μ–΄λ–€ ν΄λž˜μŠ€λ„ 이 클래슀λ₯Ό μ„œλΈŒν΄λž˜μ‹±ν•  수 μ—†κ²Œ λœλ‹€. πŸ”š πŸ”š πŸ”š

profile
πŸ§‘πŸ»β€πŸ’»iOS

0개의 λŒ“κΈ€