MapleStory Finger Point

[Swift] #5 - 함수

2021. 9. 1. 14:34iOS Development/Swift

** 함수

  • 프로그램의 기본적인 구성요소로, 어떤 작업을 수행하는 문장의 그룹을 의미함
  • ex) 레고 블럭
  • 가독성의 증대, 유지관리가 쉬움
  • 재사용 가능한 코드블럭

 

 

** 함수 정의

// 함수 정의
func sayHello(name: String) -> String {
    return "Hello \(name)"
}

// 함수 호출
print(sayHello(name: "미지"))

func multipl(dan: Int) {
    for j in 1...9 {
        print("\(dan) X \(j) = \(dan * j)")
    }
}

multipl(dan: 5)

 

 

** 함수의 매개변수

  • 매개변수의 개수: 제한이 있긴 하지만 크게 신경 쓸 필요가 없음
  • 반환값의 개수: 1개만 가능 / 여러개의 데이터를 전달하고 싶으면 Collections 사용
// 매개변수
func sayHelloWithName(name: String, age: Int) -> String {
    return "\(name) is \(age) years old !"
}

print(sayHelloWithName(name: "miji", age: 25))

// 내부 매개변수와 외부 매개변수
// 외부 매개변수: 호출시 사용 / detail
// 내부 매개변수: 정의시 사용 / simple, short
func sayHello(exName name: String, exAge age: Int) -> String {
    return "\(name) is \(age) years old !"
}

// 오버로딩
print(sayHello(exName: "miji suh", exAge: 20))

// 함수 호출시 외부 매개변수를 생략하고 싶을 때 _(언더 스코어) 사용
func sayHello(_ name: String, _ age: Int) -> String {
    return "\(name) is \(age) years old !"
}

print(sayHello("mj", 10))

// 매개변수의 기본값: 매개변수가 없을 경우 사용
func sayHi(name: String = "디폴트") {
    print("Hi \(name) !")
}

sayHi(name: "서미지")
sayHi()

 

 

** 예제

  • 계산기 함수 만들기
// 계산기 함수
func calculator(num1: Int, op: String, num2: Int) -> Int {
    var result = 0
    
    switch op {
    case "+": result = num1 + num2
    case "-": result = num1 - num2
    case "*": result = num1 * num2
    case "/": result = num1 / num2
    case "%": result = num1 % num2
    default: result = Int.max // 연산자가 이상한 값으로 입력받았을 경우
    }
    
    return result
}

var num1 = 5
var num2 = 4
var op = "+"
print("\(num1) \(op) \(num2) = \(calculator(num1: num1, op: op, num2: num2))")

 

 

** 가변인자 매개변수

  • 개수가 정해져있지 않는 매개변수
  • 내부적으로 Array 하나로 받음
// 가변인자 매개변수
func avg(scores: Int...) -> Double {
    var total = 0
    for score in scores {
        total += score
    }
    
    return (Double(total) / Double(scores.count))
}

print(avg(scores: 1, 2, 3, 4, 5, 6)) // 반마다 학생 수가 다름

 

 

** 튜플 반환 함수

// 튜플 반환 함수
func swap(firstNumber n1: Int, secondNumber n2: Int) -> (Int, Int) {
    return (n2, n1)
}

let result1 = swap(firstNumber: 3, secondNumber: 4)
print(result1)

let (first, second) = swap(firstNumber: 3, secondNumber: 4)
print(first)
print(second)

 

 

** 변수의 범위와 생명주기

// 변수의 범위와 생명주기
do {
    do {
        let ccnt = 3
        print(ccnt) // 3
    }
    // print(ccnt) -> error: cannot find 'ccnt' in scope
}

do {
    let ccnt: Int = 0
    do {
        let ccnt = 3
        print(ccnt) // 3
    }
    print(ccnt) // 0
}

var count = 30

func foo() -> Int {
    return count // 30
}

func foo(count1: Int) -> Int {
    return count1
}

// print(count1) -> error: cannot find 'count1' in scope
print(foo()) // 30
print(foo(count1: 0)) // 0

var count2 = 3

func foo1(count2: Int) -> Int {
    return count2
}

print(count2) // 3
print(foo1(count2: 2)) // 2

 

 

** 변수의 검색 순서

 

 

** 예제

  • 평점 계산기
  • // 점수를 입력 받아 평점을 구하는 함수
    func calcGrade(score: Int) -> String {
        var grade = ""
        
        if score >= 90 {
            grade = "A"
        } else if score >= 80 {
            grade = "B"
        } else if score >= 70 {
            grade = "C"
        } else if score >= 60 {
            grade = "D"
        } else {
            grade = "F"
        }
        
        // 간단하게 표현하는 방법
    //    var score1 = score / 10
    //    switch score1 {
    //    case 9, 10: grade = "A"
    //    case 8: grade = "B"
    //    case 7: grade = "C"
    //    default: grade = "F"
    //    }
    
        return grade
    }
    
    print(calcGrade(score: 95))
  • 젯수와 피젯수를 입력받아 몫과 나머지 계산
  • //몫, 나머지 계산
    func divide(firstNumber n1: Int, secondNumber n2: Int) -> (Int, Int) {
        return (n1 / n2, n1 % n2)
    }
    print(divide(firstNumber: 15, secondNumber: 4))
  • 로또 발생기
    • 랜덤 발생 함수 arc4random() 사용 / 반환값 타입은 UInt32형이므로 Int() 로 형변환
    • Set.sorted() : 순서가 생김 -> Array
    • // 로또 발생기
      func getRandomNum() -> [Int] {
          var lotto:Set<Int> = []
          
          while lotto.count < 6 { // 중복이 얼마나 될 지 모르기 때문에 횟수를 알 수 없음
              lotto.insert(Int(arc4random() % 45 + 1)) // 1 ~ 45
          }
      
          return lotto.sorted() // Array를 반환
      }
      
      print(getRandomNum())

 

** 함수의 형

  • 함수도 매개변수와 반환값에 따라서 형(Type)이 나뉨
// 함수의 형(Type)
// ()->() 형
func helloWorld1() {
    print("Hello World")
}

let func1:()->() = helloWorld1 // 함수이름으로 주소 참조
func1()

let func2 = helloWorld1 // 형추론 가능
func2()

// (String)->() 형
func helloWorld2(name:String) {
    print("Hello world \(name)님")
}

let func3:(String)->() = helloWorld2
func3("미지")

let func4 = helloWorld2
func4("미지")


func greeting1(name:String) {
    print("Hello \(name)")
}

 

 

** 함수형 매개변수 및 반환값

  • 일처리 순서가 중요할 때, 매개변수로 함수를 넣어서 순차적으로 함수를 발생시켜 진행함
// 매개변수로 함수 사용
func greeting2(name:String, gfunc:(String)->()) {
    gfunc(name)
}

greeting2(name: "서미지", gfunc: greeting1)

// 출력값이 함수
func greeting3() -> (String)->() {
    return greeting1
}

let greet = greeting3() // (String)->() 생략
greet("미지서")

 

 

 

'iOS Development > Swift' 카테고리의 다른 글

[Swift] #6 - Class  (0) 2021.09.03
[Swift] #4 - Collections  (0) 2021.08.30
[Swift] #3 - 흐름 제어  (0) 2021.08.27
[Swift] #2 - 연산자  (0) 2021.08.26
[Swift] #1 - 상수와 변수  (0) 2021.08.26