반응형

난수에 대해서 공부를 하다가 무작위로 숫자 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. 다시 시뮬레이터를 실행시키면 잘 돌아갈 것이다.

반응형
반응형

 

Any

Any는 Swift의 모든 데이터 타입을 사용할 수 있다.

 

변수 또는 상수의 데이터 타입이 Any로 지정되어 있다면 그 변수 또는 상수에는 어떤 종류의 데이터 타입이든지 상관없이 할당할 수 있다!

일반적으로 정수형으로 선언한 변수나 상수는 정수형 데이터를 저장 후에 정수형 이외의 데이터 타입을 저장하려고 하면 오류가 발생한다.

아래 코드는 정수형 변수 something에 100을 할당 후 문자열 "Glasses"를 저장한 것이다. 당연히 오류 발생.

 

var something: Int = 100
something = "Glasses" // 오류 발생
print(something)

 

하지만 Any타입에서는 뭐든지 가능하다. 아래 코드는 Any타입인 something 변수에 정수형, 문자열, 소수형 값을 할당했다.

var something: Any = 100
print(something) // 100 출력
 
something = "IPhone"
print(something) // IPhone 출력
 
something = 1.123
print(something) // 1.123

 

NOTE

Any는 될 수 있으면 사용하지 않는 것을 추천한다. 타입에 상당히 엄격한 Swift의 특성 상 Any 또는 AnyObject로 선언된 변수의 값을 가져가 쓰려면 매번 타입 확인 및 변환을 해줘야 하는 불편함이 있을뿐더러 예기치 못한 오류의 위험을 증가시키기 때문이다.

앞서 타입 추론 때도 설명했지만 타입은 될 수 있는 한 명시하는 것이 좋다.


nil

nil은 Any처럼 특정 타입이 아니라 '없음'을 나타내는 키워드이다.

 

var nilTest: Int= 100
// nillTest 변수는 졍수형 타입 100을 저장하고 있다.
nilTest = nil
// nilTest 변수는 아무런 값도 저장하지 않고 있다.

 

nil은 non-optional 변수나 상수에서는 사용할 수 없다. 만약 상수나 변수가 특정 조건에서 값이 없는 상태에서 작동해야 하는 경우가 있다면 항상 optional 변수로 선언하자.

만약 값을 할당하지 않고 optional 변수로 선언하면 변수는 자동적으로 nil로 세팅된다.

 

var nilTest: Int// 아무 것도 저장이 되지 않은 nil 상태

 

다른 프로그래밍 언어를 해 본 사람은 null값이라고 생각하면 편할 것 같다. 변수나 상수에 값이 없는 경우, 즉 nil이면 해당 변수나 상수에 접근했을 때 잘못된 메모리 접근으로 런타임 오류가 발생한다.

잘못된 메모리에 접근하여 발생하는 런타임 오류는 Null Pointer Exception 이라고 불린다.

 

반응형

+ Recent posts