함수와 메소드(method)의 차이
| 특성 | 함수 | 메소드 |
| 독립적인 코드 블록 | 클래스, 구조체, 열거형 내부에 정의된 함수 | 클래스, 구조체, 열거형 내부에 정의된 함수 |
| 소속 | 독립적, 어디에도 속하지 않음 | 특정 클래스나 객체에 속함 |
| 호출 방식 | 단독으로 호출 가능 | 해당 클래스의 객체를 통해 호출 |
| 프로그래밍 패러다임 | 주로 절차적 프로그래밍에서 사용 | 객체 지향 프로그래밍의 핵심 개념 |
| 접근성 | 전역적으로 접근 가능한 경우가 많음 | 해당 클래스의 인스턴스나 객체를 통해서만 접근 가능 |
| 사용 목적 | 일반적인 기능 수행 | 객체의 행동을 정의 |
| this/self 키워드 | 사용하지 않음 | 객체 자신을 참조하기 위해 사용 가능 |
| 상속 | 해당 없음 | 상속 가능 |
argument Vs. parameter
| 특성 | parameter | argument |
| 정의 | 함수나 메소드를 정의할 때 선언되는 변수 | 함수나 메소드를 호출할 때 전달되는 실제 값 |
| 역할 | 함수가 받을 수 있는 입력의 유형과 수를 정의 | 함수 실행 시 실제 데이터를 제공 |
| 위치 | 함수 선언/정의에 나타남 | 함수 호출 시 사용됨 |
| 예시 코드 | def add(x, y): (x와 y가 parameters) | result = add(5, 3) (5와 3이 arguments) |
| 기본값 설정 | 기본값을 가질 수 있음 | 기본값을 가질 수 없음 |
| 범위 | 함수 내에서 지역 변수로 작동 | 함수 외부의 변수나 리터럴 값일 수 있음 |
| 유연성 | 함수의 예상 입력을 정의하는 템플릿 역할 | 함수에 다양한 값을 전달하여 동적 실행 가능 |
| 시점 | 함수 정의 시 결정됨 | 함수 호출 시 결정됨 |
| 개수 | 함수 정의에 따라 고정됨 | 호출 시 다를 수 있음 (가변 인자의 경우) |
def add(x, y): # x와 y는 parameters
return x + y
result = add(5, 3) # 5와 3은 arguments

swift 함수 정의 방법
func sayHello() { // swift 언어는 func 리턴값이 없는 void함수들은 생략가능하다
print("hello")
}
sayHello()
swift에서 함수 정의는 func로 지정 하고 리턴값이 없는 함수를 정의 할 경우에는 void를 생략 가능하다
Swift에서 함수는 func 키워드를 사용하여 정의합니다.
func greet(name: String) -> String {
return "Hello, \(name)!"
}
이 함수는:
- greet라는 이름을 가집니다.
- name이라는 String 타입의 매개변수를 받습니다.
- String 타입의 값을 반환합니다.
함수 호출
정의한 함수는 다음과 같이 호출할 수 있습니다:
let greeting = greet(name: "Alice")
print(greeting) // 출력: Hello, Alice!

시험 문제로 나올 수 있음
//
//func sayHello() { // swift 언어는 func 리턴값이 없는 void함수들은 생략가능하다
// print("hello")
//}
//func add(x: Int, y: Int) -> Int {
//return(x+y)
//}
//sayHello()
//
//print(type(of: sayHello)) //() -> (). <- 예상 문제
func add(first x: Int, second y: Int) -> Int {
return(x+y)
}
print(add(first: 10,second: 20))
var x : Int
x = add(first: 10,second: 20)
print(x)
print(type(of: add)) // (Int, Int) -> Int <- 예상 문제 함수의 자료형. add 함수의 이름
중요

Swift 함수명
- 함수명(외부매개변수명:외부매개변수명: ...) <- 중요
- #function 리터럴을 사용하여 얻을 수 있음
func add(x: Int, y: Int) -> Int {
print(#function) // add(_:with:) <- 함수 이름 add(_:_:) add(first:second:)
return(x+y)
}
옵셔널 guard Vs. if
guard let 버전
func multiplyByTen(value: Int?) {
guard let number = value else { return } //guard가 거짓(nil)일 때 else 블록 실행
print(number*10) //조건식이 참일 때 실행, 주의 : number를 guard문 밖인 여기서도 사용 가능
}
multiplyByTen(value: 3) //30
multiplyByTen(value: nil)
multiplyByTen(value: 10)
- guard 문은 조건을 검사하고, 조건이 거짓일 때 else 블록을 실행합니다.
- 여기서는 value가 nil이 아닌 경우에 number라는 상수에 값을 할당합니다.
- value가 nil이면 else 블록이 실행되어 함수가 즉시 종료됩니다.
- guard문의 장점은 옵셔널 바인딩된 number를 guard 문 이후에도 사용할 수 있다는 것입니다.
if let 버전
func multiplyByTen(value: Int?) {
if let number = value {//조건식이 참일 때 블록 실행
print(number*10)
}
else{
print("nil")
return
}
}
multiplyByTen(value: 3) //30
multiplyByTen(value: nil)
multiplyByTen(value: 10)
- if let은 옵셔널 바인딩을 수행합니다. value가 nil이 아닌 경우에만 조건문 내부 블록이 실행됩니다.
- value에 값이 있으면 그 값을 number라는 상수에 할당하고, 조건문 내부 블록을 실행합니다.
- value가 nil이면 조건문 내부 블록을 건너뛰고 함수가 종료됩니다.
디폴트 매개변수(아규먼트) 정의하기
func greet(name: String, greeting: String = "Hello") {
print("\(greeting), \(name)!")
}
greet(name: "Alice") // 출력: Hello, Alice!
greet(name: "Bob", greeting: "Hi") // 출력: Hi, Bob!
inout 파라미터
var myValue = 10
func doubleValue(value: inout Int) -> Int {
value += value
return(value)
}
print(myValue)
print(doubleValue(value: &myValue))
print(myValue)
- inout 키워드는 함수 내에서 파라미터의 값을 변경하고, 그 변경사항을 원래 변수에 반영할 수 있게 해줍니다.
- inout 파라미터를 사용할 때는 함수 호출 시 변수 앞에 &를 붙여야 합니다. 이는 해당 변수의 메모리 주소를 전달한다는 의미입니다.i
- nout 파라미터는 값이 함수로 전달되고(in), 함수 내에서 수정되며(out), 함수 종료 시 원래 변수에 다시 할당됩니다(out).
print(myValue) // 출력: 10
print(doubleValue(value: &myValue)) // 출력: 20
print(myValue) // 출력: 20
- 1. 첫 번째 print(myValue)는 초기값 10을 출력합니다.
- 2. doubleValue(value: &myValue) 호출:
- myValue의 값(10)이 함수로 전달됩니다.
- 함수 내에서 value += value로 값이 20으로 변경됩니다.
- 변경된 값 20이 반환되어 출력됩니다.
- inout 파라미터이므로 변경된 값이 원래 변수 myValue에 반영됩니다.
- 3. 마지막 print(myValue)는 20을 출력합니다. 이는 inout 파라미터로 인해 myValue의 값이 함수 내에서 변경되었음을 보여줍니다.