어서 오세요
이번 강의에서는 배열의 개념에 관해 얘기할 거예요
네 배열은 단일 변수에 다양한 값을 저장할 수 있게 해 주는 개념이에요
기본적으로
배열은 프로그래밍 언어에서 흔해요
프로그래밍을 단순화하고 효율적으로 만들 수 있죠
C의 배열 사용과 크리에이팅에 대해 말씀드리죠
배열이죠
특정 형식의 데이터 값을 저장하는 프로그램에선 아주 일반적이죠
네 네 스포츠 프로그램에서 예를 들어 모든 경기의
점수를 저장하거나 각 선수의 점수를 저장할 수도 있죠
네 네 지금까지는 쉽게 구현할 수 있었지만 각 점수마다 다른
변수를 써야 했죠
게임이 아주 많다고 상상해 보세요
야구는 162게임이나 하잖아요
네 만약 통계 같은 걸 저장하고 싶은 야구 프로그램을
만든다면 매 경기마다 162개의 변수를 만들어서
점수를 유지해야 해요
정말 골치 아프네요
아주 지루할 거예요
감당이 안 돼요
여기서 arraycom이 작동합니다 배열이
이 문제를 해결하죠
변수 162개를 만들 필요가 없어요
단일 변수를 생성하고 특정 방식으로 접근할 수 있죠
배열은 하나의 이름으로 값을 묶게 해주죠
데이터 각각의 항목에 대해 분리할 필요가 없어요
그래서 여러분은 보다 효율적인 프로그래머가 될 수 있어요
배열은 고정된 데이터셋을 말해요 모두 같은 형식이죠
아나레이의 유일한 문제는 배열의 크기를 바꿀 수
없다는 거예요
배열을 만들고 나면 이 크기가 될 거예요
또 다른 제약은 다중 유형의 데이터는 저장할
수 없다는 거죠
배열을 선언하고 sstill이 숫자와 int를 저장하면
int를 저장해야 해요
몇 가지 제한이 있어요
배열을 어떻게 선언하죠?
declarea 변수를 사용할 때 무엇을 해야 할까요?
프로그램에 이변성이 존재한다고요?
원시 데이터 타입을 선언할 때 메모리
양식을 할당하죠
배열을 선언할 때 배열 내의 데이터 아이템은
요소로 불리죠
이건 배열을 생각할 때의 또 다른 개념이에요
요소라는 건 배열에 있는 어떤 물체를
말하는 거예요
기억해야 할 것은 배열은 같은 이름의 다양한
값을 갖는다는 거죠
네 그리고 말씀드린 대로 어레이의 요소들이 같은 형식이어야 해요
데이터 타입을 섞어서 일치시킬 수 없습니다.
arrayof 5 int와 5 Longs는 안 돼요
다중 데이터 타입의 단일 레이 같은 건 없어요
배열 ina 프로그램을 선언하는 건 일반적인
변수 선언과 유사하죠
이름만 지정하고 괄호를 사용하면 돼요
그게 유일한 차이점이에요 이름을 따라
대괄호를 쓰는 거요
네 여기 예제가 있어요 일반 변수 선언처럼
보이지만 여기 보시면 괄호가 있죠
정상이 아닌 건 그것뿐이고 그 안에
숫자가 있어요
괄호 안에 있는 숫자가 크기를 나타내요
네 숫자라는 이름의 배열을 만들겠다고 하고
있어요 긴 형식으로요 10가지 요소를 포함할 거예요
아주 간단해요
네 이건 숫자죠 선언이에요 세미콜론이 끝에 있으니까요
변수 선언과 비슷합니다 괄호와 숫자가
있습니다 이것은 배열의 크기 혹은 배열 차원입니다
일단 배열을 지정하면 그걸 사용하고 싶어질 거예요
그 안의 데이터를 처리하거나
거기에 데이터를 쓰는 거죠
네 그러기 위해서는 배열이 메모리에 어떻게
저장되고 어떻게 액세스되는지 이해해야 하죠
네 네 배열이요 배열의 각각의 요소와 데이터 아이템이요 같은 이름으로
접속할 수 있어요
여전히 변수 이름으로 액세스할 거예요
네 하지만 레이에서 특정 값을 원한다면 인덱스나
서브스크립트라는 걸 사용해야 해요 이 두 용어는 교대로 사용됩니다
네 네 이 인덱스 혹은 서브스크립트 값은 숫자로 괄호 안에
있을 겁니다 배열의 한 요소에 접근하거나 배열의 바로 그 지점에
접근하려면 배열 이름에 따른 값을 작성하세요
인덱스 값은 0부터 순차적으로 시작하는 거예요
네 우리가 배열과 요소에 관해 얘기할 때 배열의
인덱스나 서브스크립트에 관해 얘기할 때 모든 서브스크립트는 0에서 시작할 수 있어요
기본적으로 그들의 광선이 0이라는 거죠
크기 10의 요소에 대한 인덱스 값은 0에서 9가 되죠
네 0은 첫 번째 배열 요소를 나타내고 9는 10번 배열의
마지막 요소를 참조할 거예요
0 기반 배열의 이 개념을 이해해야 해요
네 직관적으로 이렇게 생각할 수 있죠 배열의 첫 번째
부분에 접근하고 싶다고요 네 인덱스 원을 제공하죠 아뇨 0에서 시작하니까요
네 그래서 아주 흔해요 실수로 배열에 접속해서 1시에 종료하는 경우가
많죠 1시에 시작하는 줄 알았는데 0시에 시작하지
않으니까요
Off by 1 Error라고 하죠
간단한 정수 기능을 사용해 액세스하기 원하는 요소를
명시적으로 참조할 수 있어요
네 예를 들어 배열에서 네 번째 값에 접근하려면
배열 이름을 입력하고 괄호 안에 3이라고 입력해야 해요
배열 이름 sub-3은 4번째 값에 접근할 거예요
배열 이름이 0 기반이니까요
액세스하고자 하는 요소에 대한 숫자만
제공하면 되죠
다시 말씀드리지만 0루라는 걸 기억하세요
네 번째 요소는 세 번째예요
8번째 요소로 접근하려면 인덱스 7을 사용하세요
아나레이 요소를 위한 인덱스도 지정할 수 있어요 식을 사용해서요
이제 숫자만 사용하면 돼요
이름을 따서 스퀘어브랙츠에 표현을 쓸 수도 있어요
네 하지만 그 결과 가능한 인덱스 값 중 하나에 부합하는
정수 값이 나와야 해요
네 10 크기 배열에 식을 사용한다면
그 식은 0부터 9까지의 숫자로 평가해야 해요
네 아주 흔해요 요소들을 배열에 저장할 때 루프를 이용해
접근하는 게요 그에 대한 예도 보여드리죠
네 그래서 예를 들어 여기 for 루프가 있죠 루프 제어 변수를 0-I로 초기화하고
있어요 I가 10 이하로 나오면요
지금 하는 건 배열에 있는 숫자를
보여주는 거예요
printfnumum은 %d라고
하고 숫자 sub-I, I는 변수죠
네 네 변수식에서 변수를 사용할 수 있어요 그 변수가
0부터 9까지의 숫자를 나타내는 한요 이 경우엔 그렇습니다
네 요소들에 접근하거나 그 요소들에 데이터를 쓰기 위해
루프를 통해 배열을 반복하는 것이 아주 일반적입니다
요약하자면 제가 찾은 일러스트레이션이에요
이게 배열의 구조예요
네 숫자라는 배열이 있다면 그 배열의 이름이
있을 거예요 그다음 괄호를 써서 배열의 개별 요소를 식별하죠
네 그래서 배열을 선언할 수 있죠 형식과 이름을 지정하고
괄호 안에서 크기를 지정해서요
액세스하고 싶을 땐 배열 이름과 인덱스
값을 사용하죠
asize 10를 가진
배열은 0부터 9까지 유효한 인덱스를 갖게 되죠
네 그럼 유효하지 않은 인덱스로 배열의 어떤 요소에 접근하려
하면 어떻게 될까요? 예를 들어 11을 인덱스로 사용해 10 크기 배열에 접근하려 하면요?
10이 인덱스라면요?
아웃 오브 바운드 에러가 배열 아웃이 될 거예요
네 인덱스 값에 식이나 변수, 상수를 사용하면
배열 범위 밖에 있죠 범위 밖에서는 어떻게 되죠?
네 그건 음수거나 실제 크기보다 큰 숫자라는 뜻이죠
크기 빼기 1보다 큰 숫자요 기준이 0이니까요
네 따라서 크기 10 배열의 경우 크기 1 크기 9보다
크면 오류가 발생하게 돼요
네 범위 오류 배열의 문제도요 프로그램이
중단될 수 있어요 더 나쁜 건 프로그램이 정상적으로 행동하는
것처럼 보여도 실제로는 그렇지 않다는 거죠
결과에 일관성이 없어요
때로 어레이에는 아무 의미 없는 데이터인 가비지
데이터도 있어요
경계 오류의 배열은 정말 예측할 수 없어요
네 문제는 컴파일러가 경계 밖으로 나온 배열을 확인할
수 없다는 겁니다 컴파일러는 여러분이 더 큰
것을 할당했는지 혹은 크기보다 더 큰 것에 엑세스했는지
알지 못하거든요
여전히 컴파일할 겁니다 이 영역은
오류가 났지만요
b운드error 배열은 런타임 에러예요
프로그램을 실행하기 전에는 알 수 없어요
그래서 프로그래밍이 예측 불허가 될 수 있어요
네 따라서 배열에 접근하는 방법을 아주 잘 알아야 합니다 사용하는
인덱스 값과 그 인덱스 값으로 데이터를 작성하는
방법도요
서레이 지수와 바운드를 잘 보세요
아나레이에 데이터를 작성하는 건 아주 간단해요
기본적으로 인덱스를 조정 사용할 건데요
네 네 그래서 값은 배열 구성 요소에 저장될 수 있습니다 등호의
왼쪽에 해당 배열 구성 요소를 지정하고 대괄호를 이용해
쓰고자 하는 요소를 지정함으로써요
네 그래서 이 예제에서는 레어라는 이름의 배열이 있어요 크기가 어느 정도인지
몰라요 100개보다 커야 해요 아니면 선을 넘을 거예요
오류입니다
하지만 이 예제에선 준수 하위 100은 95와 같다고 하죠
등급 배열의 100번 요소 안에 95라는 값이 저장돼
있어요 아주 간단하죠
인덱스를 지정하고 원하는 값을 입력하면
되죠
변수를 이용해 배열에 값을 할당할 수도 있어요
다른 변수를 할당하는 것처럼 95를 변수에 저장할 수 있어요
이제 배열 사용법을 살펴보죠
네 여기 예제가 있어요 배열을 이용해 합계를 낸 다음
10개의 숫자를 읽어 그 10개의 평균을 내놓는 거죠
이제 결과를 읽으면서 합계를 계산하고
평균을 표시할 거예요
네 이 시점에서 저는 이 예제를 코드블록에 넣고
싶어요 그리고 실행시켜서 어떻게 작동하는지 보여드릴게요
네 여긴 일반적인 뷰예요 간단한 프로젝트죠 코드 블록에서 배열이 어떻게 작동하는지
보여드릴게요
주요 기능을 조정했어요
여기가 프로그램의 입구예요
12번 라인에서 배열을 재배열할 거예요
형식 int 사이즈 10을 선언하죠
크기는 브래킷 안에 있고 세미콜론으로 끝나요
10개의 값을 저장하기 위한 배열이죠
네 네 이 배열을 저장하지
않으면 우리가 해야 할 일은 이렇게 말해야 해요: 점수 1 실내 2학년 3학년
얼마나 문제가 많고 지루한지 아시겠죠?
네 10개의 아이템을 저장할 수 있는 단일 변수를 생성할
수 있고 그것들을 함께 묶을 수 있습니다
네 네 아이템을 배열해 저장할 땐 데이터 값이 다르길 바라지
않죠 전부 다른 것들이죠
이 예제처럼 우린 저장을 하죠 모든 학년으로요
네 배열에 이름을 붙여서 뭔가를 저장하고 내 성적을
저장하고 싶지 않아요 내 걸 저장할 거야
네? 네? 제 나이가 몇이든 간에요
배열일 때도 같은 형식의 데이터를 저장하도록 하세요
라인13의 다음 변수는 count변수인데요
10점 만점이에요
읽어야 할 횟수의of 값이 될 거예요 배열을
거치니까요
네 섬은 길어요 섬은 길어요 값을 살펴보면서 숫자를 합계할
거예요 평균은 부동 소수점 수가 되겠죠 숫자의 평균을
얻고 싶으니까요
네 네 17번째 줄에서 가장 먼저 할 일은
사용자에게 10개 등급에 들어가라고 말하는 것입니다 그리고
값을 읽습니다
네 20번째 줄에서 제가 들여쓰기를 하고 들여쓰기란
좋은 이름을 쓰고 들여쓰기란 코드 블록에 대한 코드를 잘 차단하고 있죠
여기 20번째 라인에서 루프 컨트롤 변수를 선언하죠
네 네 저는 컴파일러 C를 쓰고 있어요 컴파일러 89이죠 그래서 선언도
못 하고 초기화도 못 해요
보통은 이렇게 하잖아요
CC89 컴파일러가 오류를 발생했기 때문이죠
그래서 line20에 변수를 선언하고 for 루프를 사용해요
이전 강의에서 배웠듯이 코딩을 반복할
수 있어요
네 여기선 counter-controll for 루프를
사용할 거예요 0시부터 시작해서 10시까지 할 거예요
고스루 10번 반복을 할 건데 인덱스가
0인 게 보이시죠
변수 I를 이용해 배열에 엑세스할
거니까요
네 for 루프 마지막을 보면 반복문 변수를
증가시켜서 제어할 수 있습니다
네 I 더하기 1의 값을 출력할 거예요 배열을
통해 숫자가 어디쯤 있는지 보여드리려고요
이것은 기본적으로 센터 1급, 2급, 3급, 4급을 가리켜요.
그런 다음 Scanf를 이용해 등급에 따라 묻죠
배열에 저장할 거예요
배열에서 접을 때 보일 거예요 일반적인
변수 액세스와 같죠
그냥 등급을 사용하고 인덱스를 지정하는 거죠
여기서 I를 인덱스로 사용하고 있죠
네 그럼 0이 되겠죠 1단계예요 1단계 2단계는
2단계죠 3단계
네 0으로 시작하길 잘했어요 배열은 0 기반이니까요
그런 다음 연산자 주소만 사용하죠 &&요
같이 검토하면서 성적을 합산할 거예요
SUMequal은 SUM 더하기 서브 I라고 하죠
학년별로 합계를 계산할 거예요
그리고 그런 다음 10번 실행한 후 루프 밖으로 나오면
평균은 count로 나눈 합과 같다고 하고 float로 그걸 캐스트하죠
여기서 캐스팅을 해요
데이터 타입이 바뀌고 있어요
네 합을 기억하세요 합을 count로 나누죠 합은 길고 int로 셉니다 그걸 퍼레이드 수레에
쓸 거예요
그리고 마지막에 평균치를 출력하죠
네 그럼 이걸 실행해서 오류가 없는지 확인해보죠 오류 0개, 경고 0개가
있네요
이제 실행해보죠
제가 말씀드린 걸 정확히 할 거예요
네 10레벨을 입력하라고 하고 작은 표시 안에 1을 두죠 어떤 숫자인지
알 수 있게요
9532 55라고 입력하고 아무 숫자나 입력할
거예요
꼭 말이 되진 않지만 괜찮아요 그리고 마지막 숫자 23이요
그 10배의 평균은 51배예요 20살요
변수를 10개 안 만들어도 되니 정말 좋아요
네 네 서브스크립트를 이용해 배열에 액세스하고 서브스크립트를 이용해
배열에 값을 할당할 수 있어요
scanf를 할 때 할당하는 거에요.
그 서브스크립트에 데이터를 할당할 거예요
네 이제 이제 등호를 설정하는
거죠 이렇게 설정해요
1로 바꾸지 말죠
0부터 시작한다고 해보죠 하지만 이번엔 인덱스
10까지 가볼 거예요
명심하세요, 인덱스 10은 범위를 벗어났어요 배열
크기가 10이니까요 인덱스 값은 0이니 최대 인덱스는 9죠
다시 컴파일도 할 수 있습니다 컴파일러는
경계 에러를 감지하지 못하거든요 언제 실행하느냐가 문제죠
이 프로그램을 진행할 때 큰 문제가 있어요 고등학교
2학년 때 도전하는 거죠
다 잘될 거예요
10레벨까지 올라갔을 때 문제는 11레벨까지 올라갔을
때 발생해요
이제 11개가 됐고 데이터를 저장하려고 해요
나쁜 일이 일어난 건 아니지만 우버버리지 기능은 옳지 않아요
범위 밖의 실수를 하면 예측할 수 없는 행동이죠
네 그러니 아이 레슨 수를 확인하고 정보에
엑세스할 때 경계를 벗어나지 않도록 확실히
해야 해요
네 이게 배열의 기본이에요 배열을 선언하는 거죠
크기를 지정해요 데이터 형식 다음 크기와 괄호를 지정하죠 배열에 접근하거나 데이터를
저장할 수 있습니다 인덱스에서 서브스크립트 I를
이용해 값을 할당할 수 있습니다
서브스크립트를 이용해 Inindexes도 프린트할 수 있어요
배열이 꽤 많이 사용될 거예요
레이와 관련된 많은 예제가 있을 겁니다. 단순화시키기 때문이죠.
배열은 고정된 크기란 걸 기억하세요
성적은 못 바꿔요
프로그램을 실행하면 항상 10이 되죠
그 이상의 데이터를 할당하면 확장되지 않아요
또한 성적표는 동일한 데이터 타입이어야 한다는 걸 기억하세요
문자열이나 단어는 저장할 수 없고 int만 저장할 수 있어요
플로트는 저장할 수 없고 int만 저장할 수 있어요
고마워요