본문 바로가기

Language/JAVA

[명품 JAVA programming] CHAPTER 3 반복문과 배열 그리고 예외 처리

3.1 반복문

for 문

while 문

do-while 문

 

반복 횟수를 처음부터 알 수 있는 경우 : for 문

반복 횟수를 알 수 없고 조건에 따라 반복이 계속되거나 중단되는 경우 : while 문, do-while 문

 

반복 조건을 처음부터 따지는 경우 : while 문

반복 조건을 나중에 따지는 경우: do-while 

 

 * while 문 주의사항

조건식에 사용되는 변수를 while문 실행 전에 초기화해야 한다

int i = 0;
       while(i<=10){
        System.out.println(i);
        i++;
       }

 

예제 3-2

-1이 입력될 때까지 입력된 수의 평균 구하기

import java.util.*;

public class ex {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        int sum = 0;
        int cnt = 0;

        System.out.print("정수를 입력하세요(종료하려면 -1 입력)>>");
            int i = scan.nextInt();

        while(i != -1){
            sum += i;
            cnt++;
            i = scan.nextInt();
        }

        if(cnt>0){System.out.print("입력된 정수의 갯수 : " + cnt + ", avg = " + (double)sum/cnt);}
        else{ System.out.println("입력된 값이 없습니다.");}
       
        scan.close();
    }
}

 

3.2 continue 문과 break 문

실행 경로 변경

 

  • continue 문 : 반복문을 빠져나가지 않으면서 즉시 다음 반복(조건)으로 넘어가고자 할 때 사용

예제 3-5

continue 문을 이용하여 양수 합 구하기

5개의 정수를 입력받고 그 중 양수들만 합하여 출력

import java.util.*;

public class ex {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        int sum=0;
        int cnt=0;

        System.out.print("정수 5개를 입력하세요>>");

        for(int i=0 ; i<5 ; i++){ // 5번 반복
            int n = scan.nextInt();
            if(n>0){
                sum += n;
                cnt++;
            }
            else{
                continue;
            }
        }
        System.out.print("정수의 갯수 : " + cnt + "개, 합 = " + sum);
       
        scan.close();
    }
}

[결과]

정수 5개를 입력하세요>>5
-2
6
10
-3
정수의 갯수 : 3개, 합 = 21

 

 

  • break 문 : 하나의 반복문을 즉시 벗어날 때 사용

break 문은 하나의 반복문만 벗어나기 때문에, 중첩 반복의 경우 안쪽 반복문에서 break문이 실행되면, 안쪽 반복문만 벗어나기 때문에 바깥 쪽 반복문 내에서 실행 유지

 

 

3.3 배열

  • 배열은 선언과 생성 필요

1) 배열 선언 : 배열에 대한 레퍼런스 변수 선언

int intArray [ ] ;

char charArray [ ];

또는

int [ ] intArray;

char [ ] charArray;

 

- intArray, charArray는 배열에 대한 레퍼런스 변수로, 실제 배열값이 저장된 주소 값(레퍼런스 값)만을 가짐

 

2) 배열 생성

intArray = new int [10];

charArray = new char [20];

또는

(선언과 생성을 동시에)

int intArray [ ] = new int[10]; // 10개의 정수 공간 배열 생성, 배열 이름은 intArray

char charArray [ ] = new char[20];

 

- 데이터를 저장할 배열 공간 할당

- 반드시 new 연산자 사용

 

- 배열 선언 시 초기화를 하면, 초기화 된 값의 개수만큼 배열이 생성됨

int intArray [ ] = {1,2,3,4,5};

>> 배열의 크기는 자동으로 5가 됨

 

 

  • 배열 인덱스와 배열 원소 접근

- 배열의 인덱스(index)는 정수만 가능

- 배열의 원소는 인덱스를 이용하여 접근

 * 배열 사용시 주의할 점 : 바운더리 에러가 나지 않도록 해야함

- 배열의 원소에 접근하려면 반드시 배열이 생성되어 있어야 함 (공간을 할당 받아야 함) >> 실행시간 오류

 

 

  • 레퍼런스 치환과 배열 공유

(자바에서는) 레퍼런스 변수와 배열 공간이 분리

따라서 다수의 레퍼런스 변수가 하나의 배열 공간을 가르키는 배열 공유가 쉽게 이루어짐

int intArray [ ] = new int [5];
int myArray [ ] = intArray;

>> 레퍼런스 치환, intArray와 myArray는 동일한 배열을 참조

 

  • 배열의 크기, length 필드

자바는 배열을 객체로 다룸

배열이 생성되면 - 객체가 생성

이 객체에는 배열의 저장 공간과 함께 배열의 크기 값을 가진 length 필드가 존재

 

* 배열의 크기는 직접 쓰지 말고 자동 계산하도록 하는게 좋다.

배열의 크기만큼 반복할 때 유용

 

예제 3-8

배열의 length 필드를 이용하여 배열의 크기만큼 정수를 입력받고 평균을 구하는 프로그램을 작성하라

import java.util.*;

public class ex {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        int arr [] = new int [5];
        int sum = 0;

        System.out.println("정수 5개를 입력하세요");
        for(int i=0;i<arr.length;i++){
            int n = scan.nextInt();
            sum += n;
        }
        System.out.print("평균 : " + (double)sum/arr.length);

        scan.close();
    }
}

 

  • 배열과 for-each 문

기존의 for문을 변형하여, 배열이나 나열의 크기만큼 루프를 돌면서 각 원소를 순차적으로 접

 

* 나열 타입(enum)

enum 타입 Week 선언

Week 타입은 월,화,수,목,금,토,일의 7개의 값 중 하나만 가지도록 선언

→ Week 타입 객체 day는 7개 값 외 다른 값을 가질 수 x

enum Week {,,,,,,}
       
        for(Week day : Week.values()){System.out.print(day + "요일 ");}

 

3.4 다차원 배열

  • 2차원 배열

레퍼러스 변수 선언

int intArray [ ] [ ];

char [ ] [ ] charArray; 

 

배열 생성

intArray = new int [2] [5];

 

변수 선언 & 배열 생성

int intArray [ ] [ ] = new int [2] [5];

 

2차원 배열 초기화

int intArray [ ] [ ] = { {0,1,2}, {3,4,5}, {6,7,8} }; // 3x3 배열

- 자동으로 원소 개수만한 배열 공간이 할당되고, 원소 값으로 초기화 됨

 

  • 비정방형 배열

행마다 열의 개수가 서로 다른 배열

 

예제 3-11

그림과 같은 비정방형 배열을 만들어 값을 초기화하고 출력하라

10 11 12

20 21

30 31 32

40 41

 

1) 배열 생성시에 초기화 하는 경우

public class ex {
    public static void main(String[] args) {
       
        int arr [][] = {{10,11,12}, {20,21}, {30,31,32}, {40, 41}};

        for(int i=0;i<arr.length;i++){
            for(int j=0; j<arr[i].length;j++){
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }
    }
}

2)

import java.util.*;

public class ex {
    public static void main(String[] args) {

        int arr [][] = new int [4][];
        arr[0] = new int [3];
        arr[1] = new int [2];
        arr[2] = new int [3];
        arr[3] = new int [2];

        for(int row=0 ; row<arr.length ; row++){
            for(int column=0 ; column<arr[row].length ; column++){
                arr[row][column] = (row+1)*10+column;
            }
        }

        for(int i=0;i<arr.length;i++){
            for(int j=0; j<arr[i].length;j++){
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }
    }
}

 

3.5 메소드에서 배열 리턴

배열에 대한 레퍼런스만 리턴

따라서 리턴 타입을 선언할 때 [ ] 안에 배열의 크기를 지정x

리턴하는 배열의 타입이 리턴받는 레퍼런스 변수의 타입과 일치해야 함

 

예제 3-12

public class ex {
   
   static int[] makeArr(){ // 정수형 배열을 리턴하는 메소드
      int tmp[] = new int [4]; // 배열 생성
      for(int i=0;i<tmp.length;i++){
         tmp[i]=i; // 배열의 원소 0,1,2,3 으로 초기화
      }
      return tmp; // 배열 리턴
   }

    public static void main(String[] args) {
        int intArr []; // 배열 레퍼런스 변수 선언
        intArr = makeArr(); // 메소드로부터 배열 전달 받음
        for(int i=0;i<intArr.length;i++){
         System.out.print(intArr[i]+" ");
        }
    }
}

[결과]

0 1 2 3

 

3.6 main( ) 메소드

자바 응용 프로그램의 실행이 시작되는 특별한 메소드

→ 자바 응용프로그램의 실행은 main( ) 메소드부터 시작

 

원형

public static void main(String [] args) {

}

 

- public : public 속성, 다른 클래스에서 메소드 접근 허용

  자바 응용프로그램이 실행을 시작할 때 자바 가상 기계(JVM)에 의해 호출되어야 하므로 public 속성으로 선언되어야 함

- static : static 속성, 자신을 포함하는 클래스의 객체가 생성되기 전에 처음부터 자바 가상 기계에 호출되므로 static 속성

  으로 선언되어야 함

  static 속성으로 선언되어야 객체 생성 전부터 호출 가능

- void : 리턴 타입은 void, 아무런 값을 리턴하지 않음 main( )메소드를 끝내기 위해 리턴하려면 단순히 return; 문 사용

- (String [] args) : 문자열 배열(String [ ])이 매개변수로 전달, 자바는 명령행에 입력된 인자들을 문자열 배열로 만들어

   main( ) 메소드에 전달