방대한 양이 있을 때, 이러한 데이터를 반복적으로 처리해야 하는 경우에 반복문을 많이 쓴다. 그렇기 때문에 엄청나게 많은 데이터를 잘 정리정돈하기 위한 체계가 필요한데, 자바에 가장 기본적인 체계는 배열, Array이다. array와 반복문은 꼭 같이 배워야 한다.
우리가 [유비], [관우], [장비]의 데이터를 관리하려고 할 때
String users = "동인, 경주, 춘미"
이렇게 관리할 수 있다. 하지만 한 사람 한 사람 꺼내려면 문자를 쪼개는(split) 테크닉을 사용해야 한다. 이럴 때 배열을 사용해야 한다.
그래서 우리는
String[] users = new String[3];
문자열로 이루어져있는 배열이라고 하는 데이터 타입을 값으로 하는 users라는 변수를 만든다. 그리고 그 배열은 3칸짜리이다.
이 배열에 데이터를 담아보자. 참고로 컴퓨터의 배열은 0부터 시작한다.
String[] users = new String [3];
users[0] = "유비";
users[1] = "관우";
users[2] = "장비";
이렇게 하나하나 채워준다.
그렇게 출력하면 다음과 같이 나온다.
System.out.println(users[1]); -> "관우"
System.out.println(users.length); -> 3
System.out.println(users.length); 는 배열의 칸이 몇 개 있는지 나타내는 함수이다.
그리고 만약 integer 배열을 나타내고 싶을 때는
int[] scores = new int [3];
를 입력한 뒤 아래에 데이터를 입력하면 된다.
하지만 입력과 동시에 데이터를 넣고 싶으면
int[] scores = {10, 100, 200};
이렇게 하면 된다.
int[] scores = {10, 100, 200}; // 원소 element
System.out.println(scores[2]); -> 200
System.out.println(scores.length); -> 3
배열에서 순서는 index, 내용은 Element라고 지칭한다.
LoopArray
만약, 다음과 같은 배열을
package java1;
public class LoopArray {
public static void main(String[] args) {
String[] users = new String [3];
users[0] = "유비";
users[1] = "관우";
users[2] = "장비";
아래 코드처럼 만들고 싶을 때,
/*
* <li>유비</li>
* <li>관우</li>
* <li>장비</li>
*/
난감하다. 배열의 크기가 크면 클수록 수작업을 할 수 없게 된다. 이럴 때 반복문을 넣어주면 해결된다.
for(int i=0; i<3; i++) {
System.out.println("<li>" + users[i] + "</li>");
하지만 이 반복문은 약점이 있다. 가령
package java1;
public class LoopArray {
public static void main(String[] args) {
String[] users = new String [2];
users[0] = "유비";
users[1] = "관우";
for(int i=0; i<3; i++) {
System.out.println("<li>" + users[i] + "</li>");
}
}
}
배열이 두개의 데이터만 가지고 있을 경우, for문은 3번 값을 구하기 때문에 없는 값을 가져온다. 그래서 다음과 같은 오류가 발생한다.
출력값
<li>동인</li>
<li>경주</li>
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2
at Java1/java1.LoopArray.main(LoopArray.java:18)
또, 배열이 4개의 데이터를 가지고 있을 경우,
package java1;
public class LoopArray {
public static void main(String[] args) {
String[] users = new String [4];
users[0] = "유비";
users[1] = "관우";
users[2] = "장비";
users[3] = "간웅";
for(int i=0; i<3; i++) {
System.out.println("<li>" + users[i] + "</li>");
}
}
}
의 출력값은
출력
<li>유비</li>
<li>관우</li>
<li>장비</li>
이 된다. "간웅" 값이 누락이 된 것이다.
배열의 값에 따라 유동적이게 출력을 할 수 있는 방법이 있을까? 있다.
package java1;
public class LoopArray {
public static void main(String[] args) {
String[] users = new String [4];
users[0] = "유비";
users[1] = "관우";
users[2] = "장비";
users[3] = "간웅";
for(int i=0; i< users.length; i++) {
System.out.println("<li>" + users[i] + "</li>");
}
}
}
for(int i=0; i< users.length; i++) 이렇게 넣어주면 users에서 설정된 값에 따라 유동적으로 출력값도 달라진다.
반복문+배열은 엄청난 효과가 있다.
종합 응용
사용자가 1억명일 때, 이 사람이 1억명의 명단에 있는지, 또 비밀번호가 맞는지 확인해서 인증해주는 Application을 만든다.
package java1;
public class AuthApp3 {
public static void main(String[] args) {
String[] users = {"유비", "관우", "장비", "간웅"};
String inputId = args[0];
boolean isLogined = false;
for(int i = 0; i < users.length; i++) {
String currentId = users[i];
if(currentId.equals(inputId)) { // 만약 현재 유저와 inputId가 같다면 true가 된다.
isLogined = true;
break; // 올바른 유저가 있으면 for문을 더이상 실행할 필요가 없으니 멈춰주면 좋다. 아니면 발견했음에도 방대한 데이터를 샅샅히 뒤지고 있을 것이다.
}
}
System.out.println("Hi.");
if(isLogined) {
System.out.println("Master!!");
} else {
System.out.println("Who are you?");
}
}
}
해석 : users라는 배열에는 "동인", "경주", "춘미", "쪼리"가 들어있는 배열이다. arguments의 첫 번째 데이터를 입력한 값이 inputId가 된다. 일단 isLogined는 false인 상황이다. 만약 i가 0이고 i가 users배열의 수보다 작을때 다음 함수를 진행시킨다. currentId가 users[i]이면 inputId와 비교해준다. 둘의 콘텐츠 내용이 같을 경우 isLogined은 true가 되고 for문 동작을 멈춘다. 둘의 콘텐츠 내용이 다를 경우 i에다가 1을 더해준 후 다시 함수를 반복한다.
inputId가 currentI와 일치하는 내용이 있으면 isLogined true가 되고 넘어가며 일치하는 내용이 없으면 false 상태가 유지된다. 둘 중 어느 상황에서도 "Hi"는 출력도면 isLogined 상태가 true인 경우 "Master!!"가 출력된다. 그렇지 않은 경우 "Who are you?"가 출력된다.
***반복문을 만들었을 때 디버거를 이용해서 어떻게 흐름이 흘러가는지 천천히 확인하면 정말정말 도움이 된다!!!
이중배열
String[] [] users = {
{"유비", "1211"},
{"관우", "4321"},
{"장비", "9332"},
{"간웅", "1234"},
}
users에 이중 배열을 만들 때, 다음과 같이 넣어준다.
하지만 그러면
for(int i = 0; i < users.length; i++) {
String currentId = users[i];
if(currentId.equals(inputId))
이렇게 표현하면 오류가 난다.
'Java > 생활코딩' 카테고리의 다른 글
자바(Java) 개념 정리 - 객체 지향 프로그래밍 #16 (0) | 2020.06.30 |
---|---|
자바(Java) 개념 정리 - 메소드(method) #15 (0) | 2020.06.30 |
자바(Java) 개념 정리 - '==' vs 'equals' 차이 #13 (0) | 2020.06.25 |
자바(Java) 개념 정리 - 제어문(조건문, 반복문) #12 (0) | 2020.06.25 |
자바(Java) 개념 정리 - 앱 만들기 #11 (0) | 2020.06.24 |