JAVA

23-01-12 수업내용 정리

모건이삼촌 2023. 1. 15. 12:45

2023-01-12 09:30 ~ 18:30 수업진행

 

※ 수업내용

 

6) 무한반복문

프로그램을 작성하다보면 프로그램을 일부러 무한반복 되도록 하는 경우가 존재하는데, 앞에서 배운

for문, while문, do~while문을 이용한 무한반복문을 만들 수 있다.

for문의 조건이 생략되거나, while문, do~while문의 조건식이 true인 경우 무한반복 되며, 프로그램을 작성할 때 특정 조건에 따라 프로그램을 종료할 수 있도록 적절히 작성해야 한다.

 

 7) 제어문 작성 시 주의사항

  가. 제어문 작성시 do~while문 뒤에만 세미콜론(;)이 들어가며 나머지 제어문에는 세미콜론을 넣으면 안된다.

  나. 무한반복문 아래에 다른 코드를 넣으면 실행할 수 없는 코드이므로 컴파일 에러가 발생한다. 이런경우 무한반복문 안에 특정조건에 해당하는 경우 중지할 수 있는 코드(break)를 추가하면 에러를 제거할 수 있다.

  다. 가장 많이 사용하는 무한반복문은 while문을 이용한 반복문이며, for문이나 do~while문을 이용하는 경우 의도치 않은 결과가 발생하거나 에러가 발생할 수 있으니 주의해야 한다.

 

★ 배열

1. 배열선언

배열은 같은타입의 변수를 여러개 쓰기 위해 사용한다.배열은 먼저 변수를 선언하고 사용해야한다.배열을 선언하는 방법은 두가지가 있다 (1) 데이터 타입[] 변수명; (2) 타이터 타입 변수명[];데이터 타입 뒤에 대괄호[] 를 넣거나 변수명 뒤에 대괄호[]를 넣으면 배열 변수를 선언한 것이다.배열도 참조자료형으로 위치정보를 "참조"하는 자료형이다.값이 초기화 되지 않은 상태에서는 값을 사용할 수 없고 초기화를 해줘야 하는데, 배열 역시 "객체"이므로 null값으로 초기화 할 수 있다.

 

아래 예제를 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package chapter6;
 
public class ArrEx {
 
    public static void main(String[] args) {
        
        int[] arrInt;
//        자바의 지역변수는 반드시 초기화를 해줘야 하는데 초기화가 되지않아 에러발생함.
        int arrInt2[] = new int[5];  // int 공간을 5칸을 쓰겠다는 뜻
//        arrInt2[0] = 1; 
//        arrInt2[1] = 2;
//        arrInt2[2] = 3;
//        arrInt2[3] = 4;
//        arrInt2[4] = 5;
            for (int i = 0; i < arrInt2.length; i++) {
            arrInt2[i] = i + 1;
            }
        System.out.println(arrInt); // 에러 발생
        System.out.println(arrInt2);
    }
}
cs

예제의 arrInt 변수는 초기화 하지않았고 arrInt2 변수는 new int[5]로 초기화 하였다.

첫번째 출력문은 변수를 초기화 하지않아 컴파일단계에서 에러가 발생하였고

두번째 출력문은 변수를 초기화 하였기 때문에 에러가 발생하지 않는다.

arrInt2[] = new int[5] 코드 초기화값 앞에 new 보면 새로운 인스턴스를 생성하겠다는 뜻이다.

 

배열은 반드시 사용하기전에 선언과 초기화가 먼저 이루어 져야 한다.

 

위 예제에서 int arrInt2[] = new int[5]는 길이가 5개인 배열객체를 생성하는 소스이다.

즉 5개의 정수를 순서대로 넣을 수 있는 배열이다.

지금은 아무런 값을 대입하지 않은 상태로 초기화를 하지 않았지만, 객체로 생성되는 순간 int타입의 기본값인 0으로 초기화 된다. 5개의 자리에 모두 0이 들어가 있는 것이다.

아래 표를 보자.

위 표는 arrInt2변수를 5개의 공간이 있는 구조로 표현한 것이다.

이 순번을 배열에서 인덱스(index)라고 부른다.

중요한점은 1부터 시작하는것이 아니라 0부터 시작한다는 것이다.

이 인덱스번호를 가지고 초기화 하는 방법을 알아보자.

1
2
3
4
5
6
7
8
    int[] arrInt = new int[5];
    
    arrInt[0] = 1;
    arrInt[1] = 2;
    arrInt[2] = 3;
    arrInt[3] = 4;
    arrInt[4] = 5;
 
cs

인덱스 0번부터 4번까지 순서대로 1부터 5까지의 값을 대입했다.

이렇게 대입된 값들을 다시 표형태로 살펴보자.

이제 각 인덱스 위치의 값들이 바뀐것을 알 수 있다.

인덱스는 변함이 없지만 0번 인덱스에는 값 1이, 1번 인덱스에는 값2가 대입되어 있는 것이다.

 

참조자료형의 기본값은 null 이며, 기본자료형의 각 종류별로 기본값이 차이가 있다.

아래 표를 보자

 

이번엔 배열 변수를 선언과 동시에 초기화 하는 방법을 알아보자.

 

1
String[] arrStr = {"홍길동""이순신""김유신"};
cs

arrStr이라는 이름의 문자열 타입의 배열 변수를 선언함과 동시에 중괄호{}를 사용하여 "홍길동", "이순신", "김유신" 세 문자열을 배열의 값으로 초기화 하였다.

변수의 0번 인덱스에는 "홍길동"이, 변수의 1번 인덱스에는 "이순신", 변수의 3번 인덱스에는 "김유신"이 차례대로 대입된 것이다.

배열을 선언하는 방법은 여러가지가 있지만, 주의할 점은 처음 배열을 선언할 때 배열의 길이가 정해지며, 나중에 길이를 변경할 수 없다. 그리고 각 값의 위치를 나타내는 인덱스는 0번부터 시작된다는점 꼭 기억하자.

 

2. 배열사용

배열의 길이를 알 수 있는 방법은 배열변수명.length이다

아래 예제를 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package chapter6;
 
import java.util.Arrays;
 
public class ArrEx6 {
    public static void main(String[] args) {
        
        String[] arrStr = {"홍길동""이순신""김유신""장보고"};
 
        System.out.println("비열의 길이 : "+arrStr.length);            
 
        for (int i = 0 ; i < arrStr.length ; i++) {
            System.out.println(arrStr[i]);
        }
        System.out.println(arrStr);
        System.out.println(Arrays.toString(arrStr)); // 문자열 확인용도로 사용
    }
}
 
 
 
cs
실행 결과

 

 위 예제를 보면 for문을 이용해 배열의 모든 값들을 출력한 것이다.

배열은 for문을 이용해 사용되는 경우가 많으며, 인덱스는 0부터 배열길이의 -1값까지이기 때문에 for문을 통해 변수 i를 0부터 마지막 인덱스까지 반복시키면 배열의 각 값들을 사용할 수 있게 된다.

 

지금까지 배운 내용과 배열을 이용하여 로또번호를 생성하는 프로그램을 만들어 보자.

우선 코드를 보기전에 먼저 해야될 일을 순서대로 정리해보자.

 

 가. 로또번호를 담아둘 길이가 6개인 정수 타입의 배열변수 생성

 나. 1~45까지의 번호중 하나를 뽑는다

 다. 만약 뽑은 번호가 배열에 있다면 다시 뽑고, 없다면 배열에 넣는다.

 라. 6개의 번호를 다 뽑을 때까지 반복한다

 마. 6개의 번호를 출력한다.

 

다섯가지 순서중 나, 다는 반복되어야 하는 부분인데, 1부터 45까지의 숫자중에 랜덤으로 하나를 뽑는 방법을 알아야 하고 이 반복문의 횟수는 알 수 없다. 랜덤이기때문에 이미 뽑은 번호가 다시 뽑힐 수도 있기 때문이다. 반복횟수를 알 수 없을 때는 while문을 쓰면 되고, 배열변수의 인덱스 5번값까지 채워졌으면 반복문을 중지하면 된다.

아래 예제를 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package chapter6;
 
public class Lotto {
 
public static void main(String[] args) {
        
        int[] lotto = new int[6];
        
        int idx = 0;
        while (true) {
            int number = (int)(Math.random()*45)+1 ;
            
            boolean insert = true ;
            for (int i=0; i<=idx; i++) {     //
                if (lotto[i] == number) {
                    insert = false ;
                    break;
                    }    
                }
            if (insert) {
                lotto[idx] = number;
                idx++;
            }
            
            if (idx == 6break ;
        }
 
        for (int i = 0; i<lotto.length; i++) {
            System.out.println(lotto[i]);
        }
        
    }    
 
}
 
cs
실행 결과

소스를 살펴보자

7라인에서의 정수타입의 길이가 6인 배열 변수를 선언했다.

9라인에서는 idx라는 변수를 사용했는데 이 변수는 로또번호의 인덱스 값을 담을 변수로 초기값은 0으로 초기화했다.

10라인은 while문을 이용해 반복시킬 내용을 중괄호 블록안에 넣고 조건은 true라고 지정했다.

중복된 번호가 몇개나 나올지 모르므로 반복횟수를 알 수 없어 인단 무한반복 되도록 하고, while문 안에서 로또번호를 다 채우면 반복이 중지되도록 한다.

11라인은 1~45사이의 랜덤수를 구하는 코드인데 0부터 1미만의 랜덤 실수를 구해주는 기능이라고 보면 되고,

이 랜덤수에 45를 곱하면 0부터 45미만의 소수점이 있는 실수가 되는데 우선순위를 적용하고자 괄호를 이용해 45를 먼저 곱하고 (int)로 강제 형변환을 했다. 강제 형변환을 하면 소수점이 사라지게 되므로 이 랜덤 수는 0부터 44 사이의 랜덤수가 된다. 그래서 마지막에 1을 더한것이다.

13라인은 boolean 자료형 변수를 초기값 true로 선언했는데, 이 변수의 이름은 insert로 지었다. 밑에서 번호 중복여부를 확인해 중복된 번호면 false로 변경해 로또 변수에 추가되지 않도록 하기 위한 변수로서 사용된다.

14~19라인은 인덱스를 0부터 idx변수까지 하나씩 반복하면서 좀전에 구한 1~45사이의 랜덤수와 중복된 번호가 있는지 확인한다. 만약 같은 번호가 있다면 insert변수를 false로 바꾸고 이 반복문을 중지한다.

20라인은 insert변수가 true일때 로또 배열변수의 idx 인덱스번호에 랜덤수를 대입하고, idx변수에 1을 더한다.

위에서 중복된 번호라고 판별이 됐다면 이 구문은 실행되지 않는다.

25라인에서는 idx변수의 값이 6이되면 while문을 중지시킨다. 6이 되려면 중복없이 0~5까지의 인덱스값에 랜덤수가 채워졌다는 뜻이다.

마지막으로 28~30라인은 이 로또 배열변수를 for문으로 변수를 반복시키며 인덱스로 출력하는 구문이다.

 

이제 main메서드를 살펴보자. 지금까지 했던 예제에 main뒤에 괄호안에 String[] args라는 부분이 있다.

이 args라는 변수가 String 배열이라는 것을 알 수 있다.

이 변수에 배열로 값을 전달 할 수 있다

예제를 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
package chapter6;
 
public class ArrEx9 {
 
    public static void main(String[] args) {
        
        System.out.println("첫번째 값 : "+args[0]);
        System.out.println("두번째 값 : "+args[1]);
 
    }
 
}
 
cs

실행 결과

이 소스를 바로 실행하면 에러가 난다.

아래와 같이 따라해보자

상단 메뉴바 초록색 플레이버튼 옆에 화살표 버튼을 눌러서 Run Configurations 클릭

Arguments누르고 Program arguments 공백란에 홍길동 이순신 이라고 적고 우측 하단에 Run 클릭 (Program arguments 에서 띄어쓰기로 구분하고 공백이 필요할 경우 "를 삽입한다)

그럼 실행결과가 바뀐것을 알 수 있다.

 

3. 다차원 배열

지금까지 값이 한줄로 나열되어 있는 일차원 배열을 다뤄봤는데, 다차원 배열은 2차원 이상의 배열을 말한다.

쉽게 생각하면 행렬을 생각하면 되고, 자바에서는 배열 안에 배열이 존재한다고 생각하면 된다.

3*3 행렬의 구조를 생각해보자.

3행 3열의 행렬인데 각 좌표를 보면 (행번호, 열번호)로 이루어져 있다.

2.0은 행의 2번인덱스, 열의 0번 인덱스가 좌표가 된다.

아래 예쩨를 통해 3*3행렬의 2차원 배열을 선언하고, 1~9값을 순서대로 대입해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
        //첫번째
        int[][] matrix = new int[3][3];
        //int 2차원 배열
        
        matrix[0][0= 1;
        matrix[0][1= 2;
        matrix[0][2= 3;
        matrix[1][0= 4;
        matrix[1][1= 5;
        matrix[1][2= 6;
        matrix[2][0= 7;
        matrix[2][1= 8;
        matrix[2][2= 9;
        
cs

2차원 배열이므로 []가 두개가 되고, new int[3][3]은 3*3의 행렬 구조를 의미한다.

왼쪽 위부터 오른쪽으로 차례대로 값을 대입했는데, 2차원 행렬구조로 값을 확인해보자.

2차원 배열 변수의 [][]안의 숫자는 행렬의 좌표의 숫자와 같다.

matrix[0][0]의 값은 행렬 (0,0)의 값과 같은 1이다.

2차원 배열은 배열안의 배열과 같다고 했다.

이 배열을 다르게 선언 할 수 있다.

아래 예제를 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package chapter6;
 
public class ArrEx10 {
    public static void main(String[] args) {
        
        //첫번째
        int[][] matrix = new int[3][3];
        //int 2차원 배열
        
        matrix[0][0= 1;
        matrix[0][1= 2;
        matrix[0][2= 3;
        matrix[1][0= 4;
        matrix[1][1= 5;
        matrix[1][2= 6;
        matrix[2][0= 7;
        matrix[2][1= 8;
        matrix[2][2= 9;
        
        //두번째
        int[][] matrix2 = {{1,2,3}, {4,5,6,}, {7,8,9}};
        
        //세번째
        int[][] matrix3 = {
                {1,2,3},
                {4,5,6},
                {7,8,9}
        };
        
        System.out.println("[첫번째]");
        for (int i=0; i<matrix.length; i++) {
            for (int j=0; j<matrix[i].length; j++) {
                System.out.print(matrix[i][j]+ " ");
            }
            System.out.println();
        }
            System.out.println("[두번째]");
            for (int i=0; i<matrix2.length; i++) {
                for (int j=0; j<matrix2[i].length; j++) {
                    System.out.print(matrix2[i][j]+ " ");
                }
                System.out.println();
            }
                System.out.println("[세번째]");
                for (int i=0; i<matrix3.length; i++) {
                    for (int j=0; j<matrix3[i].length; j++) {
                        System.out.print(matrix3[i][j]+ " ");
                    }
                    System.out.println();
        }
        
 
    }
 
}
cs
실행 결과

 

3차원 이상의 다차원 배열은 거의 사용을 안한다고 보면 된다.

1차원 배열에서 배열 변수 선언, 초기화시 배열의 길이가 정해지고, 변할 수 없다고 했다.

하지만 2차원 배열 이상에서는 길이를 미리 초기화 하지 않아도 된다.

다차원의 첫번째 차원값만 미리 정하고 나머지는 나중에 배열객체를 생성하면서 지정할 수 있다.

 

다차원 배열을 끝으로 23-01-12 수업내용 정리를 마치겠다.

'JAVA' 카테고리의 다른 글

23-01-17 수업내용 정리  (0) 2023.01.18
23-01-16 수업내용 정리  (0) 2023.01.16
23-01-13 수업내용 정리  (0) 2023.01.15
23-01-11 수업내용 정리  (0) 2023.01.13
23-01-10 수업내용 정리  (0) 2023.01.13