πŸ”₯πŸ§‘πŸ»β€πŸ’»ν•¨μˆ˜1

DEVJUNΒ·2022λ…„ 5μ›” 12일
0

Swift 문법

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

1. ν•¨μˆ˜μ˜ κΈ°λ³Έ κ°œλ…

Β  ν•¨μˆ˜(Function)λŠ” λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ§€μ›ν•˜λŠ” κ°œλ…μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ κ³Όμ • μ€‘μ—μ„œ λ…λ¦½μ μœΌλ‘œ 처리될 수 μžˆλŠ” 뢀뢄을 λΆ„λ¦¬ν•˜μ—¬ κ΅¬μ‘°ν™”ν•œ 객체λ₯Ό μ˜λ―Έν•œλ‹€. 즉 외뢀에 μ˜μ‘΄ν•˜λŠ” λΆ€λΆ„ 없이 툭 λ–Όμ–΄ 뢄리 ν•  수 μžˆλŠ” μ‹€ν–‰ λ‹¨μœ„λ₯Ό μΌμ’…μ˜ 캑슐처럼 포μž₯ν•΄ 놓을 것이닀.

Β μŠ€μœ„ν”„νŠΈλŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ νŒ¨λŸ¬λ‹€μž„μ„ μ±„νƒν•˜κ³  μžˆλŠ” μ–Έμ–΄μ΄λ―€λ‘œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ„±μ„ μ΄ν•΄ν•˜λŠ” 것은 맀우 μ€‘μš”ν•˜λ‹€.

Β  λ‹€λ₯Έ μ–Έμ–΄λ“€κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ ν•¨μˆ˜λŠ” μΌλ°˜ν•¨μˆ˜μ™€ μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€. μΌλ°˜ν•¨μˆ˜λŠ” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‚˜ ν”„λ ˆμž„μ›Œν¬ μˆ˜μ€€μ—μ„œ μ œκ³΅ν•˜λŠ” ν•¨μˆ˜λ‘œ 기본적인 λ°μ΄ν„°μ˜ μ²˜λ¦¬λ‚˜ μ—°μ‚° 등을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œ μ‚¬μš©λœλ‹€. λŒ€ν‘œμ μœΌλ‘œ 좜λ ₯ν•¨μˆ˜μΈ print()κ°€ μžˆλ‹€.

Β  κ·ΈλŸ¬λ‚˜ μ‹€μ œλ‘œ κ°œλ°œμ„ ν•˜λ‹€λ³΄λ©΄ μ‚¬μš©μžκ°€ μ›ν•˜λŠ” κΈ°λŠ₯이 μžˆμ„ 것이닀. 예λ₯Ό λ“€μ–΄ 1λΆ€ν„° 10κΉŒμ§€λ§Œ λ”ν•˜λŠ” ν•¨μˆ˜ λ“±, μ΄λŸ¬ν•œ 것듀은 μ‚¬μš©μžκ°€ 직접 λ§Œλ“€μ–΄ μ£Όμ–΄μ•Ό ν•˜λŠ”λ° 이런 ν•¨μˆ˜λ₯Ό μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜λΌ ν•œλ‹€.

Β ν”„λ‘œκ·Έλž˜λ°μ—μ„œ ν•¨μˆ˜λŠ” ν•„μˆ˜ μš”μ†ŒλŠ” μ•„λ‹ˆμ§€λ§Œ ν•¨μˆ˜κ°€ μ€‘μš”ν•œ μ΄μœ λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  • λ™μΌν•œ μ½”λ“œκ°€ μ—¬λŸ¬ κ³³μ—μ„œ 사아ㅛㅇ될 λ•Œ 이λ₯Ό ν•¨μˆ˜ν™”ν•˜λ©΄ μž¬μž‘μ„±ν•  ν•„μš” 없이 ν•¨μˆ˜ 호좜만으둜 μ²˜λ¦¬ν•  수 μžˆλ‹€.

  • 전체 ν”„λ‘œμ„ΈμŠ€λ₯Ό ν•˜λ‚˜μ˜ μ†ŒμŠ€ μ½”λ“œμ—μ„œ μ—°μ†μ μœΌλ‘œ μž‘μ„±ν•˜λŠ” 것보닀 κΈ°λŠ₯ λ‹¨μœ„λ‘œ ν•¨μˆ˜ν™”ν•˜λ©΄ 가독성이 쒋아지고, μ½”λ“œμ™€ λ‘œμ§μ„ μ΄ν•΄ν•˜κΈ° 쉽닀.

  • λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ λ³€κ²½ν•΄μ•Ό ν•  λ•Œ ν•¨μˆ˜ λ‚΄λΆ€λ§Œ μˆ˜μ •ν•˜λ©΄ λ˜λ―€λ‘œ μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•˜λ‹€.

1-1. μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜

Β  ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” ν‚€μ›Œλ“œλŠ” func이고 ν•¨μˆ˜μ˜ 이름에 μ‚¬μš©ν•  수 μžˆλŠ” λ¬Έμžλ“€μ€ μ˜μ–΄λ‚˜ 숫자, ν•œμž, λ°”μ΄λ„ˆλ¦¬ 이미지 λ“±μœΌλ‘œ λ‹€μ–‘ν•˜μ§€λ§Œ 첫 κΈ€μžλŠ” λ°˜λ“œμ‹œ μ˜μ–΄ λ˜λŠ” 언더바(_)둜 μ‹œμž‘ν•΄μ•Ό ν•œλ‹€.

Β  λ‹€μŒμ€ ν•¨μˆ˜λ₯Ό μ‹€μ œλ‘œ μ •μ˜ν•˜λŠ” λͺ¨μŠ΅μ΄λ‹€.

// 1. λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜κ°’μ΄ λͺ¨λ‘ μ—†λŠ” ν•¨μˆ˜ 	
func printHello(){
    print("μ•ˆλ…•ν•˜μ„Έμš”!")
}


// 2. λ§€κ°œλ³€μˆ˜κ°€ μ—†μ§€λ§Œ λ°˜ν™˜κ°’μ€ μžˆλŠ” ν•¨μˆ˜
func sayHello() -> String {
    let returnValue = "μ•ˆλ…•"
    return returnValue
}


// 3. λ§€κ°œλ³€μˆ˜λŠ” μžˆμœΌλ‚˜ λ°˜ν™˜κ°’μ΄ μ—†λŠ” ν•¨μˆ˜
func printHelloWithName(name: String){
    print("\(name)λ‹˜, μ•ˆλ…•ν•˜μ„Έμš”")
}

//ν•¨μˆ˜ ν˜ΈμΆœμ‹œ 인자 λ ˆμ΄λΈ”(name: )이 없을 경우 컴파일 였λ₯˜κ°€ λ°œμƒν•¨
print(printHelloWithName(name: "SJ")) // SJλ‹˜, μ•ˆλ…•ν•˜μ„Έμš” 좜λ ₯
    
    
// 4. λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜κ°’μ΄ λͺ¨λ‘ μžˆλŠ” ν•¨μˆ˜
func add(firstNum: Int, secondNum: Int) -> Int {
    var result = firstNum + secondNum
    return result
}
    
print(add(firstNum: 4, secondNum: 5)) //κ²°κ³Ό: 9

Β  ν•¨μˆ˜μ˜ ν˜•νƒœλŠ” λ‹€λ₯Έ μ–Έμ–΄λ“€κ³Ό 많이 μœ μ‚¬ν•˜μ§€λ§Œ ν˜ΈμΆœν•  λ•Œ 큰 차이λ₯Ό λŠκΌˆλ‹€. printHello() ν•¨μˆ˜μ΄λ¦„μ— ()λ₯Ό λΆ™μ—¬ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 것은 λ‹€λ₯Έ μ–Έμ–΄λ“€κ³Ό λΉ„μŠ·ν•˜μ§€λ§Œ ν•¨μˆ˜μ— λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” 경우, μœ„ μ½”λ“œ 3λ²ˆμ—μ„œ printHelloWithName(name: "홍길동") μ΄λ ‡κ²Œ name: μ΄λΌλŠ” μΈμžλ ˆμ΄λΈ”μ΄ μžˆμ–΄μ•Όλ§Œ 컴파일 였λ₯˜ 없이 ν•¨μˆ˜κ°€ 정상 ν˜ΈμΆœλœλ‹€.

Β μΈμžλ ˆμ΄λΈ”μ€ ν•¨μˆ˜μ˜ 호좜 μ‹œ μΈμžκ°’μ„ κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” λ ˆμ΄λΈ”μ΄λ‹€. μŠ€μœ„ν”„νŠΈμ—μ„œ μΈμžκ°’μ΄ μžˆλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œμ—λŠ” μΈμžκ°’ μ•žμ— 기본적으둜 인자 λ ˆμ΄λΈ”μ„ λΆ™μ—¬μ„œ ν˜ΈμΆœν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€β—οΈ

Β  인자 λ ˆμ΄λΈ” μ‚¬μš©μ€ λͺ…확함과 νŽΈλ¦¬ν•¨λ³΄λ‹€λŠ” μ½”λ“œκ°€ λŠ˜μ–΄λ‚˜λŠ” λΆˆνŽΈν•¨μ΄ λ„ˆλ¬΄λ‚˜λ„ 크닀. κ·ΈλŸ¬λ‚˜ 이런 문법이 μ‘΄μž¬ν•˜λŠ” μ΄μœ λŠ” μŠ€μœ„ν”„νŠΈκ°€ λ‚˜μ˜€κΈ° 이전에 μžˆμ—ˆλ˜ μ˜€λΈŒμ ν‹°λΈŒ-Cμ–Έμ–΄ λ•Œλ¬Έμ΄λ‹€. μ˜€λΈŒμ ν‹°λΈŒ-Cκ°€ μ‚¬μš©ν•˜κ³  μžˆλŠ” 문법 μŠ€νƒ€μΌκ³Ό ν˜Έν™˜μ„±μ„ 가지기 μœ„ν•΄ μ‚¬μš©ν•œ 것이 κ°€μž₯ 큰 이유라고 ν•  수 μžˆλ‹€.

1 - 2. ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’κ³Ό νŠœν”Œ

Β  ν•¨μˆ˜λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜μ˜ κ°’λ§Œμ„ λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€. μ—¬λŸ¬κ°œμ˜ 값을 λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€λ©΄, 이 값듀을 집단 μžλ£Œν˜•μ— λ‹΄μ•„ λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€. λ”•μ…”λ„ˆλ¦¬λ‚˜ λ°°μ—΄, νŠœν”Œ, ꡬ쑰체, 클래슀 λ“± μ—¬λŸ¬κ°œμ˜ λ³€μˆ˜λ₯Ό 담을 수 μžˆλŠ” 객체이닀. μ—¬κΈ°μ„œ ν™œμš©λ„κ°€ λ†’μœΌλ©΄μ„œ λ‹€λ₯Έ μžλ£Œν˜•κ³Ό 차이가 μžˆλŠ” νŠœν”Œμ„ 닀룬닀.

func getUserInfo() -> (Int, Character, String) {
    
    //데이터 νƒ€μž…μ΄ String으둜 μΆ”λ‘ λ˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜ μ„ μ–Έ
    let gender: Character = "M"
    let height = 180
    let name = "κΌΌκΌΌν•œ μž¬μ€μ”¨"
    return (height, gender, name)
}

var uInfo = getUserInfo()

uInfo.0// "180"
uInfo.1// "M"
uInfo.2// "κΌΌκΌΌν•œ μž¬μ€μ”¨"

var (a, b, c) = getUserInfo()
a = 190
b = "W"
c = "sssss"

print(a, b, c) // 190 W sssss

Β  ν•¨μˆ˜κ°€ μ—¬λŸ¬κ°œμ˜ 값을 λ°˜ν™˜ν•  λ•Œ 이λ₯Ό κ°„λ‹¨ν•˜κ²Œ λ¬ΆκΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 것이 νŠœν”Œμ΄μ§€λ§Œ, νŠΉμ • νŠœν”Œ νƒ€μž…μ΄ μ—¬λŸ¬ κ³³μ—μ„œ μ‚¬μš©λ  κ²½μš°μ—λŠ” νƒ€μž… μ•Œλ¦¬μ–΄μŠ€λ₯Ό 톡해 μƒˆλ‘œμš΄ μΆ•μ•½ν˜• νƒ€μž…μ„ μ •μ˜ν•˜λŠ” 것이 μ’‹λ‹€.

	typealias infoResult = (h: Int, g: Character, n: String)
    
    func getUserInfo() -> (Int, Character, String) {
    
    //데이터 νƒ€μž…μ΄ String으둜 μΆ”λ‘ λ˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜ μ„ μ–Έ
    let gender: Character = "M"
    let height = 180
    let name = "κΌΌκΌΌν•œ μž¬μ€μ”¨"
    return (height, gender, name)
}
    
var uInfo = getUserInfo()

info.h // 180
info.g // "M"
info.n // "κΌΌκΌΌν•œ μž¬μ€μ”¨"

Β  typealiasλ₯Ό μ •μ˜ν•˜κ³  λ‚˜λ©΄ μ»΄νŒŒμΌλŸ¬λŠ” μƒˆλ‘œμš΄ 이름을 νƒ€μž…ν‘œν˜„κ³Ό λ™μΌν•˜κ²Œ κ°„μ£Όν•œλ‹€. 단 νƒ€μž… μ•Œλ¦¬μ–΄μŠ€λŠ” μ–΄λ””κΉŒμ§€λ‚˜ νƒ€μž…μ— λŒ€ν•œ μƒˆλ‘œμš΄ ν‘œν˜„μ„ μ •μ˜ν•˜λŠ” 역할을 ν•˜κΈ° λ•Œλ¬Έμ— νƒ€μž…μ΄ μ•„λ‹Œ ꡬ체적인 값을 μƒμˆ˜μ²˜λŸΌ μ‚¬μš©ν•  수 λŠ” μ—†λ‹€.

Β  이처럼 ν•¨μˆ˜μ— νŠœν”Œμ„ ν™œμš©ν•˜λ©΄ μ½”λ“œλ₯Ό μ‰½κ²Œ μ²˜λ¦¬ν•  수 μžˆμ–΄ ν™œμš©λ„κ°€ λ†’λ‹€.



2. λ§€κ°œλ³€μˆ˜

Β  μŠ€μœ„ν”„νŠΈλŠ” 기본적인 λ§€κ°œλ³€μˆ˜μ˜ 호좜이 λ‹€λ₯Έ 언어와 λ‹€λ₯΄κ³ , 이외에도 νŠΉλ³„ν•œ κΈ°λŠ₯듀을 적지 μ•Šκ²Œ 기지고 μžˆλ‹€.

2 - 1 Β  λ‚΄λΆ€ λ§€κ°œλ³€μˆ˜λͺ…, μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜λͺ…

Β  μŠ€μœ„ν”„νŠΈμ—μ„œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ λ§€κ°œλ³€μˆ˜λ₯Ό μš©λ„μ— 따라 두 κ°€μ§€λ‘œ 뢄리할 수 μžˆλ‹€. μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μΈμžκ°’μ— λŒ€ν•œ λ ˆμ΄λΈ” 역할을 ν•˜λ©°, λ™μ‹œμ— ν•¨μˆ˜μ˜ μ‹λ³„μž 일뢀λ₯Ό μ‚¬μš©λ˜κΈ°λ„ ν•œλ‹€. 반면 λ‚΄λΆ€ λ§€κ°œλ³€μˆ˜λŠ” μž…λ ₯된 μΈμžκ°’μ„ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ°Έμ‘°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” λ³€μˆ˜μ΄λ‹€.

//μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜λ₯Ό μ§€μ •ν•˜λŠ” 방법
func ν•¨μˆ˜ 이름(<μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜λͺ…><λ‚΄λΆ€ λ§€κ°œλ³€μˆ˜λͺ…>:<νƒ€μž…>,<μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜λͺ…> <λ‚΄λΆ€ λ§€κ°œλ³€μˆ˜λͺ…>:<νƒ€μž…>...) {
	//ν•¨μˆ˜μ˜ λ‚΄μš©
}


//κΈ°λ³Έ ν•¨μˆ˜
func hello(name: String, msg: String){
    print("\(name)λ‹˜, \(msg)")
}

print(name: "홍길동", msg:"μ•ˆλ…•")


//μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜ 1개만 μΆ”κ°€ 
func printHello(name: String, welcomeMessage msg: String){ //μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜: to, welcomeMessage
    print("\(name)λ‹˜, \(msg)")
}

print(name: "홍길동", welcomeMessage:"μ•ˆλ…•")


//μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜ μ „λΆ€ μΆ”κ°€ 
func printHello(to name: String, welcomeMessage msg: String){ //μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜: to, welcomeMessage
    print("\(name)λ‹˜, \(msg)")
}

printHello(to: "홍길동", welcomeMessage: "μ•ˆλ…•")


//λ§€κ°œλ³€μˆ˜ μƒλž΅ 언더바(_)  -> μŠ€μœ„ν”„νŠΈμ—μ„œ μ–Έλ”λ°”μ˜ λœ»μ€ '문법은 μ μš©ν•˜λ˜ μ‚¬μš©ν•˜μ§€ μ•Šκ³  μƒλž΅ν•˜κ² λ‹€'λΌλŠ” 의미
func printHello(_ name: String, _ msg: String){ //μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜: to, welcomeMemssage
    print("\(name)λ‹˜, \(msg)")
}

printHello("홍길동", "μ•ˆλ…•")



func printHello(to name: String, _ msg: String){ //μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜: to, welcomeMemssage
    print("\(name)λ‹˜, \(msg)")
}

printHello(to: "홍길동", "μ•ˆλ…•")



func printHello(_ name: String, welcomeMessage msg: String){ //μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜: to, welcomeMemssage
    print("\(name)λ‹˜, \(msg)")
}

printHello("홍길동", welcomeMessage: "μ•ˆλ…•")

Β  μœ„ μ½”λ“œμ—μ„œ nameκ³Ό msgλΌλŠ” 두 개의 λ§€κ°œλ³€μˆ˜λ₯Ό μ—¬μ „νžˆ μ‚¬μš©ν•˜μ§€λ§Œ μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜μΈ to, welcomeMessageκ°€ μΆ”κ°€λ˜λ©΄μ„œ nameκ³Ό msgλŠ” λ‚΄λΆ€ λ§€κ°œλ³€μˆ˜κ°€ λ˜μ—ˆλ‹€. μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜κ°€ μ •μ˜λ˜μ§€ μ•Šμ•˜μ„ λ•ŒλŠ” name, msgλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©ν–ˆμ§€λ§Œ μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜κ°€ μΆ”κ°€λœ μƒνƒœμ΄λ―€λ‘œ 이λ₯Ό μ‚¬μš©ν•˜μ—¬ ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.

Β  μœ„ μ½”λ“œμ—μ„œ (_)λ₯Ό 톡해 맨 μ•žμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μƒλž΅ν•œ κ΅¬μ‘°λŠ” μ½”μ½”μ•„ ν„°μΉ˜ ν”„λ ˆμž„μ›Œν¬μ—μ„œ ꡉμž₯히 많이 μ‚¬μš©λ˜λŠ” 방식이닀.

Β  μŠ€μœ„ν”„νŠΈμ˜ νŠΉμ§•μ΄λΌ ν•  수 μžˆλŠ” μ™ΈλΆ€ λ§€κ°œλ³€μˆ˜λͺ…κ³Ό λ‚΄λΆ€ λ§€κ°œλ³€μˆ˜λͺ…은 내뢀와 μ™ΈλΆ€μ—μ„œ λ°”λΌλ³΄λŠ” μ˜λ―Έκ°€ 달라 외뢀와 λ‚΄λΆ€λ‘œ κ΅¬λΆ„ν•˜μ—¬ μ‚¬μš©ν•  ν•„μš”κ°€ μžˆμ„ λ•Œ ν˜Ήμ€ λ‚΄λΆ€ λ§€κ°œλ³€μˆ˜λͺ…을 μ™ΈλΆ€λ‘œ κ³΅κ°œν•˜κΈ°λ₯Ό μ›μΉ˜ μ•Šμ„ λ•Œ μ‚¬μš©λœλ‹€. 그런데 이런 μ΄μœ λ³΄λ‹€λ„ κ°€μž₯ 큰 μ΄μœ λŠ” μ˜€λΈŒμ ν‹°λΈŒ-Cμ™€μ˜ ν˜Έν™˜μ„±β—οΈ λ•Œλ¬Έμ΄λ‹€.

2 - 2 Β Β κ°€λ³€μΈμž

일반적으둜 ν•¨μˆ˜λŠ” 미리 μ •μ˜λœ ν˜•μ‹κ³Ό κ°œμˆ˜μ— λ§žλŠ” μΈμžκ°’λ§˜γ„΄ μ²˜λ¦¬ν•˜μ§€λ§Œ, λ•Œμ— λ”°λΌμ„œλŠ” 가변적인 개수의 μΈμžκ°’μ„ μž…λ ₯λ°›μ•„μ•Ό ν•  λ•Œλ„ μžˆλ‹€. μŠ€μœ„ν”„νŠΈ μ—­μ‹œ μΈμžκ°’μ˜ μž…λ ₯ 개수λ₯Ό μ œμ•ˆν•˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” ν•¨μˆ˜ μ •μ˜ ν˜•μ‹μ„ μ œκ³΅ν•˜λŠ”λ°, 이λ₯Ό μœ„ν•΄μ„œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ λ§€κ°œλ³€μˆ˜λͺ… λ‹€μŒμ— '...' μ—°μ‚°μžλ₯Ό μΆ”κ°€ν•˜λ©΄ λœλ‹€.

//κ°€λ³€ 인자λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›λŠ” ν•¨μˆ˜ μ˜ˆμ‹œ
func avg(score: Int...) -> Double {
	var total = 0 // 점수 합계
    for r in score { // λ°°μ—΄λ‘œ μž…λ ₯된 값듀을 순회 νƒμƒ‰ν•˜λ©΄μ„œ 점수λ₯Ό ν•©μ‚°
    	total += r
    }
    return (Double(total) / Double(score.count)) // λ°˜ν™˜κ°’μ΄ Doubleν˜•μ΄λ―€λ‘œ 총점과 κ³Όλͺ©μ˜ 수 Double둜 ν˜•λ³€ν™˜, 평균값을 κ΅¬ν•΄μ„œ λ°˜ν™˜
}

print(avg(score: 10, 20, 30, 40)) // 25.0

2 - 3   기본값을 κ°–λŠ” λ§€κ°œλ³€μˆ˜

Β  ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ—λŠ” μœ μš©ν•œ κΈ°λŠ₯이 μžˆλŠ”λ°, λ°”λ‘œ 기본값을 지정할 수 μžˆλŠ” 것이닀. μŠ€μœ„ν”„νŠΈλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ λ°˜λ“œμ‹œ 직접 μž…λ ₯λ°›μ•„μ•Ό ν•˜λŠ” 값이 μ•„λ‹ˆλΌλ©΄ μΈμžκ°’μ„ μƒλž΅ν•  수 μžˆλ„λ‘, ν•¨μˆ˜ μ •μ˜ μ‹œ λ§€κ°œλ³€μˆ˜μ— 기본값을 지정할 수 μžˆλŠ” 문법을 μ œκ³΅ν•œλ‹€.

func echo(message: String, newline: BOol = true) {
	if newline == true {
    	print(message, true)
    } else {
    	print(message, false)
    }
}

echo(message: "μ•ˆλ…•") // μ•ˆλ…• true
echo(message: "μ•ˆλ…•", newline: true) // μ•ˆλ…• true
echo(message: "μ•ˆλ…•", newline: false) // μ•ˆλ…• false

2 - 4 Β Β λ§€κ°œλ³€μˆ˜μ˜ μˆ˜μ •

Β  μ§€κΈˆκΉŒμ§€ ν•¨μˆ˜μ—μ„œ λ§€κ°œλ³€μˆ˜λΌλŠ” 단어λ₯Ό μ—¬λŸ¬ 번 μ‚¬μš©ν–ˆλ‹€. λ³€μˆ˜λŠ” μ›λž˜ λ§ˆμŒλŒ€λ‘œ 값을 μˆ˜μ •ν•  수 μžˆμ–΄μ•Ό ν•˜μ§€λ§Œ, λ§€κ°œλ³€μˆ˜μ— μž…λ ₯된 μΈμžκ°’μ„ ν•¨μˆ˜ λ‚΄μ—μ„œ μˆ˜μ •ν•˜λ €κ³  ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€. 이것은 μŠ€μœ„ν”„νŠΈμ—μ„œ ν•¨μˆ˜μ˜ μΈμžκ°’μ΄ λ³€μˆ˜κ°€ μ•„λ‹ˆλΌ μƒμˆ˜λ‘œ μ •μ˜λ˜μ—ˆκΈ° λ•Œλ¬ΈμœΌλ‘œ, μ •ν™•ν•œ ν‘œν˜„μ€ λ§€κ°œμƒμˆ˜λΌκ³  ν•΄μ•Ό λ§žλ‹€.

func incrementBy(base: Int) -> Int { //였λ₯˜!! -> baseλŠ” λ³€μˆ˜κ°€ μ•„λ‹Œ μƒμˆ˜μž„
    base+=1
    return base
}

//였λ₯˜ ν•΄κ²°
func incrementBy(base: Int) -> Int {
    var base = base
    base+=1
    return base
}

Β  μœ„ μ½”λ“œ 첫 번째 ν•¨μˆ˜μ—μ„œ λ§€κ°œλ³€μˆ˜λ₯Ό λ°”κΎΈλ €κ³  ν•˜μ—¬ 였λ₯˜κ°€ λ°œμƒν•˜λŠ” 것을 λ³Ό 수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ μ—λŸ¬λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ§€κ°œλ³€μˆ˜μ™€ λ™μΌν•œ μ΄λ¦„μœΌλ‘œ λ³€μˆ˜λ₯Ό μ •μ˜ν•˜κ³  λ§€κ°œλ³€μˆ˜μ˜ 값을 λŒ€μž…ν•΄ μ£Όμ—ˆλ‹€. μ΄λ ‡κ²Œ λ™μΌν•œ μ΄λ¦„μ˜ λ³€μˆ˜λ₯Ό μž‘μ„±ν•΄μ„œ 값을 λŒ€μž…ν•˜λ©΄ μ΄ν›„λ‘œ baseλΌλŠ” μ΄λ¦„μ˜ ν˜ΈμΆœμ€ λͺ¨λ‘ λ§€κ°œλ³€μˆ˜ baseκ°€ μ•„λ‹Œ λ³€μˆ˜ baseλ₯Ό κ°€λ₯΄ν‚€κ²Œ λœλ‹€.


2 - 4 Β Β  InOut λ§€κ°œλ³€μˆ˜

var cnt = 30

func autoIncrement(value: Int) -> Int {
	var value = value
    value += 1
    
    return value
}

print(autoIncrement(value: cnt)) // ν•¨μˆ˜ λ‚΄λΆ€μ˜ value λ³€μˆ˜ κ°’ : 31
print(cnt) //μ™ΈλΆ€μ—μ„œ μ •μ˜λœ cnt λ³€μˆ˜κ°’ : 30

Β  μœ„ μ½”λ“œμ—μ„œ autoIncrement(value:)λŠ” μž…λ ₯된 μΈμžκ°’μ„ 1만큼 μ¦κ°€μ‹œν‚¨ λ‹€μŒ λ°˜ν™˜ν•œλ‹€. 이 λ•Œ μΈμžκ°’ 자체λ₯Ό μˆ˜μ •ν•  수 μžˆλ„λ‘ λ§€κ°œλ³€μˆ˜ valueλŠ” λ‚΄λΆ€μ μœΌλ‘œ λ³€μˆ˜λ‘œ μΉ˜ν™˜λ˜κ³  30이 ν• λ‹Ήλœ cnt λ³€μˆ˜λ₯Ό μΈμžκ°’μœΌλ‘œ μž…λ ₯ν•˜μ—¬ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λ©΄ λ‚΄λΆ€μ—μ„œ λ³€κ²½λœ value λ³€μˆ˜μ˜ 값은 31이 λœλ‹€. κ·ΈλŸ¬λ‚˜ μΈμžκ°’μœΌλ‘œ μ‚¬μš©λœ cnt λ³€μˆ˜ 자체의 값은 μ•„λ¬΄λŸ° λ³€ν™”κ°€ μ—†μ–΄μ„œ μ—¬μ „νžˆ 30이닀. μ΄λŠ” μ™ΈλΆ€μ—μ„œ μž…λ ₯ν•œ μΈμžκ°’μ΄ 직접 ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μ „λ‹¬λ˜λŠ” 것이 μ•„λ‹ˆλΌ κ·Έ 값이 λ³΅μ‚¬λœ λ‹€μŒ μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ΄λ‹€. λ‹€μ‹œ 말해, μΈμžκ°’μœΌλ‘œ μ „λ‹¬λœ cnt와 λ§€κ°œλ³€μˆ˜ valueλŠ” μ„œλ‘œ λ‹€λ₯Έ λ³€μˆ˜β­οΈμ΄λ‹€.

Β  ν•˜μ§€λ§Œ ν•¨μˆ˜μ—μ„œλ„ λ‚΄λΆ€μ—μ„œ μˆ˜μ •λœ μΈμžκ°’μ΄ μ™ΈλΆ€κΉŒμ§€ 영ν–₯을 λ―ΈμΉ  수 μžˆλŠ” 방법이 μ‘΄μž¬ν•œλ‹€. 이λ₯Ό μœ„ν•΄ inout ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. 이 ν‚€μ›Œλ“œλŠ” μŠ€μœ„ν”„νŠΈμ—μ„œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μˆ˜μ •λœ μΈμžκ°’μ„ ν•¨μˆ˜ μ™ΈλΆ€κΉŒμ§€ 전달 ν•  수 μžˆλ‹€.

//inout ν‚€μ›Œλ“œ μ‚¬μš© -> inoutν‚€μ›Œλ“œκ°€ 뢙은 λ§€κ°œλ³€μˆ˜λŠ” μΈμžκ°’μ΄ 전달될 λ•Œ 
//μƒˆλ‘œμš΄ λ‚΄λΆ€ μƒμˆ˜λ₯Ό λ§Œλ“€μ–΄ λ³΅μ‚¬ν•˜λŠ” λŒ€μ‹  μΈμžκ°’ 자체λ₯Ό ν•¨μˆ˜ λ‚΄λΆ€λ‘œ 전달
//사싀 inout ν‚€μ›Œλ“œμ˜ μ •ν™•ν•œ μ˜λ―ΈλŠ” κ°’ 자체λ₯Ό μ „λ‹¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 
//값이 μ €μž₯된 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 전달함

func foo(paramCount: inout Int) -> Int{
    paramCount += 1
    return paramCount
}

var count = 30
print(foo(paramCount: &count)) //31 &μ£Όμ†Œ μ—°μ‚°μž
print(count) // 31

Β  inout ν‚€μ›Œλ“œκ°€ 뢙은 λ§€κ°œλ³€μˆ˜λŠ” μΈμžκ°’μœΌλ‘œ μ‚¬μš©λœ λ³€μˆ˜μ™€ λ™μΌν•œ 객체이닀. λ‹¨μˆœνžˆ κ°’λ§Œ λ˜‘κ°™μ€ λ³΅μ‚¬λœ λ³€μˆ˜μ™€λŠ” λ‹€λ₯΄λ‹€.

Β inout ν‚€μ›Œλ“œμ˜ μ •ν™•ν•œ μ˜λ―ΈλŠ” κ°’ 자체λ₯Ό μ „λ‹¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 값이 μ €μž₯된 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ „λ‹¬ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€. μΈμžκ°’μ— ν• λ‹Ήλœ 데이터가 μ €μž₯λ˜μ–΄ μžˆλŠ” λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό ν•¨μˆ˜μ— μ „λ‹¬ν•˜λŠ” 것이닀. cμ–Έμ–΄μ˜ 포인터 κ°œλ…μ΄λΌκ³  λ³Ό 수 μžˆλ‹€. μ—¬κΈ°μ„œ μ€‘μš”ν•œ 값은 inout ν‚€μ›Œλ“œκ°€ μ‚¬μš©λœ ν•¨μˆ˜λŠ” 호좜 μ‹œ μΈμžκ°’μ„ 전달할 λ•Œ 값이 μ•„λ‹Œ μ£Όμ†Œλ₯Ό 전달해야 ν•œλ‹€β—οΈ

Β  λ”°λΌμ„œ Β μ—°μ‚°μžλ₯Ό λΆ™μ—¬ print(foo(paramCount: &count)) μ½”λ“œκ°€ μž‘μ„±λœ 것이닀.

Β  이처럼 μ£Όμ†Œλ₯Ό μ „λ‹¬ν•˜λŠ” 것을 ν”„λ‘œκ·Έλž˜λ° μš©μ–΄λ‘œ 'μ°Έμ‘°(Reference)에 μ˜ν•œ 전달'이라고 ν•˜κ³ , 기쑴처럼 κ°’λ§Œ λ³΅μ‚¬ν•˜μ—¬ μ „λ‹¬ν•˜λŠ” 것을 '값에 μ˜ν•œ 전달' 이라 ν•œλ‹€.


2 - 5 Β Β  λ³€μˆ˜μ˜ 생쑴 λ²”μœ„μ™€ 생λͺ… μ£ΌκΈ°

Β  ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λ³€μˆ˜λ‚˜ μƒμˆ˜λŠ” 생쑴할 수 μžˆλŠ” μ˜μ—­μ„ λΆ€μ—¬ λ°›λŠ”λ° 이λ₯Ό λ³€μˆ˜μ˜ μƒμ‘΄λ²”μœ„, μŠ€μ½”ν”„(Scope)라고 ν•œλ‹€.

Β  ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ 보톡 λ³€μˆ˜λ₯Ό μ „μ—­ λ³€μˆ˜(Global)와 지역 λ³€μˆ˜(Local)둜 λ‚˜λˆˆλ‹€. μ „μ—­ λ³€μˆ˜λŠ” ν”„λ‘œκ·Έλž¨ λ‚΄ λͺ¨λ“  μœ„μΉ˜μ—μ„œ μ°Έμ‘°ν•  수 있고 νŠΉλ³„ν•œ κ²½μš°κ°€ μ•„λ‹ˆλΌλ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜κΈ° μ „κΉŒμ§€ μ‚­μ œλ˜μ§€ μ•ŠλŠ”λ‹€. 반면 μ§€μ—­λ³€μˆ˜λŠ” νŠΉμ • λ²”μœ„ λ‚΄μ—μ„œλ§Œ μ°Έμ‘°ν•˜κ±°λ‚˜ μ‚¬μš©ν•  수 μžˆλŠ” λ³€μˆ˜λ₯Ό μ˜λ―Έν•œλ‹€. 쑰건문 ν•¨μˆ˜ ꡬ문 λ“± νŠΉμ • 블둝({}) λ‚΄μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λŠ” λͺ¨λ‘ 지역 λ³€μˆ˜μ΄λ©° μ„ μ–Έλœ 블둝 λ²”μœ„ μ•ˆμ—μ„œλ§Œ 이 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€. 지역 λ³€μˆ˜λŠ” μ„ μ–Έλœ 블둝이 μ‹€ν–‰λ˜λ©΄μ„œ 생겼닀가 μ‹€ν–‰ 블둝이 λλ‚˜λ©΄ μ œκ±°λ˜λŠ”λ° 이λ₯Ό λ³€μˆ˜μ˜ 생λͺ… μ£ΌκΈ°(Life Cycle)이라고 ν•œλ‹€.

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

0개의 λŒ“κΈ€