Welcome to Wesley & Harry's Traveling & Programming

IT Program/Java Basic

자바 배열(array) & 배열 출력 & 배열 for문 & 배열.length & 배열 에러

Wesley & Harry 2022. 3. 2. 19:25
반응형

처음 배우는 배열은 정말 이게 무슨소리인지 하나도 못알아먹는다.

최대한 자세히 설명을 해보도록 하겠다.

 

배열 array : 같은 타입의 변수를 하나로 묶어놓은 형태

배열은 많은 데이터를 다루는데 있어 편리하다.

 

기본 예시를 들어보도록 하겠다.

우리는 int형의 price1,price2,price3,price4,price5라는 변수를 5개 선언해보도록하겠다.

int price1;
int price2;
int price3;
int price4;
int price5;

이러한 방법으로도 가능하다.

int price1, price2, price3, price4, price5;

우리는 단 5개만의 데이터를 선언하기 때문에 직접 쓰는방법이 더 빠를수 있다.

하지만 데이터가 많아질수록 일일이 모든 변수를 선언하는 것은 비효율적이게 된다.

배열(array)를 쓰게되면 어떨까.

배열의 기본 형태이다.

배열은 대괄호를 통해 선언한다.

int[] price 정수배열타입의 price라는 이름

new 객체 생성

int[5] 정수타입의 배열 5칸

int[] price = new int[5];

5개의 int값이 들어가는 배열이 생긴다.

이런식으로 배열을 사용하면 좀더 쉽게 선언할 수 있다.

위 코드의 배열은 아래와 같이 생겼다.

0
(price[0])
0
(price[1])
0
(price[2])
0
(price[3])
0
(price[4])

각 배열 한칸마다 0을 적어놓은 이유는 int의 default(기본값)으로 초기화 되기 때문이다.

각 순서대로 price[0],price[1],price[2],price[3],price[4]의 인덱스를 가진다.

인덱스는 대괄호 [0] 부터 시작한다는 것을 잊지말자.

 

int[] price = new int[5]; 의 형태를 두개로 나눠보도록 하자.

int[] price;
price = new int[5];

첫째줄을 보자.

int[] price;

int형 배열 참조변수 price를 선언한다. stack 영역에 price가 선언된다는 뜻이다.

price

두번째줄을 보자.

price = new int[5];

new 연산자에 의해 메모리의 빈 공간에 5개의 int형 데이터를 저장할 수 있는 공간이 마련된다.

0
score[0]
0
score[1]
0
score[2]
0
score[3]
0
score[4]

각 배열의 요소는 0으로 초기화 되어있으며 각 칸마다 [] 대괄호로자리를 표시할 수 있다.

대입연산자 = 에 의해 배열의 주소가 price에 저장된다.

price
0x101(주소값의 예시)

이로써 배열의 길이가 5인 int형 price를 선언하여보았다.


배열에 값을 선언할땐 어떤 방법을 사용해야할까?

 

앞의 예제를 통해 알아보자. 간단하다.

package wesley.java.practice.basic;

public class arrayEx {
	public static void main(String[] args) {
		int[] price = new int[5];
		price[3] = 1;
		int value = price[3];
		System.out.println(value);
	}
}

main 아래의 코드를 살펴보자.

 

int[] price = new int[5];

5칸의 int형 배열을 갖는 price를 생성한다.

 

price[3] = 1;

앞서 말했던 것 처럼 price[3] (3의 인덱스를 가지는 부분)에 1을 넣어준다.

0
price[0]
0
price[1]
0
price[2]
1
price[3]
0
price[4]

int value = price[3];

int타입으로 value라는 변수를 선언해준다. 3 인덱스에 들어있는 값을 가져온뒤 value에 저장해준다.

System.out.println(value);

value값을 출력해준다.

아래는 실행 결과이다. 우리의 생각과 맞는지 확인해보도록 하자.


하지만 해당 방법의 선언은 단점이 있다.

인덱스 0부터 인덱스 4까지 값을 넣기 위해선

price[0]=1;

price[1]=41;

price[2]=22;

price[3]=51;

price[4]=14;

이런식으로 일일이 적어야하니 여간 불편한 것이 아니다.

배열의 값을 초기화 시켜주는데에는 여러가지 방법이 존재한다.

우선 가장 간단한 방법 두가지를 예시로 들어보겠다. 출력문 또한 예시로 같이들겠다.

package wesley.java.practice.basic;

public class arrayEx2 {
	public static void main(String[] args) {
		int[] price = new int[5];
		price[0] = 2241;
		price[1] = 51;
		price[2] = 4;
		price[3] = 641;
		price[4] = 41;
		System.out.println(price);
	}

}

우선 해당 코드를 따라해보도록 하자.

앞서 배웠던 내용을 복습할 수 있다.

price 배열을 선언 한 후

일일이 선언을 해준 뒤 출력을 해주었다.

우리의 생각대론 이상태로 적게되면 출력이 되어야한다.

결과값을 통해 알아보자.

우리의 생각처럼 price를 적어서 출력을 했을때는 이상한값이 나오게된다.

이 값은 무엇인가. 위에 링크가 걸려있던 게시물을 보고오게 된다면 아마 우리는 이것이 뭔지를 알 수 있을것이다.

이것은 배열의 주소값이다.

price라는 이름은 stack에 존재하고 price[0]~price[4]는 heap 영역에 존재하기때문에 

참조한 주소값이 나오는 것이다.

우리는 하나만 출력을 할 때는 price[4] 이런식으로 하나의 숫자만 출력이 가능했다.

모든 값을 다 보고 싶을때에는 System.out.println을 4개 쓰면 되지않을까?

맞다. 그런방법도 있엇다. 하지만 우리는 이전에 for문을 배웠다.

배열을 for문을 통해 출력해보자.

아래코드를 참조하자.

package wesley.java.practice.basic;

public class arrayEx2 {
	public static void main(String[] args) {
		int[] price = new int[5];
		price[0] = 2241;
		price[1] = 51;
		price[2] = 4;
		price[3] = 641;
		price[4] = 41;

		for(int i = 0; i <= 4; i++) {
			System.out.println(price[i]);
		}
	}

}

위의 코드는 같고 for문의 복습을 해보자.

int i = 0 

i는 0부터 시작한다. 

i<=4 

i의 값이 4보다 작거나 같을경우 반복문을 실행한다.

System.out.println(price[i]); 를 실행한다.

우리는 price[0]~price[4] 까지 실행을 원한다. 반복문 i의 값이 0이기 때문에 price[i]를 적어본다.

price[0]의 값이 출력이 된 후

i++을 통해 i의 값을 올려준다.

i의 값은 1인 상태로 i<=4의 조건식을 검사한다.

true라면 다시 실행문 시작

반복이다.

우리는 간단하게 for문을 통해 배열을 출력하는 법을 배웠다.


또다른 배열의 간단한 방법.

아래 코드를 참조하자.

package wesley.java.practice.basic;

public class arrayEx2 {
	public static void main(String[] args) {
		int[] price = { 10, 20, 30, 40, 50};
		for(int i = 0; i <= 4; i++) {
			System.out.println(price[i]);
		}
	}

}

정말 간단하게도 만들어지는 형태인 것을 볼 수 있다.

해당 결과를 돌리면 아래와 같다.

다른식으로 선언하는것도 가능하다. 어차피 똑같은값이 나올테니 결과값은 생략하도록 하겠다.

package wesley.java.practice.basic;

public class arrayEx2 {
	public static void main(String[] args) {
		int[] price = new int[] { 10, 20, 30, 40, 50};
		int[] example;
		example = new int[] {10,20,30,40,50};
		
		for(int i = 0; i <= 4; i++) {
			System.out.println(price[i]);
		}
		for(int i = 0; i <= 4; i++) {
			System.out.println(example[i]);
		}
	}
}

자신이 편한 방법을 사용하면된다.


그럼 for문을 써본김에 배열에서 한가지 더 써먹어보도록 하겠다.

일정한 패턴을 갖는 배열을 쓸땐 for문을 사용할 수 있다. 아래코드를 확인해보자.

package wesley.java.practice.basic;

public class arrayEx2 {
	public static void main(String[] args) {
		int[] price = new int[] { 10, 20, 30, 40, 50};
		int[] example = new int[5];
		//example의 for문으로 값넣기
		for(int i = 0; i <= 4; i++) {
			example[i] = i*10+10;
		}
		
		//출력부
		System.out.println("price의 배열값");
		for(int i = 0; i <= 4; i++) {
			System.out.println("price의 인덱스" + i + "값은 " + price[i] + " 입니다");
		}
		System.out.println("example의 배열값");
		for(int i = 0; i <= 4; i++) {
			System.out.println("example의 인덱스" + i + "값은 " + example[i] + " 입니다");
		}
	}
}

int[] example = new int[5];를 통해 5칸의 배열을 생성해두었다.

우리는 for문은 반복이라는것을 알고있다.

price의 배열과 같게 만들기 위해선

i의 값이 0~4까지 작동해야한다. 각 배열에 맞게 값을 넣어주기 위해서이다.

현재 price[0] = 10, price[1]=20, price[2]=30, price[3] = 40, price[4] =50 의 값으로 형성되어있다.

규칙을 먼저 찾아보았다. i의 값이 0일때 10, i의값이 1일때 20, i의 값이 2일때 30..

i의 값에따라 i*10+10 의 규칙이 있음을 알 수 있다.

그렇다면 우린 for문의 지역변수 i를 이용해 식을 작성하면 편리하게 입력이 가능하다.

 

여기서 궁금증이 하나 생길 수 있다. for문을 사용할 때 i의 값을 계속 사용하는것에 대해 말이다.

i는 해당 for문 블록에서만 사용할 수 있는 변수이다. for문안에서 선언되었기 때문이다.

해당 말이 무슨소리인지 잘 모르겠다면 그전 게시글 아래링크를 참조해보자.

최대한 쉽게 써놓았다.

지역변수.

2022.02.25 - [IT Program/Java Basic] - java 로컬변수 블록으로 간단하게 이해하기 & local variable error

 

java 로컬변수 블록으로 간단하게 이해하기 & local variable error

java에서 변수의 선언과 초기화는 필수적이다. 초기화를 해주지 않으면 해당 변수는 사용을 할 수가 없다. 예제를 적어본다. int wesley; System.out.print(wesley); 해당 예제는 초기화를 해주지 않고 변수

dongwoonew.tistory.com

결과값을 살펴보자.

 

 

우리의 생각대로 아주 이쁘게 잘나온다.

 


for문 배운김에 더 편한 형태를 찾아보자. for문에 꼭 맨날 갯수를 세어서 i 값을 지정해줘야할까?

아래 예제를 통해 알아보자.

package wesley.java.practice.basic;

public class arrayEx2 {
	public static void main(String[] args) {
		int[] price = new int[] { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 12, 42, 52, 14, 42, 52, 42, 14, 51, 52, 514, 162, 2615};
		
		//출력부
		System.out.println(price.length);
		System.out.println("price의 배열값");
		for(int i = 0; i < price.length; i++) {
			System.out.println("price의 인덱스" + i + "값은 " + price[i] + " 입니다");
		}
	}
}

price 배열에 아무숫자나 세지말고 넣어보자. 우린 여기서 생소한 글자를 발견할 수 있다.

price.length

뭔가 글만봐도 느낌이 올것 같다. 맞다 배열의 길이를 알아서 재주는 친구다.

우리는 이 함수를 통해 좀 더 편리하게 출력을 할 수 있다.

여기서 주의할 점이 있다.

우선 결과값을 보자

price의 길이는 23으로 22인덱스까지 있다.

for문의 i <price.length 값을

i <= price.length로 바꾸면 어떻게될까

0부터 23까지의 인덱스를 구하게 된다.

해당 코드와 결과값을 확인해보자.

package wesley.java.practice.basic;

public class arrayEx2 {
	public static void main(String[] args) {
		int[] price = new int[] { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 12, 42, 52, 14, 42, 52, 42, 14, 51, 52, 514, 162, 2615};
		
		//출력부
		System.out.println(price.length);
		System.out.println("price의 배열값");
		for(int i = 0; i <= price.length; i++) {
			System.out.println("price의 인덱스" + i + "값은 " + price[i] + " 입니다");
		}
	}
}

자바는 참 친절하다.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 23
at wesley.java.practice.basic.arrayEx2.main(arrayEx2.java:11)

라는 오류가 떳다.

우리는 영어를 잘 못한다.

간단한 영어만 조합해서 유추해볼 수 있고 자주보는 오류는 외울수 있게된다.

array 배열 index 인덱스가 out of 벗어낫다?

맞다 우리는 for문을 23번 돌리게 된다. 0부터말이다.

배열의 인덱스는 0부터 시작된다.

0~22의 인덱스를 다 출력하고 나면 해당 코드는 i의 값이 23까지 올라간다. 

출력을 하려고 보니 price[23]의 값이 없는것이다. 찾을수 없기 때문에 오류가 난것이다.

for문을 사용할 때 이러한 문제점을 늘 염두해 두고 사용하도록 하자.

이로써 기본적인 배열의 형태와 쓰임새를 알아보았다. 다양한 응용이 가능할 것이다.

반응형