Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

브래의 슬기로운 코딩 생활

5 - 함수와 메서드(method) 본문

2 - 겨울방학/Swift 복습

5 - 함수와 메서드(method)

김브래 2023. 12. 27. 15:28

함수

특정 작업을 수행하는 코드 블록

 

수행하기 위하여 데이터가 제공될 수 있으며, 함수를 호출한 코드에 작업한 결과를 반환할 수도 있음
매개변수(parameter,인자)인수(argument)는 차이점이 있음
함수 정의부의 값을 매개변수, 호출시의 값은 아규먼트라고 부름
 

#include <stdio.h>

void Fun( int Param ) // parameter(매개변수, 인자), 형식 매개변수(formal parameter)

{

   printf("%d",Param);

} 

int main()

{

   Fun( 10 ); // 10argument(인수), 실 매개변수(actual parameter)

   return 0;

}

 

매개변수 인자 리턴값

메서드(method)

특정 클래스, 구조체, 열거형 내의 함수
함수를 스위프트 클래스 내에 선언하면 메서드라 부름

함수를 선언하는 방법

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

    // 함수 코드 

}

func ― 함수라는 것을 스위프트 컴파일러에게 알려주는 키워드
<함수명> ― 함수에 할당되는 이름
<매개변수 이름> ― 함수 코드 내에서 참조되는 매개변수의 이름
<매개변수 타입> ― 함수에 전달되는 매개변수의 타입
<반환값 타입> ― 함수가 반환하는 결과에 대한 데이터 타입. 반환하지 않으면(Void) 반환값 타입(Void)->는 생략 가능
 
매개변수를 받지 않으며 결과를 반환하지도 않고 오직 메시지만 출력
func sayHello() {    //리턴값 없으면( -> Void ) 지정하지 않아도 됨
     print("Hello")
}

void sayHello() {   //C, C++

     printf("Hello");

}

 

하나의 문자열과 하나의 정수를 매개변수로 받아서 문자열을 반환

func message(name: String, age: Int) -> String {

       return("\(name)  \(age)")

}

 

스위프트 함수 정의와 호출하기

<함수명> (<인자1>, <인자2>, ... )

 

func sayHello() { //->Void

     print("Hello")

} // 함수 정의

 

sayHello()   //호출

 

C언어에서 Swift 함수 변경

int add(int x, int y)  {     //C, C++            

       return(x+y);

}

cout << add(10,20);

 

func add(x: Int, y: Int) -> Int {  //Swift                

       return(x+y)

}

print(add(x:10, y:20))

 

add함수의 자료형은 print(type(of:add)) // (Int, Int) -> Int

 

내부 매개변수(parameter name) 이름과 외부 매개변수(argument label) 이름

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)

//외부 매개변수명 생략하면 내부 매개변수명이 외부 매개변수명까지 겸함

 

함수명이 궁금해요  : #function 리터럴(literal)

Swift 함수명

함수명(외부매개변수명:외부매개변수명: ...)
 
#function 리터럴을 사용하여 얻을 수 있음

 func add(first x: Int, second y: Int) -> Int { 

  print(#function)  //add(first:second:) 

  return(x+y)

 }

 let a = add(first:10, second:20)

 

함수의 type은 모두 같고 함수은 모두 다름

함수 타입 : print(type(of:add)) 

함수명 : print(#function)

 

디폴트 매개변수(아규먼트) 정의하기

argument로 전달하는 값이 없는 경우, 디폴트 매개변수 값을 사용
함수를 선언할 때 매개변수에 디폴트 값을 할당
이름이 인자로 전달되지 않을 경우에 디폴트로 "길동"이라는 문자열이 사용되도록 함

func sayHello(count: Int, name: String = "길동") -> String {

  return ("\(name), 너의 번호는 \(count)")

}

 
이름을 가지고 함수를 호출하면 argument를 사용

var message = sayHello(count:10, name: "소프트")

//소프트, 너의 번호는 10

 

이름을 전달하지 않고도 호출 가능하며 디폴트로 "길동"을 사용

var message = sayHello(count:100)

print(message) //길동, 너의 번호는 100

 

함수로부터 여러 개의 결과 반환하기

함수는 여러 결과 값들을 튜플로 감싸서 반환할 수 있음
인치 단위의 수를 매개변수로 받아 야드, 센티미터, 미터로 변환하고 이 세 개의 값을 하나의 튜플에 넣어 반환

 

func converter(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 = converter(length:10)

print(lengthTuple)  // (yards: 0.277778, centimeters: 25.4, meters: 0.254)

print(lengthTuple.yards) // 0.277778

print(lengthTuple.centimeters) // 25.4

print(lengthTuple.meters) // 0.254

 

2개의 정수를 입력받아 가감제 리턴

//소수점 3자리에서 반올림

//import Foundation 추가해야 함

 

import Foundation

func sss(x : Int, y : Int) -> (sum : Int, sub : Int, div : Double)

{

    let sum = x+y

    let sub = x-y

    let div = Double(x)/Double(y) //같은 자료형만 연산 가능

    return (sum, sub, div)

}

var result = sss(x:10,y:3)

print(result.sum)

print(result.sub)

print(String(format: "%.3f", result.div))

 

가변 매개변수(variadic parameter)

함수가 가변 매개변수를 받는다는 것을 가리키기 위해서 세 개의 점(…)사용
지정되지 않은 개수의 String 값을 매개변수로 받아서 콘솔에 출력

func displayStrings(strings: String...)

{

  for string in strings {

    print(string)

  }

}

displayStrings(strings: "", "", "", "") 

displayStrings(strings: "one", "two") 

 

임의의 수의 정수 값의 합을 출력하는 함수를 작성하여 호출

add(numbers:1,2,3) //6
add(numbers:2,2,2,2,2)  //10
add(numbers:1,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 by 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))  //10 20 20 //call by reference하고 싶은 변수에 &붙여서 호출

print(myValue)