C 언어에서의 특성Parameter (매개변수)Argument (인수)의 차이
정의 | 함수 선언 및 정의에서 사용되는 변수 | 함수 호출 시 전달되는 실제 값 |
위치 | 함수 헤더에 위치 | 함수 호출 시 괄호 안에 위치 |
역할 | 함수 내에서 사용될 데이터의 타입과 이름을 지정 | 함수에 실제 데이터를 전달 |
개수 | 함수 정의에 따라 고정됨 | 함수 호출 시 parameter 수와 일치해야 함 |
예시 코드 | void func(int a, float b) | func(5, 3.14) |
메모리 | 함수가 호출될 때 스택에 생성됨 | 호출 전에 이미 존재하는 값 |
값 변경 | 함수 내에서 변경 가능 (지역 변수로 작동) | 원본 값은 변경되지 않음 (값에 의한 전달의 경우) |
정의 | 함수 선언 및 정의에서 사용되는 변수 | 함수 호출 시 전달되는 실제 값 |
위치 | 함수 헤더에 위치 | 함수 호출 시 괄호 안에 위치 |
역할 | 함수 내에서 사용될 데이터의 타입과 이름을 지정 | 함수에 실제 데이터를 전달 |
기본값 설정 | 가능 (예: void func(int a = 0)) | 해당 없음 |
참조 전달 | 가능 (예: void func(int& a)) | 변수 자체를 전달 가능 |
상수 참조 | 가능 (예: void func(const int& a)) | 값 또는 변수 전달 가능 |
포인터 | 가능 (예: void func(int* ptr)) | 주소값 전달 |
함수 오버로딩 | 타입과 개수로 구분 | 호출 시 적절한 함수 선택 |
템플릿 사용 | 가능 (예: template<typename T> void func(T arg)) | 다양한 타입 전달 가능 |
가변 인자 | 가능 (예: void func(int count, ...)) | 여러 개의 인수 전달 가능 |
람다 함수 | 매개변수로 사용 가능 | 함수 객체로 전달 가능 |
메모리 할당 | 함수 호출 시 스택에 생성 | 호출 전에 이미 존재하는 값 |
값 변경 | 함수 내에서 변경 가능 (참조 아닌 경우 지역적) | 원본 값은 변경되지 않음 (참조 제외) |
Swift에서 함수를 만들고 사용하는 방법을 예를 들어 설명해드리겠습니다.
함수 정의
Swift에서 함수는 func 키워드를 사용하여 정의합니다.
func greet(name: String) -> String {
return "Hello, \(name)!"
}
이 함수는 name이라는 String 타입의 매개변수를 받아 String 타입의 값을 반환합니다.
함수 호출
정의한 함수는 다음과 같이 호출할 수 있습니다:
let greeting = greet(name: "Alice")
print(greeting) // 출력: Hello, Alice!
매개변수 레이블
Swift에서는 매개변수 레이블을 사용하여 함수 호출 시 가독성을 높일 수 있습니다.
func greet(to name: String) -> String {
return "Hello, \(name)!"
}
let greeting = greet(to: "Bob")
print(greeting) // 출력: Hello, Bob!
여기서 to는 외부에서 사용하는 매개변수 레이블이고, name은 함수 내부에서 사용하는 매개변수 이름입니다.
기본값 매개변수
매개변수에 기본값을 지정할 수 있습니다:
func greet(name: String = "Guest") -> String {
return "Hello, \(name)!"
}
print(greet()) // 출력: Hello, Guest!
print(greet(name: "Charlie")) // 출력: Hello, Charlie!
가변 매개변수
함수가 여러 개의 동일한 타입의 값을 받을 수 있도록 가변 매개변수를 사용할 수 있습니다:
func calculateSum(_ numbers: Int...) -> Int {
return numbers.reduce(0, +)
}
print(calculateSum(1, 2, 3, 4, 5)) // 출력: 15
반환값이 없는 함수
함수가 값을 반환하지 않는 경우, 반환 타입을 생략하거나 Void를 사용할 수 있습니다:
func sayHello(to name: String) {
print("Hello, \(name)!")
}
sayHello(to: "David") // 출력: Hello, David!
이러한 방식으로 Swift에서 함수를 정의하고 사용할 수 있습니다. 함수는 코드의 재사용성과 구조화에 매우 중요한 역할을 합니다.
Xcode에서의 실행 화면입니다.
Xcode에서의 실행 화면입니다.
switf에서 #function을 통해서 함수명을 호출할 수 있습니다.
switf에서의 함수명은 함수명(외부매개변수명:외부매개변수명: ...) 입니다.
func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
return items.count
}
이 함수의 자료형과 함수명은
(UITableView, Int) -> Int
tableView(_ : numberOfRowsInSection)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return cell
}
이 함수의 자료형과 함수명은
(UITableView, IndexPath) -> UITableViewCell
tableView(_ : cellForRowAt)
swift의 if문, grard문
if문은 조건이 참일 때 실행하며, guard문은 조건이 거짓일 때 실행합니다.(서로 반대라고 할 수 있습니다.)
guard문은 return, break, continue, throw 등 제어문 전환 키워드를 쓸 수 있는 상황이라면 사용이 가능합니다.
guard let과 if let의 사용하여 언래핑하였습니다.
이 처럼 if let보다 guard let이 간편하게 사용하며 보기에도 깔끔하다고 할 수 있습니다.
C와 C++에서의 디폴트 매개변수 작성 방법을 비교하여 설명해드리겠습니다.
지원 여부 | 지원하지 않음 | 지원함 |
선언 방법 | 해당 없음 | 타입 함수명(타입 매개변수 = 기본값) |
예시 | 해당 없음 | void greet(string name = "Guest") |
다중 매개변수 | 해당 없음 | void func(int a = 1, int b = 2, int c = 3) |
함수 오버로딩과의 관계 | 해당 없음 | 오버로딩된 함수에서 사용 가능 |
선언 위치 | 해당 없음 | 함수 선언이나 정의에서 가능 |
부분적 사용 | 해당 없음 | 오른쪽부터 순서대로 지정 가능 |
함수가 값을 반환한 후에도 매개변수에 일어난 변화를 유지하려면,
함수의 선언부에서 매개변수를 입출력 매개변수(inout parameter)로 선언해야 합니다.