iOS프로그래밍기초(Smile Han)/문법 정리

[Swift] 문법 정리 - 함수, 메서드(method)

wse46 2024. 10. 6. 17:41
https://youtu.be/R8OWOgCNt4M?si=bldau6gYEZ3seGj2

위 영상을 보고 정리한 글입니다. (16:23 ~ 22:01)
 
 
# 함수
함수는 특정 작업을 수행하는 코드 블록이다.
함수를 수행하기 위하여 데이터가 제공될 수 있으며, 함수를 호출한 코드에 작업한 결과를 반환할 수도 있다.
 
매개변수(parameter, 인자) vs 인수(argument)
 
함수 - 자판기
인수 : 호출 시의 값 - 내가 가진 동전
매개변수 : 정의부의 값 - 자판기 안에 넣은 내 동전
리턴값 (return value) - 자판기에서 나온 음료수

import Foundation

func fun(param: Int)
{
    print(param)
}

func main()
{
    let argument = 10 // Argument(인수)
    fun(param: argument) // 10을 매개변수로 전달
}

main() // main 함수 호출

 
 
# 메서드 (method)
메서드는 튿정 클래스, 구조체, 열거형 내의 함수를 의미한다.
함수를 스위프트 클래스(Swift Class) 내에 선언하면 메서드라 부름
 
 
Swift 함수 선언

func <함수명> (<매개변수 이름>: <매개변수 타입>, <매개변수 이름>: <매개변수 타입>,...) -> <반환값 타입> {
	// 함수 코드
}

func : 함수라는 것을 스위프트 컴파일러에게 알려주는 키워드
<함수명> : 함수에 할당되는 이름
<매개변수 이름> : 함수 코드 내에서 참조되는 매개변수의 이름
<매개변수 타입> : 함수에 전달되는 매개변수의 타입
<반환값 타입> : 함수가 반환하는 결과에 대한 데이터 타입.
* 반환하지 않으면(Void) '반환값 타입(Void)'과 '->'생략 가능
 

  • 매개변수를 받지 않으며 결과를 반환하지도 않고 오직 메시지만 출력
func sayhello() { // 리턴값 없으면(-> Void) 지정하지 않아도 됨
	print("Hello")
}

 

  • 하나의 문자열과 하나의 정수를 매개변수로 받아서 문자열을 반환
func meeages(name: String, age: Int) -> String {
	return("\(name) \(age)")
}

 
 
Swift 함수 정의, 호출

func sayHello() { // -> Void
	print("Hello")
}
sayHello() // 함수 호출

 
 
C 언어를 Swift 함수로 변경하기

  • C, C++
int add(int x, int y) {
	return(x + y);
}
add(10, 20);
  • Swift
func add(x: Int, y: Int) -> Int {
	return(x + y)
}
add(x:10, y:20)

 
내부 매개변수 이름과 외부 매개변수 이름

func add(first x: int, second y: Int) -> Int {
      // 외부 내부: 자료형, 외부 내부: 자료형 -> 리턴형
	return(x+y)
// 함수 정의할 때는 내부 매개변수명을 사용, return(first+second) 는 오류
}	
add(first:10, second:20) // add(x:10, y:20)은 오류
// 함수 호출할 때는 외부 매개변수명을 사용

 

  • 외부 매개변수명 생략하면 내부 매개변수명이 외부 매개변수명까지 겸함
func add(x: Int, y: Int) -> Int {
	return(x+y)
}
add(x:10, y:20)

 
 
Swift 함수 실습

// 1
func add(x: Int, y: Int) -> Int {
	return(x+y)
}
print(add(x:10, y:20))

// 2
func add(first x: Int, second y: Int) -> Int {
	return(x+y)
}
print(add(first:10, second:20))

// 3
func add(_x: Int, _y: Int) -> Int {
	return(x+y)
}
print(add(10, 20))

// 4
func add(_x: Int, with y: Int) -> Int {
	return(x+y)
}
print(add(10, with:20))
  1. 외부 매개변수명 생략하는 경우
    - 내부 매개변수명이 외부 매개변수명까지 겸함
  2. 외부 매개변수명 : 호출할 때 사용, 내부 매개변수명 : 함수 내부에서 사용

  3. 외부 매개변수명을 생략하는 경우
    - 다른 언어처럼 호출 가능하지만 추천하지 않음

  4. 첫번째 외부 매개변수명만 생략하는 경우
    - Objetct-C언어의 호출 방식이 이러함
    - 두번째 매개변수부터는 외부 매개변수 사용
    - 제일 많이 쓰는 방법

 
디폴트 매개변수 정의하기
 
인자(argument)로 전달하는 값이 없는 경우, 디폴트 매개변수 값을 사용
함수를 선언할 때 매개변수 디폴트 값을 할당
 

  • 이름이 인자로 전달되지 않을 경우에 디폴트로 "Kim" 이라는 문자열이 사용되도록 함
  • 고객 이름 값을 전달하지 않고도 호출할 수 있는 함수가 됨
  • 고객 이름을 가지고 함수를 호출하면 argument를 참조
func buildMessage(count: Int, name: String = "Kim") -> String {
	return ("\(name), you are customer number \(count)")
}

var message = buildMessage(count : 100)
print(message) // Kim, you are customer number 100

var message2 = buildMessage(count : 100, name : "Lee")
print(message2) // Lee, you are customer number 100

 
 
함수로부터 여러 개의 결과 반환하기
 
함수는 여러 결과 값들을 튜플로 감싸서 반환할 수 있음
 

  • 인치 단위의 수를 매개변수로 받아 야드, 센티미터, 미터로 변환하고 이 세 개의 값을 하나의 튜플에 넣어 반환
func sizeConverter(length: Float) -> (yards: Float, centimeters: Float, meters: Float) {
	let yards = length * 0.0277778
    let centimeters = length * 2.54
    let meters = length * 0.0254
    return (yards, centimeters, meters)
}

var lengthTuple = sizeConverter(length:20)
print(lengthTuple.yards)
print(lengthTuple.centimeters)
print(lengthTuple.meters)

 
 
2개의 정수를 입력받아 가감승제, 나머지 리턴

func sss(x: Int, y: Int) -> (sum: Int, sub: Int, mul: Int, div: Double, mod: Int) {
    let sum = x + y
    let sub = x - y
    let mul = x * y
    let div = Double(x) / Double(y)
    let mod = x % y
    return (sum, sub, mul, div, mod)
}

var result = sss(x: 15, y: 14)
print("Sum: \(result.sum)")   // 합
print("Subtraction: \(result.sub)") // 차
print("Multiplication: \(result.mul)") // 곱
print("Division: \(result.div)") // 나눗셈
print("Modulus: \(result.mod)") // 나머지

 

  • swift print format으로 구글링하여 소수점 원하는 만큼 출력
func sss(x: Int, y: Int) -> (sum: Int, sub: Int, mul: Int, div: Double, mod: Int) {
    let sum = x + y
    let sub = x - y
    let mul = x * y
    let div = Double(x) / Double(y)
    let mod = x % y
    return (sum, sub, mul, div, mod)
}

var result = sss(x: 15, y: 14)

// 원하는 소수점 자리수로 출력
let decimalPlaces = 2  // 소수점 자리수 설정
let formatString = "%.\(decimalPlaces)f"

print("Sum: \(result.sum)")                          // 합
print("Subtraction: \(result.sub)")                  // 차
print("Multiplication: \(result.mul)")               // 곱
print("Division: \(String(format: formatString, result.div))") // 나눗셈, 소수점 자리수 지정
print("Modulus: \(result.mod)")                      // 나머지

 
 
가변 매개변수(variadic parameter)
 
함수가 지정된 데이터 타입으로 개수에 상관없이 매개변수를 받는다면 세 개의 점(...) 사용

  • 임의의 개수의 String 값을 매개변수로 받아서 콘솔에 출력
Func displayStrings(strings: String...)
{
	for string in strings {
    	print(string)
    }
}
displayString(strings: "one", "two", "three", "four")
displayString(strings: "one", "two")
  • 임의의 개수의 정수 값의 합을 출력하는 함수를 작성하여 호출하기
add(numbers:1,2,3) //6
add(numbers:2,2,2,2,2) //10
add(numbers1,1,1,1,1,1,1,1,1,1) //10
add numbers:1,1,1,1) //4

 
 
inout 매개변수 : call by reference 구현
 
Swift는 기본적으로 call by value
Swift에서 call bt reference를 구현하는 방법
 
함수가 값을 반환한 후에도 매개변수에 일어난 변화를 유지하려면, 함수의 선언부에서 매개변수를 입출력 매개변수(in-out parameter)로 선언해야 함
 
Swift 3에서는 inout의 위치가 바뀜

  • Swift 2, 지금은 오류
var myValue = 10
func doubleValue (inout value: Int) -> Int {
	value += value
    return(value)
}
doubleValue(value:&myValue)

 

  • Swift 3 이후
var myValue = 10
func doubleValue (value: inout Int) -> Int {
		//call by reference하고 싶은 매개변수의 자료형 앞에 inout 씀)
	value += value
    return(value)
}
print(myValue)
print(doubleValue(value : &myValue) //출력 값? 레포트
		//call by reference하고 싶은 변수에 & 붙여서 호출
print(myValue)

 
 
함수를 매개변수로 사용
 
Swift는 함수를 데이터 타입처럼 처리할 수 있음
 
다음과 같이 함수를 상수 또는 변수에 할당하는 것이 가능

func inchesToFeet (inches: Float) -> Float {
return inches * 0.0833333
}
let toFeet = inchesToFeet //함수를 자료형처럼 사용

 
 
함수를 호출하려면 원래의 함수 이름 대신에 상수 이름을 이용하여 호출 가능

var result = toFeet(10) //inchesToFeeet(10)

 
 
어떤 함수에 다른 함수를 매개변수나 반환 값으로 함수를 사용할 수 있음
- Swift 함수는 1급 객체(first class object) 또는 1급 시민(first class citizen)
 
 
매개변수로 함수를 받으려면, 함수를 받게 될 함수는 함수의 데이터 타입을 선언함

func addTwoInteger(x: Int, y: Int) -> Int {
	return(x + y)
}
  • 함수 타입 : (Int, Int) -> Int
  • 입력 타입 : 두 개의 매개변수로 각각 Int 타입을 받음
  • 출력 타입 : 반환값은 Int 타입

 

19:58

함수를 매개변수나 리턴값으로 사용