Swift - 함수

이원석·2024년 11월 19일

Swift

목록 보기
13/38

함수

func 키워드로 생성

  • 메서드 : 클래스, 구조체, 열거형 속에 포함되어 있는 함수
  • 클로저(Closure) : 클로저라고 하면 보통 익명 함수(Unnamed Closure)를 뜻하지만 func 키워드를 이용해 이름을 붙여주는 함수도 모두 클로저이다. Named Closure를 함수라고 부른다

선언

func name(parameters) -> ReturnType {

}

Argument Label, Parameter Name

  • Argument Label : 함수를 호출할 때 사용하는 이름
  • Parameter Name : 함수 내에서 사용할 파라미터 이름
func sayHello(to name: String) {//Argument Laberl : to, Parameter Name : name
	print("Hello, \(name)")
}

sayHello(to: "abc")
  • Argument Label은 _(underbar)로 생략가능
  • 첫번 째 Argument Label _가 기본 값
  • Parameter Name은 생략 불가능
func sayHello(_ name: String){//  func sayHello(name: String)
	print("Hello, \(name)")
}
sayHello("abc")
  • Argument Label & Parameter Name 한번에 명시가능
    (name: Type, name: Type) 이런식으로 선언할 경우 Argument Label이 Parameter Name이 됨
func sayHello(name: String){//  func sayHello(name: String)
	print("Hello, \(name)")
}
sayHello(name: "abc")

Return Type

->를 쓰고 그뒤에 Return하고자 하는 Type 명시

func sayHello(name: String) -> String{
	return name
}

func sayHello(name: String) {}//리턴 타입이 없을경우

파라미터로 전달되는 Value 타입의 값은 복사된 상수 값

  • Value 타입의 값은 복사돼서 전달된다 이때 복사된 값은 상수이다 = 변경 불가
func sayHello(name : String){
	name = "abc" // 에러
}

파라미터로 전달되는 Reference 타입의 값은 참조된다

  • Reference Type의 값을 파라미터로 전달할 경우, 참조로 전달된다
func changeName(human: Human){
	human.name = "abc"
}

let person = Human.init(name: "edf", age: 10)
changeName(human: person)
print(person.name) // abc

In-Out Parameters : Value 타입의 값을 참조로 전달하는 방법

1. 함수 파라미터 선언할 때 inout 키워드 작성

func sayHello(name: inout String) {}

2. 함수를 호출할 때 Argument 앞에 & 붙이기

sayHello(name: &name)
  • inout 파라미터는 파라미터 기본값 설정, 가변 파라미터 등을 지원하지 않음

파라미터에 기본 값 설정하기

  • 파라미터에 기본 값을 설정한 경우, 호출 시 파라미터를 생략해도 된다
func sayHello(name: String = "Stranger"){
	print("Hello, \(name)")
}

sayHello()
sayHello(name: "abc")

가변 파라미터

  • 하나의 파라미터가 여러 개의 아규먼트를 받을 때 사용한다. 가변 파라미터의 타입은 배열이다
  • Type 뒤에 ...을 붙임
  • 가변 파라미터는 기본값을 가질 수 없고, 하나의 파라미터만 가변 파라미터로 사용 가능
func printSum(of nums: Int...) {} //nums이라는 가변 파라미터는 Int형 배열이 됨

printSum(of: 1,2,3,4) 

func printSum2(of nums: Int..., initValue: Int){ }
printSum(of: 1,2,3,4, initValue: 100)
// 가변 파라미터는 ,를 이용하기 때문에 가변 파라미터 뒤에있는 파라미터는 무조건 Argument Label을 가짐

중첩 함수(Nested Function)

다른 함수 안에 포함되어 있는 함수

  • outer 함수 내에서 inner 함수를 실행 할 순 있지만, outer 함수 외부에선 inner 함수 실행 불가
func outer(){
	print("outer")
    
    func inner(){
    	print("inner")
    }
    inner()// 가능
}
inner() 불가능
  • outer 함수에서 inner 함수를 return 할 경우 외부에서 inner 함수 실행 가능
func outer() -> () -> (){
	print("outer")
    
    func inner(){
    	print("inner")
    }
    return inner()
}
let inner = outer()
inner() // 가능

함수 표기법

  • 함수를 표기하는 방법

파라미터가 있는 함수 표기법

// 함수										 // 표기법
func sayHello(name: String )   { }            // sayHello(name:)
func sayHello(_ name: String ) { }            // sayHello(_:)
func sayHello(to name: String) { }            // sayHello(to:)
func sayHello(name: String, age: Int) { }     // sayHello(name:age:)

파라미터가 없는 함수 표기법

// 함수								  // 표기법
func sayHello() { }                    // sayHello
func sayHelloToSodeul() { }            // sayHelloToSodeul

함수 타입

  • Swift에서 함수는 자료형을 가지고 있고 이것을 함수 타입이라고 함
    (Parameter Type) -> Return Type
    함수 타입에서는 Parameter Type, Return Type 둘다 생략 불가능

파라미터가 없는 함수 타입

// 함수              // 함수타입
func sayHello() {}  // () -> ()

파라미터가 있는 함수 타입

// 함수                                                                 // 함수타입
func sayHello(_ name: String) {}                                       // (String) -> ()
func sayHello(_ name: String, _ age: Int, alias: String) -> String {}  // (String, Int, String) -> String
  • 가변 파라미터일 경우(Int...) -> (), 입출력 파라미터일 경우 (inout Int, inout Int) -> ()

일급 객체 함수

  • swift는 객체지향 언어인 동시에 함수형 언어
  • 함수가 1급 객체로 취급
    일급객체(First-class Object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.

일급 객체 조건

1. 변수나 상수에 함수를 대입할 수 있어야 한다.
해당 변수나 상수가 함수 자체 처럼 쓰이는 것
1. 함수 이름으로 대입
오버로딩 된 경우 같은 이름의 함수가 여러 개이기 때문에 에러

func sayHello(_ name: String) {}
let f = sayHello
  1. 타입 어노테이션을 통해 함수 타입을 명시해주기
    파라미터 타입 & 리턴 타입이 동일한 함수가 존재할 경우 에러
func sayHello(_ name: String) {}
func sayHello(_ name: String, _ age: Int) {}

let f: (String) -> () = sayHello
  1. 함수 표기법을 통해 대입하기
func sayHello(name: String) {}
func sayHello(_ name: String) {}

let f = sayHello(name:) 
  1. f는 실행 결과가 아니라 함수이다
f("abc") // 함수 실행, Argument Label을 사용할 경우 에러

2. 함수의 반환 타입으로 함수를 사용할 수있다.

func outer() -> () -> () { // 처음 '()' 은 outer 파라미터 뒤의 '() -> ()' 은 outer 리턴타입(inner 함수 타입)
    func inner() {
        print("inner!")
    }
    
    return inner
}

let f = outer()
f()

3. 함수의 파라미터로 함수를 전달할 수 있다.
콜백함수에서 많이 사용

  • 파라미터의 타입을 함수 타입으로 작성
func doSomething(_ callback: () -> ()){
	callback()
}
  1. 함수(Named Closure)로 넘겨주기
func success(){
	print("success!")
}
doSomething(success)
  1. 클로저(Unnamed Closure)로 넘겨주기
doSomthing{
	print("Success!")
}
  1. 파라미터가 있을 경우
func doSomething(_ callback: (String) -> ()) {
    callback("abc")
}

doSomething{message in
	print("Success!"+message)
}

참조
개발자 소들이

0개의 댓글