상세 컨텐츠

본문 제목

[Day12, 13] Function : 함수의 기본 개념(1), (2)

Swift&SwiftUI

by (방울)도마토 2024. 4. 23. 14:14

본문

함수(Function)

- 프로그램의 실행 과정 중에서 독립적으로 처리될 수 있는 부분을 분리하여 구조화한 객체 

- 외부에 의존하는 부분없이 툭 떼어 분리할 수 있는 실행 단위를 일종의 캡슐처럼 포장 

 

함수의 인자값과 반환값

- 인자값 : 하나도 없을 수도 있고, 하나 이상일 수도 있음 

- 반환값 : 특정값을 반환하는 형태와 값이 없는 형태 

    - 특정 값을 반환하더라도 그 값의 갯수는 일반적으로 하나 

    - 둘 이상의 값을 반환해야 할 필요가 있다면 반환할 값들을 집단 자료형 하나에 담아 반환해야 함 

    → 반환하는 값이 여러 개더라도, 반환하는 단위는 하나 

 

함수 : 일반함수, 사용자 정의 함수

일반함수 : 프로그래밍 언어나 프레임워크 수준에서 제공하는 함수, 기본적인 데이터의 처리나 연산 등을 수행하기 위한 목적 

    - 예) print()

 

사용자 정의 함수

- 언어나 프레임워크가 제공하는 함수만으로 충분하지 않는 경우가 많음 → 원하는 기능을 실행해 줄 함수를 직접 만들어 사용

 

함수의 이점

- 동일한 코드가 여러 곳에서 사용될 때 이를 함수화하면 재작성할 필요 없이 함수 호출만으로 처리할 수 있음 

- 전체 프로세스를 하나의 소스 코드에서 연속적으로 작성하는 것보다 기능 단위로 함수화하면 가독성이 좋아지고, 코드와 로직을 이해하기 쉬움 

- 비즈니스 로직을 변경해야 할 때 함수 내부만 수정하면 되므로 유지보수가 용이함

 

 

 

사용자 정의 함수

func 함수이름(매개변수1: 타입, 매개변수2: 타입, ...) -> 반환 타입 {
    실행내용
    return 반환값
}

// 매개변수(Parameter)가 생략된 함수 
func 함수이름() -> 반환 타입 {
    실행내용
    return 반환값
}

// 반환값이 전혀 없는 함수, void 타입을 반환 
func 함수이름(매개변수1: 타입, 매개변수2: 타입, ...) {
    실행내용
}

- 함수의 이름 : +, -, *, / 와 같은 연산자나 예약어 사용 불가, 첫 글자는 반드시 영어 또는 _(언더바)로 시작 

    - 함수명은 함수의 기능을 명확하게 드러낼 수 있도록 짓기 

 

- 매개변수 : 함수가 호출될 때 전달되는 입력값을 대입받기 위한 변수

- 반환 타입 : 함수 내부에서 생성된 값을 외부로 전달할 때의 타입 

    - 반환 타입이 지정되면 반드시 그 타입에 맞는 값을 반환해야 함 

    - 예) 반환 타입 : Optional → 반환 : nil(O), "Hello"(X)

    - void : 반환값이 전혀 없는 함수 

 

- return

    - 함수 내부에 작성된 구문이 모두 실행되고 나면 처리 결과값을 반환 → return 

    - 함수는 값을 반환하고 나면 실행이 종료되므로 사실상 return 구문이 함수의 종료 구문

 

 

 

함수를 실제로 정의하는 모습

// 1. 매개변수와 반환값이 모두 없는 함수 
    // () : 매개변수를 선언하기 위한 영역 표시 기호
func printHello() {
    print("안녕하세요")
}

// 2. 매개변수가 없지만 반환값이 있는 함수 
func sayHello() -> String {
    let returnValue = "안녕하세요"
    return returnValue
}

// 3. 매개변수는 있으나 반환값이 없는 함수 
func printHelloWithName(name: String) {
    print("\(name)님, 안녕하세요")
}

// 4. 매개변수와 반환값이 모두 있는 함수 
func sayHelloWithName(name: String) -> String {
    let returnValue = "\(name)님, 안녕하세요"
    return returnValue
}

 

- return 키워드에 의해 반환되는 값은 함수의 정의 부분에서 사용된 반환 타입과 일치해야 함 

    - 예) returnValue → String으로 반환되어야 함 

 

- 반환값이 없는 함수일 경우에도 return 키워드를 사용하는 경우 → return 함수의 실행을 명시적으로 종료할 목적 

    - 옵셔널 바인딩이 실패했을 경우 return 구문을 호출하여 실행을 종료 

func hello(name: String?) {
    guard let _name = name else {
        return
    }
    
    print("\(_name)님, 안녕하세요!")
}

 


 

함수의 호출 

- 함수를 실행하는 것 

printHello()
// () : 함수 호출 연산자

- 매개변수를 가지고 있는 함수를 호출할 때는 괄호 안에 인자값을 넣어서 호출해야 함 

    - 인자값은 앞에서 정의된 매개변수 타입과 일치해야 함 

// 3번 함수 호출 
let inputName = "홍길동"
printHelloWithName(name: inputName)
    // 홍길동님, 안녕하세요
    
printHelloWithName(name: "홍길동")
    // Literal : 인자값으로 변수나 상수 대신 넣어주는 실제 값

 

- 인자 레이블

    - 함수 호출 시 인자값을 구분하기 위해 사용되는 레이블 

    - 스위프트에서 인자값이 잇는 함수를 호출할 때에는 인자값 앞에 인자 레이블을 붙여서 호출해야 함 (if X → 컴파일 오류)

    예) name: 

    - 일반적으로 인자 레이블은 매개변수명과 동일  

 

func incrementBy(amount: Int, numberOfTimes: Int) {
    var count = 0
    count = amount * numberOfTimes
}

// 함수 호출 
incrementBy(amount: 5, numberOfTimes: 2)
    // 매개변수명이자 동시에 인자 레이블로 간주

 

 


 

함수의 반환값과 튜플

- 함수는 반드시 하나의 값만을 반환 

- 여러 개의 값을 반환해야 한다면, 해당 값들을 집단 자료형에 담아 반환해야 함 

    - 집단 자료형 : 딕셔너리, 배열, 튜플, 구조체, 클래스 

// 함수의 반환 타입을 튜플 형태로 정의 
func getIndvInfo() -> (Int, String) {
    let height = 180
    let name = "도마토"
    
    return(height, name)
    // 선언된 타입과 동일한 튜플 반환 
}


func getUserInfo() -> (Int, Character, String) {
    let gender: Character = "W"
        // String으로 타입 추론 되는 것을 예방하기 위해 타입 어노테이션 선언 
    let height = 180
    let name = "도마토"
    
    return (height, gender, name)
}


// 튜플을 반환하는 함수의 반환값을 대입받은 변수나 상수는 튜플 인덱스를 이용, 튜플 내부 요소 사용 가능
var uInfo = getUserInfo()
uInfo.0 // 180
uInfo.1 // "W"
uInfo.2 // "도마토"

// 튜플 요소 각각을 변수로 직접 받을 수도 있음 
var (a, b, c) = getUserInfo()
a // 180
b // "W"
c // "도마토"

// 필요하지 않은 튜플 항목은 언더바를 이용하면 변수 할당 없이 건너뛸 수 있음 
var (height, _, name) = getUserInfo()


// 반환값 설정시 튜플 항목 하나하나에 미리 변수 정의할 수도 있음 
func getUserInfo() -> (h: Int, g: Character, n: String) {
    let gender: Character = "W"
        // String으로 타입 추론 되는 것을 예방하기 위해 타입 어노테이션 선언 
    let height = 180
    let name = "도마토"
    
    return (height, gender, name)
}

// 튜플 인자 타입 앞에 각각의 변수를 붙여 주면, 
// 함수의 결과값을 받은 변수에도 자동으로 바인딩
var result = getUserInfo()
result.h // 180
result.g // "W"
result.n // "도마토"

 

<참조> _ 를 이용하지 않고 임의로 변수 할당을 건너뛰면? 

오류가 뜬다!

 

- 특정 튜플 타입이 여러 곳에서 사용될 경우 typealias를 통해 새로운 축약형 타입 정의

typealias <새로운 타입 이름> = <타입 표현>

 

typealias

- 이름이 길거나 사용하기 복잡한 타입 표현을 새로운 타입명으로 정의해주는 문법 

- 타입에 대한 새로운 표현을 정의하는 역할을 하기 때문에 타입이 아닌 구체적인 값을 상수처럼 사용할 수는 없음 

typealias infoResult = (Int, Character, String)
    // infoResult는 (Int, Character, String) 튜플과 동일한 것으로 취급
    
func getUserInfo() -> infoResult {
    let gender: Character = "W"
    let height = 180
    let name = "도마토"
    
    return (height, gender, name)
} 

let info = getUserInfo()

info.0 // 180
info.1 // "W"
info.2 // "도마토"


// typealias에도 변수를 지정하여 선언 가능함 
typealias infoResult = (h: Int, g: Character, n: String)

func getUserInfo() -> infoResult {
    let gender: Character = "W"
    let height = 180
    let name = "도마토"
    
    return (height, gender, name)
}

let info = getUserInfo()

info.h // 180
info.g // "W"
info.n // "도마토"

 

'Swift&SwiftUI' 카테고리의 다른 글

[Day15] Function: 매개변수(4)  (0) 2024.05.02
[Day14] Function : 매개변수(3)  (0) 2024.05.01
[Day11] Optional(2)  (0) 2024.04.22
[Day10] Optional (1)  (0) 2024.04.19
[Day9] Collective Types (4) : Dictionary  (0) 2024.04.17

관련글 더보기

댓글 영역