day_by_day

7. 함수 본문

QA Automation/swift5

7. 함수

kokorii_ 2023. 6. 20. 23:04
  • 스위프트에서 함수는 일급 객체 : 하나의 값으로 사용할 수 있음
  • 협업자끼리 코딩 규칙을 만들고 함수를 사용하는 것이 바람직

7.1 함수와 메서드

함수와 메서드는 기본적으로 같으며 어디서 사용되느냐에 따라 이름이 다를 뿐임

  • 메서드 : 구조체, 클래스, 열거형 등 특정 타입에 연관되어 사용되는 함수
  • 함수 : 모듈 전체에서 전역적으로 사용할 수 있는 함수

7.2 함수의 정의와 호출

재정의(오버라이드)와 중복 정의(오버로드) 모두 지원

7.2.1 기본적인 함수의 정의와 호출

  • 기본 형태
func 함수 이름(매개변수...) -> 반환 타입 {
	실행 구문
	return 반환값
}
  • 예제
func hello(name: String) -> String {
	return "Hello \\(name)!"
}

let helloJenny: String = hello(name: "Jenny")
print(helloJenny)
func introduce(name: String) -> String {
	"my name is + name"
}

let intro: String = introduce(name: "Jenny")
print(intro)
  • return 생략 : 함수 내부의 코드가 단 한줄의 표현이고, 그 표현의 결과값의 타입이 함수의 반환 타입과 같을 경우 생략 가능

7.2.2 매개변수

  • 매개변수와 전달인자 : introduce 예제에서 name은 매개변수, “Jenny”는 전달인자

매개변수가 없는 함수

func hello() -> String {
	return "Hello, World"
}

print(hello())

매개변수가 여러개인 함수

func hello(name: String, yourname: String) -> String {
	return " Hello \\(yourname), my name is \\(name) "
}

print(hello(name: "blair", yourname: "yagom"))
  • 매개변수 이름 : name, yourname

매개변수 이름과 전달인자 레이블

  • 함수 외부에서 매개변수의 역할을 좀 더 명확히 하기 위해 전달인자 레이블 지정
  • 사용 형태
func 함수 이름(전달인자 레이블 매개변수 이름: 매개변수 타입, 전달인자 레이블 매개변수 이름: 매개변수 타입 ...) -> 반환 타입 {
실행 구문 
return 반환값
} 
  • 예제
    • 이때 함수 내부에서 전달인자 레이블을 사용할 수 없으며, 함수를 호출할때는 매개변수 이름을 사용할 수 없음
func sayHello(from myName:String, to name:String) -> String {
	return "\\(name)! I'm \\(myName)"
}
print(sayHello(from: "yagom", to: "Jenny"))
  • 와일드 카드 식별자 사용
    • 전달인자 레이블을 사용하고 싶지 않을 때
func sayHello(_ name: String, _ times: Int) -> String {
	var result: String = ""

	for _ in 0..<times {
		result += "Hello \\(name)"
	}

	return result

}

print(sayHello("heejin", 2))
  • 전달인자 레이블이 달라지면 함수가 달라지는 것으로, 함수 오버로드(중복정의) 가능
func sayHello(to name: String, _ times: Int) -> String { .... }

func sayHello(to name: String, repeatCount time: Int) --> String {...} 

//두개는 다른오버로드 된 다른 함수

매개변수 기본값

  • 매개변수마다 기본갑슬 지정할 수 있으며, 매개변수가 전달되지 않으면 기본값을 사용
  • 기본값이 있는 매개변수는 가장 뒤에 명시
  • print 함수의 원형
    • terminator 의 기본값은 \n
    • separator 의 기본값은 공백, items 매개변수를 통해 들어온 값을 분리해서 표시해주는 문자열
public func print( _ items: Swift.Any..., separator: String = default, terminator: String = default)

가변 매개변수

  • 매개변수로 몇개의 값이 들어올지 모를 때 가변 매개변수 사용
  • 가변매개변수는 0개 이상의 값을 반아올 수 있음
  • 함수마다 가변 매개변수는 하나만 가질 수 있음
func helloToFriends(me: String, friends names: String...) -> String {
	var result: String = ""

	for friend in names {
		result += "hello \\(friends)"
	}

	result += " I\\'m" + me
	return result
}

print(helloToFriends(me: "yagom", friends: "jay", "blair")

print(helloToFriends(me: "blair")

입출력 매개변수

  • 함수의 전달인자로 값을 전달할 때는 보통 값을 복사해서 전달한다. 이때 값이 아닌 참조를 전달하려면 입출력 매개변수를 사용한다.
  • 함수 외부의 값에 어떤 영향을 줄지 모르기 때문에 함수형 프로그래밍 패러다임에서는 지양
  • 입출력 매개변수는 매개변수 기본값을 가질 수 없으며, 가변 매개변수로도 사용할 수 없음
var nums: [Int] = [1,2,3]

func nonRefer(_ arr: [Int]) {
	var copyArr: [Int] = arr
	copyArr[1] = 1
}

func refer(_ arr: inout [Int]) {
	arr[1] = 1 
}

nonRefer(nums)
print(nums[1]) //  = 2

refer(nums)
print(nums[1]) // = 1 

7.2.3 반환이 없는 함수

  • 반환 값이 없는 함수는 반환 타입을 Void로 표기하거나 생략
func sayHello() { ...}

func sayHello(from name: String) { ... }

func saygoodbye() -> Void { ... }

7.2.4 함수의 데이터 타입

(매개변수 타입의 나열) -> 반환 타입
  • 함수 타입의 사용 예시
typealias CalculateTwoInts = (Int, Int) -> Int

func addTwoInts(_ a: Int, _ b: Int) -> Int {
  return a + b
}

func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
  return a * b
}

var mathFunction: CalculateTwoInts = addTwoInts
print(mathFunction(2, 5))

mathFunction = multiplyTwoInts
print(mathFunction(2,5))
  • 이밖에 전달인자로 함수를 전달할 수도 있음
func chooseMathFunction(_ toAdd: Bool) -> CalculateTwoInts {
	return toAdd ? addTwoInts : multiplyTwoInts
}
  • 전달인자 레이블과 함수의 타입
let someFunction: (lhs: Int, rhs: Int) -> Int //오류
let someFunction2: (_ lhs: Int, _ rhs: Int) -> Int // OK
let someFunction3: (Int, Int) -> Int // OK

7.3 중첩 함수

  • 함수 안에 함수를 넣을 수 있다
typealias MoveFunc = (Int) -> Int

func functionForMove(_ shouldGoLeft: Bool) -> MoveFunc { 

	func goRight(_ currentPosition: Int) -> Int {
		return currentPosition + 1
	}
}

7.4 비반환 함수(종료되지 않는 함수)

  • 비반환 함수 안에서는 오류를 던지거나, 중대한 시스템 오류를 보고하는 등의 일을 하고 프로세스를 종료해 버린다.
  • 어디서든 호출이 가능하며, guard 구문의 else 블록에서도 호출 할 수 있다.
  • 비반환 함수의 반환 타입은 Never로 명시
func crashAndBurn() -> Never {
  fatalError("Something very, very bad happend")
}

func someFunction(isAllIsWell: Bool) {
  guard isAllIsWell else {
    print("마을에 도둑이 들었습니다")
    crashAndBurn()
  }
  
  print("All is Well")
}

someFunction(isAllIsWell: true)
someFunction(isAllIsWell: false) // 프로세스 종료 후 오류 보고

7.5 반환 값을 무시할 수 있는 함수

의도적으로 함수의 반환 값을 사용하지 않을 경우 반환값을 무시해도 된다는 @discardableResult 를 함수 func 키워드 앞에 선언

'QA Automation > swift5' 카테고리의 다른 글

9. 구조체와 클래스  (0) 2023.06.21
8. 옵셔널(Optional)  (0) 2023.06.20
6. 흐름제어  (0) 2023.06.20
5. 연산자  (0) 2023.06.20
4. 데이터 타입 고급  (0) 2023.06.20