[Warming up C Programming] Chapter 7 : 배열

eunee22·2023년 7월 13일
0

Warming-up C Programming

목록 보기
7/10
post-thumbnail

제가 대학교 1학년 때 C언어 수업에서 배운 내용을 교재와 ppt를 중심으로 정리한 내용입니다. (2022.3 ~ 2022.6)
당시에 공부를 위해서 HWP 파일로 정리해 놓은 것을 그대로 올립니다.

대학에 처음 들어와 정리한 내용이라 모든 내용을 담고 싶은 욕심에 정리가 많이 지져분하고 어설픈점 양해 부탁드립니다..!

🍑배열의 기본

배열의 필요성

  • 이름이 다른 여러개의 변수를 사용해야 할 때 배열을 사용하면 필요한 변수의 개수의 크기만큼의 배열을 선언하면됨.

  • 변수이름이 다르기에 for문을 사용할수 없는 상황에 배열을 사용하면 배열의 원소에 대해 같은 코드를 수행함.

배열의 개념

배열 : 같은 데이터형의 변수를 메모리에 연속적으로 할당하고 같은 이름으로 사용하는 기능.

  • 주로 for, while문과 함께 사용됨.

원소 : 배열안의 변수 하나하나

  • 배열의 각 원소도 변수이지만, 일반 변수와 다르게 항상 연속된 메모리에 할당. (변수라면 각각 값을 저장할 메모리 공간이 할당됨 → 독립적 변수로 사용 가능)

인덱스(첨자) : 배열의 원소를 구분하기 위한 번호

  • 0부터 시작
  • 배열이름[인덱스] 와 같은 방식으로 배열의 원소를 구분

배열의 이름

  • 배열 전체에 대한 이름이 됨.
  • 배열의 원소를 개별적 변수로 이용하기 위해서는 배열이름과 인덱스를 함께 이용해야함.

배열의 선언

  • 데이터형 배열명[크기] 형식으로 배열의 크기 지정.
    • 크기는 배열 속 원소의 개수
  • 원소가 n개type형 배열을 선언하면 type형의 변수 n개를 메모리에 연속적으로 할당.
    • 할당 메모리의 크기는 sizeof(type) x n 바이트임.
  • 배열의 크기는 반드시 0보다 큰 정수형 상수로 지정해야하고 생략 불가.
    • 컴파일 시점에서 배열의 크기가 얼마인지 정해져야 하기에 → 그래서 변수도 불가
    • const 변수 불가(컴파일 에러).
    • 메크로 상수 가능.
  • sizeof(arr) : arr 배열 전체의 바이트 크기
    sizeof(arr[i]) : arr 배열 원소의 바이트 크기
    sizeof(arr)/size(arr[0]) : arr배열의 크기 = 원소의 개수

  • int size = sizeof(arr)/size(arr[0]) 의 사용 이유
    • 코드에서 배열의 크기가 이용되는 경우, 배열의 크기를 변경해도, 코드를 수정할 필요없음.
    • 대신에 메크로 상수 이용가능.

배열의 초기화

  • 데이터형 배열명[크기] = {초기값목록}; 형식으로 초기화

    • 초기값은 콤마로 나열.
  • {} 안에 나열된 초기값은, 배열의 0번째 원소부터 순서대로 초기화하는데에 사용.

    • 배열의 크기보다 초기값을 부족하게 지정 → 나머지 원소는 0으로 초기화.
    • 배열의 크기보다 초기값을 많이 지정 → 컴파일 에러
  • {}를 사용할 때는 반드시 초기값을 하나 이상 지정해야함

    • 비워두면 컴파일에러
  • 배열 전체를 0으로 초기화 하려면 { 0 }

    • 초기값 없을 때 안전을 위해서 사용.
  • 배열의 초기값을 지정하는 경우 크기를 생략할 수 있음

    • 생략시 초기값의 개수로 배열의 크기를 지정함

배열의 사용

  • 배열의 원소도 변수이기에 type형 배열의 원소는 type원소가 사용되는 모든 곳에서 사용가능.
    • 배열의 원소에 대입, 수식에 이용, 값 입력 받기, 배열의 원소를 함수의 인자로 전달 가능.
  • 배열의 인덱스에는 변수나 변수를 포함한 수식 사용 가능. 다만, 수식의 값은 정수여야함.
  • 잘못된 인덱스의 사용 → 사용시에도 컴파일에러가 발생하지 않으므로 주의해야함
    • 인덱스의 유효범위는 [0 ~ (배열의 크기 - 1)] 임.
    • 유효범위를 넘어서는 인덱스를 읽어오려하면 쓰레기값을 읽어옴.
    • 유효범위를 넘어서는 인덱스에 값을 저장하려하면 엉뚱한 변수의 값이 변경되거나, 프로그램 강제 종료 (실행 에러 → runtime check failure #2) 프로그램이 죽거나 오작동하는 원인.

배열의 복사 : 배열의 모든 원소에 대해 원소끼리 대입하는 것

  • 데이터형과 크기가 같은 경우에도 배열에 다른 배열 대입 불가.
  • 배열의 이름으로 배열 전체 대입 불가.
  • 배열 복사시 배열의 모든 원소에 대해 배열의 원소끼리 대입해야함. (for문 활용해서 1:1 대입)

배열의 비교

  • == 연산자로 직접 배열을 비교하면 배열의 시작 주소를 비교.
    (배열의 이름 = 배열의 시작 주소)
  • 배열의 내용 비교를 위해서는 for문을 이용해서 원소끼리 비교해야함.
  • 모든 원소의 값이 같으면, 배열 전체의 내용이 동일하고, 하나라도 다르면 다름.

🍑다차원 배열

다차원 배열의 개념

  • 원소에 접근 시 2개의 인덱스를 사용.
  • 행렬이나 표, 폭과 높이가 있는 이미지 데이터 등을 나타내는데 이용.
  • 2차원 배열은 행( ㅡ )과 열( | )의 개념으로 이해.
    • ex) 점수 3개를 저장하는 배열 5개가 필요(점수 3개 x 학생 5명)
  • 다차원 배열의 차수엔 제한이 없음.
    • 주로 2차, 3차이상은 쓸일 거의 x

2차원 배열의 선언 및 사용

  • 데이터형 배열명[행크기][열크기] 형식으로 선언.
    • 이때 원소의 개수는 (열크기) x (행크기)
  • 2차원 배열의 원소도 메모리에 연속적으로 할당.
    • arr[0][0], arr[0][1] .... 순으로
  • 2차원 배열의 원소에 접근할 때는 인덱스를 2개 사용.
    열 인덱스 먼저 증가, 그 다음 행 인덱스 증가
    • ex) arr[0] = arr[0][i]전부를 지칭.
  • 2차원 배열은 중첩된 for와 함께 사용 가능.
    • 바깥 for로 행 인덱스, 안쪽 for로 열 인덱스를 증가시키면, 2차원 배열의 원소가 메모리에 할당된 순서대로 접근 가능.

2차원 배열의 초기화

  • 2차원 배열 초기화시 초기값을 열 크기의 개수만큼 { } 로 묶어서 다시 { } 안에 나열.
    • { {값1, 값2} , {값3, 값4} } 형식으로 작성하며 콤마가 필요.
    • 1차원 배열처럼 { } 안에 값만 나열 가능
    • 메모리에 할당된 순서대로 초기화.
  • 초기값 생략시 나머지 원소를 0으로 초기화.
  • 2차원 배열 초기화시, 배열의 행 크기를 생략 가능, 열 크기는 생략 불가.(컴파일 에러)

🍑배열의 활용

함수의 인자로 배열 전달

배열을 매개변수로 갖는 함수의 정의

  • 함수의 매개변수로 배열 선언 시 배열의 크기는 생략.
  • 함수 내에서 배열의 크기가 필요시 매개변수로 받아옴.
  • 함수 안에서 배열의 크기를 직접 상수로 지정할 수도 있지만 다양한 크기의 배열을 출력할수 있게 하려면 매개변수로 받아오는 것이 좋음.
  • 정의하는법
  1. 함수의 매개변수로 배열의 선언시 배열의 원소형, 매개변수명(배열명)과 []를 적어줌.
    • [] 는 비워둠.
  2. 배열의 크기를 전달받기 위한 별도의 매개변수 필요.
    • 배열의 크기는 정수이기에 int형의 매개변수를 선언.
  3. 함수 안에서 배열의 크기가 필요할 때는 매개변수로 전달받은 배열의 크기 이용

배열을 매개변수로 갖는 함수의 호출

  • 배열의 이름과 배열의 크기를 인자로 전달
    • 이때, 매개변수의 원소형과 인자로 전달하는 배열의 원소형이 동일해야함.
  • 배열의 이름이 아닌 배열의 원소 전달 시 인자와 매개변수의 데이터형이 다르기에 컴파일 경고 발생 → [ ] 없이 배열의 이름만 작성.
  • 항상 매개변수로 전달받은 배열의 크기를 이용
    • 배열의 실제 크기와 다른값을 함수의 인자로 전달시에도 → 넘칠 때, 부족할 때 비교
  • 매개변수의 원소형과 인자로 전달하는 배열의 원소형이 동일해야함.
    • 컴파일 경고
    • 무시하면 실행에러

배열의 탐색과 정렬

  • 배열의 탐색 : 탐색 키와 같은 값을 가진 원소를 찾음.
  • 탐색 or 검색 : 주어진 데이터 집합에서 조건이 만족하는 데이터를 찾는 것.
    • ex) 검색할 상품명을 입력하면 여러 쇼핑몰의 상품 정보 중에서 상품명이 일치하는 항목을 찾아서 화면에 표시하는 기능

탐색 알고리즘

1. 순차 탐색 : 배열의 0번째 원소부터 순서대로 탐색키와 비교해서 값이 같은 원소를 찾음.
2. 이진 탐색 : 배열을 정렬한 상태에서 탐색.

  • 빠른 탐색 가능.
  • bsearch 함수 → <stdlib.h>헤더

  • 배열의 정렬 : 원소들을 비교해서 크기가 커지는 순서 또는 작아지는 순서로 나열
  • 정렬 : 주어진 데이터 항목을 지정된 순서로 나열하는 것
    • ex) 가격 비교 사이트에서 검색 결과로 표시된 상품 목록을 낮은 가격 순으로 보거나 높은 가격 순으로 확인하는 기능
    • 오름차순 : 크기가 커지는 순서
    • 내림차순 : 크기가 작아지는 순서

정렬 알고리즘

1. 선택 정렬

  • 전체 배열의 원소 중 가장 작은 값을 선택해서 배열의 0번 원소로 옮기고, 그 다음 작은값을 선택해서 배열의 1번 원소로 옮기는 식으로 진행.

2. 퀵 정렬

  • qsort함수 → <stdlib.h> 헤더파일 필요.
  • 가변 길이 배열이 c99 표준에서 추가.
    • vs2019에서는 지원x.
    • 가변 길이 배열 : 배열의 크기를 컴파일 타임에 정하지 않고 실행 타임에 정할 수 있도록 하는 기능.
profile
보안 공부하는 대학교 4학년 / 시리즈에서 더욱 편하게 글을 찾아보실 수 있습니다:)

0개의 댓글