본문 바로가기

Java/생활코딩

자바(Java) 개념 정리 - 배열 #14

방대한 양이 있을 때, 이러한 데이터를 반복적으로 처리해야 하는 경우에 반복문을 많이 쓴다. 그렇기 때문에 엄청나게 많은 데이터를 잘 정리정돈하기 위한 체계가 필요한데, 자바에 가장 기본적인 체계는 배열, 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))

이렇게 표현하면 오류가 난다.