2023.01.11 - 안드로이드 앱개발자 과정

CHA·2023년 1월 12일
0

C언어



1차원 배열(Array)


배열의 정의

  • 같은 자료형의 변수 여러개를 묶어 저장하는 문법

  • 배열의 주솟값, 크기 등 그림 참고

배열의 필요성

  • 30명의 학생에 대해 각각의 점수를 입력받아야 한다고 생각해봅시다. 그러면 30개의 변수가 각각 만들어져야 합니다. 이는 아주아주 귀찮은 일일 뿐만 아니라, 메모리적으로도 비효율적이고 좋지 못한 방법일것입니다. 그래서 사람들은 이 부분을 해결할 '배열' 이라는 개념을 만들었습니다.

배열 선언과 데이터 저장과 출력

  • 배열 선언 : 데이터타입 배열이름[배열의 크기];
  • 데이터 저장과 출력 : 코드를 통해 알아봅시다.
#include <stdio.h>

void main() {
	int aaa[3];
	aaa[0] = 1; // 데이터 저장
	aaa[1] = 2;
	aaa[2] = 3;

	printf("%d\n", aaa[0]); // 데이터 출력
	printf("%d\n", aaa[1]);
	printf("%d\n", aaa[2]);
}
  • 배열 요소의 값을 키보드로 입력받기
#include <stdio.h>

void main() {
	int aaa[3];

	scanf_s("%d", &aaa[0]);
	scanf_s("%d", &aaa[1]);
	scanf_s("%d", &aaa[2]);
}
  • 다양한 데이터 타입의 배열
#include <stdio.h>

void main() {
	int aaa[3];		//정수형 타입 배열 
	double bbb[3];	//실수형 타입 배열
	char ccc[3];	//문자형 타입 배열 

	bbb[0] = 3.1;
	bbb[1] = 3.2;
	bbb[2] = 3.3;

	ccc[0] = 'A';
	ccc[1] = 'B';
	ccc[2] = 'C';
}

배열간 대입과 연산

  • 배열간 대입
#include <stdio.h>

void main() {
	//대입
	int a = 10;
	int b;
	b = a;
    
	// 배열간 대입
	int aaa[3] = { 10,20,30 };
	int bbb[3];

	for (int i = 0; i < 3; i++) {
		bbb[i] = aaa[2 - i];
	}
}
  • 배열간 연산
#include <stdio.h>

void main() {
	//연산
	int a = 10;
	int b = 20;
	int c = a + b;

	//배열간 연산
	int aaa[3] = { 10,20,30 };
	int bbb[3] = { 4,5,6 };
	int ccc[3];

	for (int i = 0; i < 3; i++) {
		ccc[i] = aaa[i] + bbb[i];
	}
}

배열 선언 주의점

  • 배열의 초기화
    배열의 초기화는 다음과 같이 할수 있습니다.

    #include <stdio.h>
    
    void main() {
        int aaa[3] = { 1,2,3 };	// 배열의 초기화 
        double bbb[3] = { 1.1,2.2,3.3 };
        char ccc[3] = { 'A','B','C' };
    
        int ddd[4] = { 1,2,3 }; // 4개짜리 배열에 값은 3개만 넣을수도 있다.
        printf("%d\n", ddd[0]);
        printf("%d\n", ddd[1]);
        printf("%d\n", ddd[2]);
        printf("%d\n", ddd[3]); // 쓰레기 값이 아닌 0이 된다!
    }

    또한 배열의 초기화는 다음과 같은 특징을 가지기도 합니다.

    #include <stdio.h>
    
    void main() {
        int aaa[3] = { 1,2,3 };	// 배열의 초기화 
        double bbb[3] = { 1.1,2.2,3.3 };
        char ccc[3] = { 'A','B','C' };
    
        int ddd[4] = { 1,2,3 }; // 4개짜리 배열에 값은 3개만 넣을수도 있다.
        printf("%d\n", ddd[0]);
        printf("%d\n", ddd[1]);
        printf("%d\n", ddd[2]);
        printf("%d\n", ddd[3]); // 쓰레기 값이 아닌 0이 된다!
    }

    한 가지 주의할 점은, 배열의 초기화와 대입의 차이입니다.

    #include <stdio.h>
    
    void main() {
        int aaa[3];
        aaa[3] = { 10, 20, 30 }; // 오류!!! 
    }

    초기화는 대입과 다르기 때문에 위와 같이 초기화할 경우 오류가 발생합니다.
    그래서 배열을 초기화 할때에는 항상 초기화 할때 값을 넣어주어야 합니다.

  • 배열의 인덱스와 크기값

    #include <stdio.h>
    
    void main() {
    	int k = 2;
        int aaa[3];
      //int bbb[k] -> 오류 
        scanf_s("%d", &aaa[0]);
        scanf_s("%d", &aaa[1]);
        scanf_s("%d", &aaa[2]);
    }

    인덱스 값은 변수를 가지고도 조작할 수 있지만, 배열의 크기값은 고정되어 있는 상수값으로 처리해야 합니다.


1차원 배열의 주소와 값의 참조


문자열

  • 문자열 배열의 구조

  • 문자열의 저장

	char aaa[5] = { 'H','e','l','l','o' }; // 가능하지만, 너무 번거롭다!!
	char bbb[5] = "hello"; // 깔끔~
  • 배열의 이름과 시작 주소
    배열의 이름의 주소와 배열의 시작 주소는 똑같습니다. 즉, 다음과 같습니다.
    aaa == &aaa[0];

  • 문자열의 출력
    다른 서식들은 메모리에서 몇 바이트를 가져올지 예측가능하지만, 문자열의 경우 예측이 불가하기 때문에 다른방식이 필요합니다. 그래서 %s 는 문자열이 시작되는 위치를 요구하게 됩니다.

    		char bbb[5] = "hello";
    		printf("%s", bbb);
       결과 : hello儆儆儆儆儆儆儆儆儆儆儆???

    그런데 결과값이 이상합니다. 그 이유는 문자열이 시작되는 위치만 알지 언제끝날지는 모르기 때문입니다. 그래서 배열의 이름이나 시작 주소로 출력하고자 할때 hello 는 제대로 출력이 되지만 그 뒤로부터는 쓰레기 값이 출력됩니다. 다음 코드를 봅시다.

    		printf("%s", "hello");
      결과 : hello

    위 코드는 제대로 출력이 됩니다. 왜 그럴까요? 사실, ""의 의미는 문자열 끝에 아스키코드 0번인 NULL 을 추가하라는 의미기 때문입니다. 즉, 문자열을 출력할 때는 한글자씩 출력을 하게 되는데, 그 과정에서 NULL을 만나게 되면 문자열을 종료한다는 로직이 들어가 있습니다. 그렇다면, 배열을 정상적으로 출력해주기 위해서는 역시 NULL을 추가를 해줘야 할것 같습니다. 다시말해, 배열의 크기를 5가 아니라 6을 넣어줘야 NULL이 추가되면서 정상적으로 출력이 됩니다.
    추가적으로 문자열 상수 또한 주소값을 의미합니다.

  • 문자열 입력

    void main() {
    	char c[11];
    	scanf_s("%s", c, 11);
    	printf("%s\n", c);
    	for (int i = 0; i < 11; i++) {
    
    		printf("%c", c[i]);
    		if (c[i] == 0) break;
    	}
    }

    %s 서식을 이용한 문자열 입력은 위와 같습니다. 단, 각각마다 주의할 점이 있습니다. %c의 서식을 이용하는 경우에는 엔터키와 스페이스 키의 아스키코드값이 각각 10,32 입니다. 그리고 %s 의 경우 엔터키와 스페이스키의 아스키코드값은 둘다 0 이 됩니다.


다차원 배열


다차원 배열의 구조

반복문을 활용한 다차원 배열의 입력과 출력

''' 데이터는 생략
	for (int i = 0; i < 3; i++) {
		for (int k = 0; k < 5; k++) {
			printf("  %4d  ", aaa[i][k]);
		}
		printf("\n");
	}

이중 for 문을 활용해서 2차원 배열을 그려낼 수 있습니다. 입력 또한 마찬가지로 해결하면 됩니다.

profile
Developer

0개의 댓글