주인장의 프로그래밍 개발 공부방

[Chapter 5 배열] 3. 1차원 배열 사용 방법(저장, 출력) 본문

프로그래밍 기본 지식/Chapter 5 배열

[Chapter 5 배열] 3. 1차원 배열 사용 방법(저장, 출력)

거신 2019. 8. 27. 09:10

이번 시간에는 지난 번에 잠깐 만났던 1차원 배열에 대해서 알아보자.

1차원 배열이라고 해서 특별한 것이 아니고

우리가 배웠던 배열의 기본적인 형태이기 때문에

구조를 이해하는데에는 큰 어려움이 없을 것이다.

다만 여기에서는 1차원 배열을 만들고 사용하는 방법에 대해서 자세하게 알아보도록 하자.

 

목표 : 1차원 배열을 생성하고 자유롭게 1차원 배열을 활용할 수 있다.

 

1. 1차원 배열 선언 방법

 

우리가 배열을 처음 배울 때 이미 알아봤지만 복습 차원에서 다시 한 번 알아보자.

1차원 배열을 선언하는 방법은 다음과 같다.

 

예시1)

 

int[] intArray = new int[5];

 

자바에서는 배열 타입이라는 것이 존재하고 이를 표기하는 방법은

배열에 들어가는 값들의 타입 뒤에 [ ]를 붙여주면 된다.

위의 예시에서 int[]가 바로 배열 타입이 되고

여기에서 선언한 배열은 int타입의 값만 저장할 수 있다.

C언어나 타 언어에서는 배열 타입을 선언하는 방법은 조금 다를 수 있겠지만

자바에서는 int[]와 같은 형태로 작성하면 된다.

좀 더 자세한 내용은 바로 이전의 글을 읽어보길 바란다.

 

예시1의 경우에는 배열타입이 int[]이고 배열명이 intArray이며,

방이 5개가 있는 1차원 배열을 하나 만든 것이다.

1차원 배열은 딱히 특별한 것이 아니라 배열의 인덱스가 하나만 존재하는 형태의 배열이 되겠다.

다시 말해, 배열의 방을 찾아가는데 필요한 방 번호는 하나만 있으면 된다는 뜻이다.

 

2. 1차원 배열에 값을 저장하는 방법

 

1차원 배열을 선언했으니 이제 사용하는 방법에 대해서 알아볼 필요가 있다.

이전에 반복문을 배울 때도 언급했었지만 배열은 반복문, 특히 for문과 아주 밀접한 관련이 있다.

배열 안을 비교적 자유롭게 돌아다니기 위해선 반복문이 필요하고

for문이 가장 적합한 녀석이라고 할 수 있겠다.

물론 우리들이 직접 방 번호를 지정해서 해당하는 배열의 방에 접근할 수도 있다.

 

먼저 배열에 값을 저장하는 방법에 대해서 알아보자.

다시 예시 배열을 하나 생성해보자.

 

예시2)

 

char[] charArr = new char[10];

 

이번에는 char타입을 저장할 수 있는 char[] 배열을 선언해보았다.

일반적으로 배열의 방에 접근하기 위해서는 [ ]안에 해당하는 인덱스 번호를 넣으면 된다.

예를 들면, 0번 방에 접근하겠다면 charArr[0]으로 적으면 되는 것이다.

여기에서 원하는 값을 넣으면 되는데

문제는 우리는 지금 배열에 10개의 방을 생성했고 방마다 값을 다 집어넣기 위해선

charArr[0] = 0, charArr[1] = 1, charArr[2] = 2, ..., charArr[9] = 9와 같이

하나하나 접근을 해야한다는 점이다.

 

물론 이렇게 해도 되고 원리를 따져보자면 이런 식으로 값이 저장되는 것이 맞다.

하지만 우리가 코드를 작성하는데 있어서 이런 방법은 굉장히 비효율적인 방법이라고 할 수 있겠다.

만약에 우리들이 제한된 원하는 방에 원하는 값만 저장하겠다면

당연히 위의 방법을 사용해야겠지만

배열의 모든 방에 값을 집어넣기 위해선 위의 방법이 아니라 반복문을 사용하면 훨씬 편리하다.

 

예제 코드를 살펴보자.

 

예시3)

char[] charArr = new char[10];
for(int i = 0; i < 10; i++) {
	charArr[i] = 67 + i;	//10개의 방에 대문자 A부터 J까지 넣기 위한 코드(아스키 코드 활용)
}

예시3은 앞서 선언한 char[] 배열에 0번방부터 9번방까지

A부터 J까지 알파벳 대문자를 저장하는 코드가 되겠다.

이렇게 반복문 하나만 가지고 배열의 10개의 모든 방에 값을 저장할 수 있는 것이다.

지금은 방이 10개뿐이지만 만약 100개, 1000개, 그 이상의 수많은 방이 생성되어 있다면

당연히 반복문을 쓸 수 밖에 없을 것이다.

 

그런데 여기에서 눈여겨봐야할 부분이 있다.

바로 반복문 안에서 i < 10이다.

반복문을 알고 있는 사람이라면 딱히 이상한 부분을 느낄 수 없을 것이다.

아무런 에러도 없고 문제없이 잘 동작하기 때문이다.

그런데 여기에서 적은 10이 다른 경우에는 문제를 발생시킬 수 있는 요인이 된다.

 

이런 경우가 발생했다고 가정해보자.

지금은 배열의 방을 10개로 지정했지만

우리가 방의 개수를 8개로 줄이거나 15개로 늘렸다고 생각해보자.

이렇게 배열의 방 개수에 변화가 생겼을 때는 부득이하게 for문의 코드를 수정해야할 필요가 있다.

방이 8개라면 i < 8로

방이 15개라면 i < 15로 말이다.

뭐 이렇게 바꾸는건 금방 할 수 있으니까 큰 문제가 되지 않을 것이라고 생각할 수 있지만

우리가 작성한 프로그램의 스케일이 엄청 크다면 얘기가 달라진다.

배열의 방 개수를 바꾼 것 뿐인데 이 배열을 사용하는 반복문이란 반복문에서는

문제가 끊임없이 발생한다는 것이다.

어느 세월에 그걸 다 고치고 있겠는가....

그렇기 때문에 우리는 이 후에 발생할지도 모르는 유지보수과정에서

위와 같은 문제를 예방하기 위해 반복문에 약간의 수정이 필요하다.

 

예시3 수정) 

char[] charArr = new char[10];
for(int i = 0; i < charArr.length; i++) {
	charArr[i] = 67 + i;	//10개의 방에 대문자 A부터 J까지 넣기 위한 코드(아스키 코드 활용)
}

수정한 부분은 예시3에서 10이었던 부분을 charArr.length라는 명령어로 변경한 것 뿐이다.

여기에서 length가 하는 역할은 우리가 선언한 배열 charArr의 길이,

즉, 방의 개수를 리턴해주는 역할을 한다.

우리가 10개의 방을 생성했기 때문에 여기에서 charArr.length는 10이라는 값을 가지고 있는 것이다.

이렇게만 수정해도 나중에 charArr의 방 개수를 임의로 바꾸더라도

반복문에서 어떠한 문제도 발생하지 않고 우리가 굳이 코드를 수정하지 않아도 되는 것이다.

앞으로 좋은 프로그래머가 되려고 한다면 이러한 사소한 것에서도

세밀하게 코드를 작성하는 버릇을 들여놓는게 굉장히 도움이 될 것이라 생각한다.

 

결론적으로 만약 반복문을 배열에서 사용한다면 반복하는 횟수

10과 같이 정해진 값으로 적는 것이 아니라 예시3수정과 같이 배열의 크기를 리턴하는

.length를 사용하길 바란다.

 

3. 1차원 배열에서 값을 출력(받아오는)하는 방법

 

저장하는 방법에 대해서 알아봤으니 이제는 저장한 값을 불러오는 방법에 대해서 알아보자.

결론부터 말하자면 불러오는 방법 역시 반복문을 사용할 것이다.

특정한 위치의 특정한 값을 가져오겠다면

이 역시 char c0 = charArr[0]와 같이 직접 대입하면 된다.

그러나 모든 값을 불러오는 경우가 발생한다면 어떨까?

 

char c0 = charArr[0], char c1 = charArr[1], char c2 = charArr[2]....와 같이

반복노동을 할 수 밖에 없을 것이다.

특히나 변수명은 반복문에서도 어떻게 할 도리가 없기 때문에

위와 같은 방법으로 사용할 수 밖에 없을 것이다.

그렇다면 도대체 어디에서 반복문을 사용한다는 말일까?

 

우리가 배열에서 값을 불러오거나 출력하는 경우에 대해서 한 번 생각해 볼 필요가 있다.

단순히 각각의 변수에 값을 저장하기 위해서라면

위와 같은 방법을 사용할 수 밖에 없을 것이다.

그러나 배열 안에서 특정한 값을 찾아서 출력하거나

모든 값을 가져와서 특정한 형태의 값으로 만들기 위해서라면

반복문을 사용하게 될 것이다.

그리고 배열을 사용하게 되는 경우는 이러한 경우들이 대부분일 것이다.

글로 된 설명보다는 역시 예시를 보도록 하자.

 

예시4)

char[] charArr = new char[] {'C', 'A', 'F', 'E'};
String str = new String();
for(int i = 0; i < charArr.length; i++) {
	str += charArr[i] + "";	//charArr[i] + ""는 char타입을 String타입으로 변환하는 과정
}
System.out.println(str);

예시4를 실행해보면 출력결과에 CAFE라는 결과를 얻을 수 있다.

반복문을 통해서 배열 charArr의 값들을 순서대로

String타입의 참조 변수 str에 누적시키는 코드가 되겠다.

이런 식으로 배열의 모든 값을 가져와서 우리들이 원하는 형태로 만들 수 있는 것이다.

 

예시5)

int[] num = new int[10];
for(int i = 0; i < num.length; i++) {
	num[i] = i + 1;
}

System.out.print("짝수인 수 : ");
for(int i = 0; i < num.length; i++) {
	if(num[i] % 2 == 0) {	//2로 나눠서 나머지가 0이라면 짝수
    	System.out.print(num[i] + " ");
    }
}

위의 코드를 실행해보면

2 4 6 8 10이 순서대로 출력되는 것을 볼 수 있을 것이다.

int[]타입의 배열에 1부터 10까지 순서대로 값을 집어넣고

순서대로 각 방의 값을 계산해 짝수인지 아닌지 판단해

짝수라면 출력하라는 코드가 되겠다.

이런 식으로 다양한 방법으로 배열의 값들을 우리들이 원하는 형태로 출력할 수 있는 것이다.

 

배열을 사용하는 이유는 여러가지가 있을테고

위의 예시들은 그 많은 방법들 중 일부일 뿐이다.

우리가 배열을 어떻게 사용하고 어떻게 출력할지는 본인의 선택이다.

여기에서는 배열에 저장하는 방법과 저장된 값을 불러오는 방법에 대해서만

정확하게 이해하면 되겠다.

 

4. 마무리

 

1차원 배열은 우리가 배열을 배우면서 가장 먼저 접했던 형태의 배열이 되겠다.

인덱스, 즉, 방 번호를 1개를 가지고 있는 배열이고

배열타입[] 배열명 = new 배열타입[방개수];의 형태로 선언한게 된다.

1차원 배열에서 값을 저장하고 불러오는 방법에는 여러가지가 있겠지만

일반적으로 반복문을 사용한다.

반복문 중에서 for문을 주로 사용하는데 for문의 조건식에

우리가 지정한 값이 아니라 배열의 길이를 리턴하는 배열명.length를 사용해서

유지보수에도 유용하게 작성하는 것을 권장한다.

불러올 때에도 역시 반복문을 사용해서 값을 출력하는데

여기에 조건문 등을 넣어서 본인이 원하는 값만 출력하거나

누적 등의 다양한 형태로 출력할 수도 있다.

Comments