반응형

 

이번 글은 함수를 정의하는 방법과 호출 방법에 대한 지식을 기본적으로 알고 있어야 이해할 수 글이다. 또한 underscore(_)의 개념을 아직 잘 모르고 있다면 함수 사용 방법에 대한 글을 먼저 읽고 오는 것을 추천한다.

 

함수의 파라미터는 기본적으로 상수(Constant)이다. C, C++, Java, Python 등의 언어에서 함수의 파라미터는 변수로 사용되지만 Swift에서는 상수라는 것이 조금 독특하다. 전달받은 파라미터를 함수 내부에서 변경하려고 시도하면 컴파일 에러가 발생할 것이다. 당연히 변수가 아닌 상수를 변경하려고 시도했기 때문이다.

만약 함수의 파라미터를 함수 내부에서 변경하고 함수가 종료된 후에도 변경한 값이 지속되도록 하려면 변수의 주소값을 넘겨 직접 접근할 수 있도록 도와주는 inout 키워드를 사용하면 된다.

그러면 코드를 통해 어느 상황에, 어떻게 사용해야 하는지 알아보자.

우선 어느 상황에 inout 키워드를 사용해야 할까? 파라미터로 받은 값을 1을 증가시키는 함수를 정의해보자.

 

func addOne(value: Int){
    value += 1
    print(value)
}

 

value값을 1 증가시키기 위해서 value+=1(value = value + 1)을 사용하였는데 이상하게 아래와 같이 오류가 발생한다.

 

 

경고 창을 보면  ['value' is a 'let' constant] 라고 우리에게 알려준다. 처음에 Swift에서 파라미터는 기본적으로 상수(constant)이다. 상수는 변경할 수 없는데 value 값을 증가시키려고 시도했기 때문에 오류가 발생한 것이다. 자, 이제 이러한 문제를 inout 키워드로 해결해보자.

 

var number = 10
 
func addOne(value: inout Int){
    value += 1
    print(value)
}
 
addOne(value: &number)

 

inout 키워드를 사용하여 파라미터로 들어온 값을 1 증가시키고 출력하는 코드이다. 파라미터와 데이터 타입 사이에 inout 키워드를 사용하였으며 addOne()함수를 호출할 때 변수 명 앞에 앰퍼샌드(&) 기호를 붙여서 사용하였다. 이렇게 코드를 작성하면 우리가 원하는 변수 number의 값을 1 증가시킬 수 있다!

그리고 함수를 호출할 때 인자값으로 넘어가는 변수명 왼쪽에 &기호가 붙어있으면 함수 내부에서 수정될 것이라는 의미도 유추할 수 있다.

다음 코드로 변수의 값이 변경되기 전과 후의 값을 을 확인해보았다.

 

var number = 10
 
print("Before value : \(number)")
 
func addOne(_ value: inout Int){
    value += 1
    print("After value : \(value)")
}
 
addOne(&number)

 

아래 사진은 결과 값이다.

 

 

이를 응용하여 변수 a, b에 저장되어있는 숫자를 swap하는 코드를 작성해보았다.

 

func swapNumber(first: inout Int, second: inout Int){
    var temp = first
    first = second
    second = temp
}
 
var a = 10
var b = 20
 
print("Before Swap a : \(a), b : \(b)")
swapNumber(first: &a, second: &b)
 
print("After Swap a : \(a), b : \(b)")

 

이처럼 inout 키워드를 사용할 수 있는 다양한 경우들을 생각해보고 코드로 작성해보자. 본인이 예상한 것과 결과가 같은지, 틀리면 왜 틀렸는지 생각해보고 모르면 댓글을 남기거나 구글링을 해보자 :)

반응형

'언어 > Swift 5' 카테고리의 다른 글

[Swift 5] 함수의 오버로딩(Overloading)이란?  (0) 2020.03.24
[Swift 5] 함수 사용 방법  (0) 2020.03.23
[Swift 5] Any와 nil에 대하여  (0) 2020.03.06
반응형

오버로딩(Overloading)

같은 함수의 이름을 가지고 있지만 파라미터를 다르게 하여 다양한 유형의 호출에 응답이 가능한 것. 같은 이름, 다른 행동!!

 

func sportsBrand(brand: String){
    print(brand)
}
 
func sportsBrand(brand: String){
    print(brand)
}
 

 

함수 이름이 위 코드처럼 중복되는 경우에는 사용할 수 없다. 이런 경우 오버로딩을 사용하여 함수를 여러개 만들 수 있다.

func sportsBrand(brand: String){
    print(brand)
}
 
func sportsBrand(brand2: String){
    print(brand2)
}
 
sportsBrand(brand: "Nike")
sportsBrand(brand2: "Adidas")

 

위 코드처럼 함수의 파라미터 이름을 바꾸어서(brand와 brand2) 구분 짓거나

func luckyNumber(input: String){
    print("문자열 형태의 행운의 숫자 : \(input)")
}
 
func luckyNumber(input: Int){
    print("정수형 형태의 행운의 숫자 : \(input)")
}
 
luckyNumber(input: "Seven")
luckyNumber(input: 7)

 

데이터 타입이 다른 경우(String과 Int) 함수를 호출하여 사용할 수 있다. 또한 파라미터 개수가 달라도 구분하여 사용할 수 있다.

func luckyNumber(input: String){
    print("문자열 형태의 행운의 숫자 : \(input)")
}
 
func luckyNumber(input: Int){
    print("정수형 형태의 행운의 숫자 : \(input)")
}
 
func luckyNumber(input: Int, input2: String){
    print("정수형, 문자열 형태의 행운의 숫자 : \(input), \(input2)")
}
 
luckyNumber(input: "Seven")
luckyNumber(input: 7)
luckyNumber(input: 7, input2: "Seven")
반응형

'언어 > Swift 5' 카테고리의 다른 글

[Swift 5] In-out 파라미터 사용 방법  (1) 2020.03.24
[Swift 5] 함수 사용 방법  (0) 2020.03.23
[Swift 5] Any와 nil에 대하여  (0) 2020.03.06
반응형

 

앱을 개발하다가 시뮬레이터가 갑자기 안되면서 "Thread 1: signal SIGABRT" 오류가 나오는 경우가 있어서 당혹스러울 때가 있는데 SIGABRT(Signal Abort: 신호 중단)은 nil이거나 존재하지 않는 것에 엑세스할 때 앱이 충돌나는 것을 나타낸다. 원인은 주로 Outlet에 있다.

 

1. Storyboard에서 View Controller를 클릭한다.

 

 

2. 노란 경고가 있는 것은 유효하지 않은 outlet이므로  연결을 해제한다.

 

 

3. 다시 시뮬레이터를 실행시키면 잘 돌아갈 것이다.

반응형

+ Recent posts