처음 배우는 배열은 정말 이게 무슨소리인지 하나도 못알아먹는다.
최대한 자세히 설명을 해보도록 하겠다.
배열 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문을 사용할 때 이러한 문제점을 늘 염두해 두고 사용하도록 하자.
이로써 기본적인 배열의 형태와 쓰임새를 알아보았다. 다양한 응용이 가능할 것이다.
'IT Program > Java Basic' 카테고리의 다른 글
자바(java) 클래스 생성 단축키, 새로운 출력 방법(printf), 이스케이프, 서식 지정자(%d, %s, %c, %f...) (2) | 2022.03.04 |
---|---|
자바 메모리 관리 스택(stack) & 힙(heap) 영역 설명, 예시 (6) | 2022.03.02 |
자바 참조 타입, 기본 타입 ,스택(stack), 힙(heap), 문자열 비교, 주소값 비교 (0) | 2022.03.02 |
자바(java) 반복문 (do-while) & Scanner 예제 & 자바 문자열 받아오기 & 문자열 비교 (0) | 2022.03.01 |
자바(java) 반복문(while) & 자바 키코드(keyCode) 정리 & 키보드 제어 & while문 키보드 (0) | 2022.03.01 |