반응형
#include <stdio.h>
 
int queue[10];
int rear = 0;
int front = 0;
 
void put(int n){ // 자료를 입력하는 함수
    if(rear < 10){
        queue[rear] = n;
        rear++;
    }else{
        printf("Queue overflow!\n");
    }
}
 
void get(){ // 자료를 출력하는 함수
    if(rear != front){
        printf("%d "queue[front]);
        front++;
    }else{
        printf("Empty queue!\n");
    }
}
 
void size(){ //
    printf("Queue size : %d\n", rear);
}
 
void print(){ // 자료를 프린트하는 함수
    for(int i=0; i<rear; i++){
        printf("%d "queue[i]);
    }
    printf("\n");
}
 
int empty(){
    if(rear!=0){
        return 1;
    }else{
        return 0;
    }
}
 
int main(){
    put(1);
    put(3);
    put(5);
    print();
    printf("Empty? %d\n",empty());
    size();
    get();
    get();
    get();
    get();
}

 

 

반응형
반응형

 

이번 글은 함수를 정의하는 방법과 호출 방법에 대한 지식을 기본적으로 알고 있어야 이해할 수 글이다. 또한 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
반응형

함수란(Functions)

특정 작업을 수행하는 코드 블록이다. 더 길게 설명할 수 있지만 저게 바로 함수의 본질이다.


함수의 형태

func 함수이름(파라미터: 데이터 타입) -> 리턴 타입{
    // 실행할 코드
    return 리턴 값
}

 

swift에서 사용되는 함수의 구조는 위 코드와 같으며 다음과 같은 특징들을 가지고 있다.

  1. 함수를 만들 때는 func 키워드를 사용한다.
  2. 함수의 이름은 덧셈을 하는 함수이면 add, 이름을 출력하는 함수이면 printName과 같이 함수 이름을 보고 함수가 수행하는 작업이 무엇인지 알 수 있도록 만든다.
  3. 일반적으로 다른 언어에서는 함수의 파라미터를 String name처럼 데이터 타입 변수 이름 구조를 갖지만 swift에서는 반대로 사용될 뿐더러 파라미터와 데이터 타입 사이는 콜론(:)으로 구분 짓는다.
  4. 리턴 타입을 나타낼 때는  -> 을 사용한다.

다양한 특징들이 더 있지만 일단 이정도의 특징만 알아두고 나머지 특징들은 코드를 통해 배워도록 하자.

다음 코드는 장난감 가게에 들어온 손님에게 인사를 하는 함수이다.

func printWelcome(){
    print("Welcome to the toy shop")
}

 

위에서 말한 특징처럼 함수를 만들기 위해 func 키워드를 사용하였으며, 가게에 들어온 손님에게 인사하는 함수이므로 함수 이름을 보고 어떠한 기능을 하는 함수인지 알 수 있도록 printWelcome이라 만들었다. -> 이처럼 함수를 정의(definition)할 수 있고, 실제로 printWelcome()함수를 사용하려면 함수를 호출(call) 해야하는데 방법은 아래와 같다.

func printWelcome(){
    print("Welcome to the toy shop")
}
 
printWelcome()

 

코드의 가장 아래처럼 함수의 이름과 똑같이 작성하면 함수를 호출할 수 있다. 코드를 실행해보면 printWelcome()함수의 블록안에 있는 print()함수가 실행이 되어 "Welcome to the toy shop"이 출력이 될 것이다.

이렇게 두 가지의 코드를 통해 함수를 정의하고 호출하는 방법에 대해서 간단히 알아보았다. 이번에는 파라미터가 있고, 리턴 타입이 있는 함수를 정의하고 호출해보자.

func toyInfo(toyName: String-> String{
    let buy = "\(toyName)을(를) 구매하였습니다."
 
    return buy
}
 
let result = toyInfo(toyName: "Woody")
 
print(result)

 

toyInfo()함수는 구매한 장난감을 알려주는 함수이다. 한 개의 파라미터로 장난감의 이름을 받아 buy에 저장 후 리턴 하여 result에 저장하고 출력하는 코드이다. ->에서 String으로 사용한 이유는 buy의 데이터 타입이 String이기 때문에 String으로 작성하였으며 만약에 리턴 값이 정수형일 경우에는 -> Int로, 소수형일 경우 Double 혹은 Float을 사용하면 된다.

 

다음 코드의 printPrice()함수는 장난감 가격(toyPrice)과 장난감 개수(toyCount)를 매개변수로 받아서 가격을 알려주는 함수이다.

func printPrice(toyPrice: Int, toyCount: Int){
    print("total price : \(toyPrice*toyCount)")
}
 
printPrice(toyPrice: 1000, toyCount: 5)

 

아래는 여러 가지의 장난감의 구매했을 때 코드이다.

func printPrice(toyPrice: Int, toyCount: Int){
    print("total price : \(toyPrice*toyCount)")
}
 
printPrice(toyPrice: 1000, toyCount: 5)
printPrice(toyPrice: 1000, toyCount: 7)
printPrice(toyPrice: 1000, toyCount: 9)
printPrice(toyPrice: 1000, toyCount: 10)
printPrice(toyPrice: 1000, toyCount: 14)

 

장난감 개수를 5개뿐만 아니라 여러개를 구매했을 때 출력하는 코드는 위와같이 printPrice()함수를 여러번 호출하면 된다.

그런데 여기서 보면 price값이 모두 1000원으로 일정한데 이러한 경우에 함수에 default값을 세팅해줄 수 있다.

func printPrice(toyPrice: Int = 1000, toyCount: Int){
    print("total price : \(toyPrice*toyCount)")
}
 
printPrice(toyCount: 5)
printPrice(toyCount: 7)
printPrice(toyCount: 9)
printPrice(toyCount: 10)
printPrice(toyCount: 14)

 

이렇게 코드를 작성하면 printPrice()함수를 호출할 때 인자 값을 toyCount만 전달하면 자동적으로 toyPrice매개변수는 1000으로 세팅되어있기 때문에 이전 코드와 같은 결과를 출력할 수 있다. 상대적으로 인자값 개수도 적고 더 깔끔해보이는 장점이 있다.

 

단, 아래 코드처럼 toyPrice 매개변수의 default값을 1000으로 저장했지만, 파라미터가 2000으로 전달되는 경우 toyPrice 매개변수에는 default값인 1000이 아닌 2000이 저장된다.

func printPrice(toyPrice: Int = 1000, toyCount: Int){
    print("total price : \(toyPrice*toyCount)")
}
 
printPrice(toyPrice: 2000, toyCount: 5)

underscore 키워드 사용 방법

func test(value: Int, value2: Int){
    print(value)
}
 
test(value: 5, value2: 10)

 

test()함수를 호출할 때 값을 전달할 인자 값이 어느 파라미터에 전달되는지 구체적으로 명시하였는데 파라미터에 전달할 값만 작성해서 호출하는 방법은 Under score 키워드를 사용하면 가능하다.

func test(_ value: Int, _ value2: Int){
    print(value, value2)
}
 
test(1020)
ter

 

test()함수를 정의한 부분의 파라미터 앞에 Under score(_)를 넣었다. _ 키워드를 사용하면 함수를 호출할 때 첫 번째에 있는 10은 자동적으로 value에 저장이 되고 20은 두 번째에 있는 value2에 저장이 된다. 

반응형
반응형

공약수 찾는 코드

#include <stdio.h>
 
int main() {
    int firstNum, secondNum;
    scanf("%d %d"&firstNum, &secondNum);
    
    for(int i=1; i<=firstNum; i++){
        if(firstNum%i==0 && secondNum%i==0){
            printf("%d\n", i);
        }
    }
 
    return 0;
}
 
반응형
반응형

임의의 숫자를 입력 받은 후에 약수를 출력하는 코드를 작성해보자.

참고로 약수란 식을 나누어 나머지가 없이 떨어지는 수를 의미한다. 쉽게 말해 나눈 결과의 몫이 0인것이다.

 

내가 입력한 수의 약수 찾는 방법

#include <stdio.h>
 
int main()
{
    int inputNumber;
    scanf("%d"&inputNumber);
    
    for(int i=1; i<=inputNumber; i++){
        if(inputNumber%i==0){
            printf("%d ", i);
        }
    }
 
    return 0;
}
 

 

약수를 찾는 방법은 1부터 시작하여 입력한 숫자까지 한번씩 모두 나누어보는 것이다. 이를 응용하여 입력한 수의 약수가 총 몇개인지 출력하는 코드를 작성해보자.


내가 입력한 수의 약수의 개수를 찾는 방법

#include <stdio.h>
 
int main()
{
    int inputNumber;
    int cnt = 0;
    scanf("%d"&inputNumber);
    
    for(int i=1; i<=inputNumber; i++){
        if(inputNumber%i==0){
            cnt++;
        }
    }
    printf("%d\n", cnt);
 
    return 0;
}

 

약수의 개수를 저장할 cnt변수를 0으로 초기화하였으며 if문의 조건값이 참일 경우 1씩 증가 시킨다.

반응형
반응형

많은 사람들이 아래와 같은 코드 문제를 해결하기 위해 이 글을 클릭했을 것이다.

분명히 변수 input에 love를 저장하고 if문을 사용하여 문자열 "love"를 비교하는 코드를 작성했는데 생각처럼 되지 않는다.

 

#include <stdio.h>
 
int main()
{
    char input[] = "love";
    
    if(input == "love"){
        printf("love");
    }else{
        printf("not love");
    }
    
    return 0;
}

 

그 이유는 == 연산자를 사용하여 문자열을 비교하는 것은 문자열을 비교하는 것이 아니라 배열 input과 문자열 love의 주소값을 비교하기 때문이다. 이 문제를 해결하기 위해서는 strcmp()함수를 사용하면 쉽게 해결할 수 있다. 함수 이름은 문자열을 비교하다(string compare)에서 따왔다.

 

#include <stdio.h>
 
int main()
{
    char input[] = "love";
    
    int result = strcmp(input, "love");
    
    printf("%d", result);
    
    return 0;
}

 

위 코드는 strcmp()함수를 사용하여 input변수에 들어있는 문자열과 "love"를 비교하고 리턴값을 result에 저장 후 출력하는 코드이다.

실행해보면 결과 값으로 0이 출력이된다. 비교하는 문자열이 같으니 일반적으로 생각했을 때 1이 출력되어야 할 것 같지만 strcmp()함수는 비교하는 대상이 같을 때 0을 리턴하는 함수이기 때문이다. 

 

#include <stdio.h>
 
int main()
{
    char input[] = "love";
    
    int result = strcmp(input, "love");
    
    if(!result){
        printf("love");
    }else{
        printf("not love");
    }
 
    return 0;
}
 

 

if문 조건값에 not 연산자인 !를 붙인 이유는 방금 말했듯이 비교하는 대상이 같으면 0을 리턴하므로 ! 연산자를 사용하여 논리값을 뒤집어서 1로 만들기 위함이다.

반응형
반응형

코딩을 하다 보면 무작위로 나온 결과 값들을 정렬을 해야할 때가 있다.

가장 대표적인 예로 로또 번호를 추출하는 프로그램을 만들 때 "20 23 18 5 34 30"과 같은 형식으로 출력할 수 있지만

 

naver에서 제공하는 실제 901회 당첨 번호 (되고 싶다..)

 

위와 같이 숫자들을 오름차순(작은 수 -> 큰 수)으로 정렬해서 만들고 싶을 때는 버블 정렬을 사용하면 쉽게 구현할 수 있다!

 

 

버블 정렬이란?

버블 정렬은 정렬 알고리즘 중에서 가장 간단한 알고리즘이며 서로 인접한 값들을 비교하여 큰 값을 뒤로 넘기며 정렬하는 알고리즘이다.

 

아래 코드는 무작위로 값이 저장된 크기가 5인 배열이다. 어떻게 버블 정렬이 실행되는지 과정을 살펴보자.

 

int arr[5= {53142};

 

1. arr[0]의 5와 arr[1]의 3을 비교한다. arr[0]이 arr[1]보다 값이 크므로 arr[0]과 arr[1]의 자리를 바꾼다.

 

int arr[5= {35142};

 

2. arr[1]의 5와 arr[2]의 1을 비교한다. arr[1]이 arr[2]보다 값이 크므로  arr[1]과 arr[2]의 자리를 바꾼다.

 

int arr[5= {31542};

 

3. arr[2]의 5와 arr[3]의 4를 비교한다. arr[2]가 arr[3]보다 값이 크므로 arr[2]와 arr[3]의 자리를 바꾼다.

 

 

int arr[5= {31452};

 

4. arr[3]의 5와 arr[4]의 2를 비교한다. arr[3]이 arr[4]보다 값이 크므로  arr[3]과 arr[4]의 자리를 바꾼다.

 

int arr[5= {31425};

 

5. 마지막까지 비교를 마쳤으면 처음으로 돌아가서 같은 방법으로 정렬을 반복한다. 설명은 생략하고 정렬 순서만 써놓을테니 자신이 생각한 것과 맞는지 비교해보자.

 

int arr[5= {13425};
 
int arr[5= {13425}; 
// arr[1]의 3과 arr[2]의 4를 비교했을 때 3이 더 작으므로 변화 없음.

 

int arr[5= {13245};

 

int arr[5= {12345}; 
// 최종 배열의 상태

 

위 예시는 인접한 두 값을 비교할 때 앞에 놓여있는 값이 더 큰 경우가 한 번밖에 없었지만 데이터가 많을수록 이와 같이 필요 없는 비교를 많이 하기 때문에 다른 정렬에 비해 속도가 느린 편이지만 구현하기 매우 쉽다는 장점을 가지고 있다.


버블 정렬 구현 코드

다음 코드는 무작위로 저장된 10개의 값을 버블 정렬을 사용한 코드이다.

 

#include <stdio.h>
 
 
int main() {
    int arr[10= {95361018247};
    int len = sizeof(arr) / sizeof(int);
    int temp;
    
    printf("Before : ");
    for(int i=0; i< len; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    for(int i = 0 ; i < len - 1 ; i++){
        for(int j = 0 ; j < len - 1 ; j++){
            if(arr[j] > arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1= temp;
            }
        }
    }
    
    printf("After : ");
    for(int i=0; i< len; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    return 0;
}
 
 

버블 정렬을 하기 위해서 이중 반복문을 사용하였으며 for문의 조건값을 "len-1"로 작성한 이유는 크기가 10인 배열의 마지막 인덱스는 9이다. 버블 정렬의 인접한 두 값을 비교하는 순서는 0과 1번 인덱스, 1과 2번 인덱스, 2와 3과 인덱스, ... , 7과 8번 인덱스, 8과 9번 인덱스이다.

for문이 8번까지 돌면 크기가 10인 배열의 마지막 인덱스인 9까지 비교하는 코드이므로 len이 아닌 len-1로 작성하였다.

 

이 글을 보고 버블 정렬에 대해서 이해했다고 생각이 들면 코드를 보지 않고 직접 타이핑하여 버블 정렬을 구현해보자.

그리고 이를 응용하여 내림차순(위 -> 아래)으로 정렬하는 코드도 작성해보며 연습해보자. 아래 코드는 내림차순 코드인데 코드를 보지 않고 작성해본 다음 확인해보자.


내림 차순 구현 코드

#include <stdio.h>
 
 
int main() {
    int arr[5= {53142};
    int temp;
    int len = sizeof(arr) / sizeof(int);
    for(int i=0; i< len - 1; i++){
        for(int j=0; j<len - 1; j++){
            if(arr[j] < arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1= temp;
            }
        }
    }
    
    for(int i=0; i<len; i++){
        printf("%d ", arr[i]);
    }
    
    return 0;
}
 

 

눈치 빠른 사람은 버블 정렬 코드 if문의 '>' 부등호를 '<' 부등호로 바꿔주면 된다는 것을 알았을 것이다. (눈치 못 채도 상관없다)

반응형
반응형

난수에 대해서 공부를 하다가 무작위로 숫자 1 ~ 100까지의 임의의 숫자 30개를 추출한 후에 평균을 구하면 몇 정도 나오는지 궁금해서 코드로 작성해보았다. 결과부터 말하면 45이상 55이하 범위가 가장 많이 나옴ㅎㅎ

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main() {
    srand((unsigned int)time(NULL));
    int array[30]; // 크기가 30인 배열
    int sum = 0;
 
    for(int i=0; i< sizeof(array)/sizeof(int); i++){
        int randomNumber = rand() % 101// 0 ~ 100까지의 랜덤 숫자
        array[i] = randomNumber;
        sum += array[i];
    }
 
    printf("Result : %d\n", sum/(sizeof(array)/sizeof(int)));
    
    return 0;
}

 

일반 코드와 조금 다른점은 랜덤 숫자를 30개를 뽑을 것이라서 for문의 조건값을 간단하게 30으로 써도 되지만 sizeof(arrat)/sizeof(int)로 작성하였다.

그 이유는 만약 배열의 크기가 바뀌면 for문의 조건도 바꿔줘야하기 때문이다. 

만약 배열의 크기가 30이 아닌 100으로 수정하고 싶으면 배열의 크기를 변경하는 동시에 for문의 조건도 i < 100 형식으로 변경해주어야 한다.

하지만 for문의 조건값을 배열의 크기만큼 반복할 수 있도록 코드를 작성하면 배열의 크기만 변경하면 되므로 실수도 방지할 수 있고 나중에 귀찮지 않다.

 

#include <stdio.h>
 
int main() {
    int array[30];
 
    printf("array size : %d\n"sizeof(array));
 
    return 0;
}

 

위 코드에서 사용된 sizeof()함수는 자료형의 크기를 구하는 함수이다. 코드를 실행해보면 결과가 array의 크기인 30이 아닌 120이 출력이 된다.

분명히 sizeof()함수는 자료형의 크기를 구하는 함수라고 했고, 배열 array의 크기는 30으로 설정했는데 120이 출력이 된다. 왜 그럴까?

 

그 이유는 C언어에서 int 자료형의 크기는 4Byte이며, 배열 array의 크기가 30이므로 4Byte 공간을 차지하는 공간이 30개가 있는 것이다.

그래서 sizeof(array)만 사용하면 우리가 원하는 30이 아니라 120이 출력이 되는 것이다! 그 다음에 해야할 것은 120이라는 숫자를 실제 배열의 크기 30으로 만드는 방법이다.

 

 

#include <stdio.h>
 
int main() {
 
    int array[30];
 
    printf("array size : %d\n"sizeof(array)/sizeof(int));
 
    return 0;
}

 

int 자료형의 크기는 4Byte라고 했다. 그래서 sizeof(array)를 sizeof(int)로 나누어주었다. 즉 120/4 연산을 한 것이다. 그래서 결과 값은 우리가 원하는 실제 배열 array의 크기인 30이 출력이 된다.

 

앞으로 배열의 크기만큼 반복문을 돌릴 때는 반복문의 조건값을 단순히 숫자로 적는 것보다 위 코드처럼 적도록 노력하자.

반응형
반응형

 

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

 

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

 

 

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

 

 

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

반응형

+ Recent posts