본문 바로가기

별걸다하는 IT/프로그래밍언어

[C,C++,Java] 배열 크기 구하기, 배열 접근하기, 배열 출력하기, 배열 사이즈, ArrayIndexOutOfBoundsException

[C/C++/JAVA 프로그래밍 기초 목차]

저번시간에 진행했던 배열 포스팅을 이어서 진행해보려고 해요 ㅎㅎ

 

[Java, C, C++ ] 배열이란, 배열 선언 및 초기화 - 프로그래밍기초

[Java, C, C++ 프로그래밍 완전정복 목차] 오늘 포스팅: 배열 (Array) 기초 항상 프로그래밍 포스팅은 무엇을 할까 고민되는 것 같아요 ㅎㅎ 배열도 워낙 무궁무진해서리... 범위를 우케 나눠야 나중에 꼬이지 않..

jhnyang.tistory.com

해당 포스팅에서

"배열의 필요성, 배열의 선언과 초기화, 자바와 C/C+의 배열 공간할당 차이점 , 인덱스란?" 에 관해서 설명을 진행했었습니다 

 

ㅎㅎ그런데 방법에 대한 설명이 길어지느라 흔한 예제 한 번 제대로 살펴보지 않았더군요!!?!

저번시간에 한 걸 복습하는 차원에서 배열을 생성하고 출력하는 예제를 진행해봅시다.

배열 생성하고 출력하기 (반복문 사용)

배열을 생성하고 출력해봅시다.

색인이라고 부르는 인덱스(index)를 통해서 배열에 접근해 원하는 위치의 값을 뽑아낼 수 있습니다 ㅎㅎ

## C
#include <stdio.h>
int main() {
	int arr[] = { 10,20,30,40,50,60,70,80,90,100 }; //배열 선언 및 초기화
	int index = 0;
	for (index; index < 10; index++) {
		printf("index: %d, value: %d\n", index, arr[index]);
	}
	return 0;
}
## 자바
public class Main {
	public static void main(String[] args) {
		int arr[] = { 10,20,30,40,50,60,70,80,90,100 }; //배열 선언 및 초기화
		int index;
		for (index=0; index<10; index++) {
			System.out.printf("index: %d, value: %d\n", index, arr[index]);
		}
	}
}

반복문을 이용해서, 색인 시작점인 0부터 마지막인 9까지 차근차근 접근해 값을 출력해줬어요 

결과값

★ 조심해야할 부문! 배열의 개수가 n개 이면 index는 0부터 n-1까지이다!

많은 친구들이 arr[2]라고 하면 2번째 원소에 접근하는 거라 생각하는데, 사실 0,1,2 해서 3번째 원소에 접근하게 된다는거 ㅎㅎ

배열 출력하기 (자바)

자바의 경우, Arrays 라는 특별 클래스를 이용해서 배열의 원소를 한번에 출력할 수 있습니다.

(아직 클래스가 뭔지 모르신다면, 그냥 사용하기 편하게 하려고 특정 기능들을 모아서 패키지처럼 제공해주는거라 생각하면 돼요 ㅎㅎ 나중에 우차피 배움..)

Arrays.toStroing(배열)

사용예시 ↓

public class Main {
	public static void main(String[] args) {
		int arr[] = { 10,20,30,40,50,60,70,80,90,100 }; //배열 선언 및 초기화
		System.out.println(Arrays.toString(arr));
	}
}

출력결과

ArrayIndexOutOfBoundsException

그런데.... 첫번째 예시처럼 반복문으로 코드를 작성할때 약간 불편한 점이 보이지 않나요?

총 배열이 몇 개의 공간으로 구성되어 있는지 모르니까 반복문을 돌릴 때 개수를 세서 넣어줘야 하잖아요 ㅎㅎ

지금은 10부터 100까지 10단위마다이므로 총 10개라..

for ( index; index<10; index++) <---- 10을 넣어줌 그러나 배열 개수가 변경되면..?

반복문에 이렇게 10을 넣어줬지만, 배열이 추가가 되거나, 배열 개수가 완전 클 수도 있어요~

우리는 불완전한 인간이기 때문에 배열 개수를 일일이 세다보면, 실수로 하나를 더 세거나 덜 셀 수도 있겠죠 ㅎㅎ 

고럼 바로 오류 직결~! ㅎㅎ

 

실제로, 이 범위 부문을 11로 변경하고 실행해보면

이렇게 쓰레기 값이 들어가 있는 것을 확인할 수 있어요 ㅎㅎ C언어 컴파일러의 경우 배열 접근에 있어서 요휴성 검사를 진행하지 않기 때문에 에러를 일으키지는 않습니다. (그래서 더 주의해야함)

 

반면 자바의 경우, 아예 에러 경고가 뜬답니다! (컴파일은 되는데 에러가 떠요 ㅎㅎ)

Java의 경우

ArrayIndexOutOfBounds 에러 발생!!

 

이름에서 알 수 있듯이, ArrayIndexOutOfBounds 에러는 선언한 배열의 범위를 넘어서 참조하면 안되는 공간을 잘못 참조했을 때 발생되는 에러입니다.

배열 크기 구하기, 배열 사이즈 알기

이러한 실수를 줄이기 위해서, 배열 원소의 개수를 우리가 일일이 카운트 하는게 아니라 알 수 있는 방법이 있으면 그게 더 좋겠죠?ㅎㅎ 모든지 수기로 하는건 오류 발생률을 더욱 증가시키니까요 ~ㅎㅎ 

### C언어
#include <stdio.h>
int main() {
	int arr[] = { 10,20,30,40,50,60,70,80,90,100 }, index;
	printf("배열이 차지하는 바이트 크기: %d byte\n", sizeof(arr));
	printf("배열 하나의 원소가 차지하는 바이트 크기: %d byte\n", sizeof(arr[0]));
	printf("배열 원소의 개수 : %d ", sizeof(arr) / sizeof(arr[0]));
	return 0;
}

C언어나 C++에서 배열 원소의 개수는, 배열 전체 바이트 크기를 구한 다음에, 하나의 원소가 차지하는 바이트로 나눠주면 구할 수 있습니다.

sizeof 함수는 바이트 단위의 배열 크기를 반환합니다.

 

즉 위의 출력 예제를 배열크기를 구한걸로 대신해보면~~

#include <stdio.h>
int main() {
	int arr[] = { 10,20,30,40,50,60,70,80,90,100 }; //배열 선언 및 초기화
	int index = 0;
	int arr_len = sizeof(arr) / sizeof(arr[0]); //배열 원소의 개수를 구해버려!
	for (index; index < arr_len; index++) {
		printf("index: %d, value: %d\n", index, arr[index]);
	}
	return 0;
}

요렇게 될거예요 ㅎㅎ

[자바 JAVA]

근데 ~~ 배열의 크기를 구할 일이 엄청 많은데 ㅠ 매번 저렇게 나누기 하고,, 사실 처음 보는 사람이 보면 저게 길이 구하는 코드인지 한 번에 이해하기도 어려울거예요ㅠㅠ 

그래서 추후에 만들어진 자바는, 아예 길이구하는 기능을 넣어줬습니다 (짝짝짝)

(자세한 것은 이전 포스팅 자바와 C 배열 차이점 참고)

배열.length;

 

자바의 경우 배열 원소의 개수는 위 코드로 구할 수 있습니다.

public class Main {
	public static void main(String[] args) {
		int arr[] = { 10,20,30,40,50,60,70,80,90,100 }; //배열 선언 및 초기화
		int index;
		for (index=0; index<arr.length ; index++) {
			System.out.printf("index: %d, value: %d\n", index, arr[index]);
		}
	}
}

참고로 배열에서 사용할 수 있는 length 필드는 읽기 전용으로 설정되어 있기 때문에 값 변경이 불가합니다.

int length = arr.length=20; //WRONG

 

그러므로 위의 코드는 잘못된 코드예요 ㅎㅎ 컴파일부터 안됩니다 ㅎㅎ

 

다음 포스팅에서는, 문자열과 배열의 상관관계에 대해서 살펴볼게요 ㅎㅎ

저번 포스팅에 이어서 진행하는거라 이번엔 짧고 간단하게 필요한 정보들을 정리해봤어요 !!

공감, 댓글, 광고보답은 질좋은 포스팅 작성에 힘이 됩니당 :)