JAVA 조건문과 반복문 그리고 배열…🙆‍♂️

김민제·2023년 10월 13일
0
post-thumbnail

조건문

  • 조건문은 조건식에 따라 다른 실행문을 실행하기 위해 사용된다.

if문

  • if문은 true or false 여부에 따라 블록 실행 여부가 결정된다.
  • if문의 기본 구조
    if(조건식 1){
        코드1
    }else if(조건식 2){
        코드2
    }else{
        코드3
    }
    • 흔히 사용되는 조건식의 기본 구조이다.

    • 조건식 1이 참이면 코드1, 조건식 2가 참이면 코드2, 조건식1과 2가 모두 거짓이면 조건식 3이 실행된다.

    • if 단독으로도 if-else, if-else if, if-else if-else 등으로 다양하게 사용이 가능하며 if문은 꼭 들어가야 한다.

    • 그렇다면 조건식1과 2가 모두 참이면 어떻게 될까?

      if (true) {
          System.out.println("조건식 1");
      } else if (true) {
          System.out.println("조건식 2");
      } else {
          System.out.println("조건식 3");
      }
      -> 조건식 1
    • 가장 먼저 참인 조건식 1이 출력된다.

    • 이를 통해 조건식이 위에서부터 순차적으로 실행된다는 것을 알 수 있다!

switch문

  • switch문은 if문과 마찬가지로 조건 제어문이다.
  • switch문은 if문처럼 조건식의 참,거짓 여부를 확인하는 것이 아니라 변수가 어떤 값을 갖느냐에 따라 실행문이 선택된다.
  • switch문의 기본 구조
int num = 1;
switch (num){
    case 1:
        System.out.println("num은 1입니다.");
        break;
    case 2:
        System.out.println("num은 2입니다");
        break;
    default:
        System.out.println("num은 3입니다");
        break;
}
-> num은 1입니다.
  • switch의 괄호는 변수 값을 입력받아 동일한 값을 갖는 case를 찾아 실행시키고 동일한 값을 갖는 case가 없으면 default를 실행시킨다. (default는 생략이 가능하다.)
  • break값은 다음 case를 실행하지 않고 switch문을 빠져나가기 위해 사용된다.
  • break가 없다면 어떻게 될까?
    int num = 1;
    switch (num){
        case 1:
            System.out.println("num은 1입니다.");
        case 2:
            System.out.println("num은 2입니다.");
        default:
            System.out.println("num은 3입니다.");
    ->num은 1입니다.
    	num은 2입니다.
    	num은 3입니다.
    • case가 모두 출력이 되고 default까지 출력이 되는 것을 볼 수 있다.
    • break가 없다면 switch문 전체가 실행되는 것일까 실행된 부분부터 끝까지 실행되는 것일까??
      int num = 2;
      switch (num){
          case 1:
              System.out.println("num은 1입니다.");
          case 2:
              System.out.println("num은 2입니다.");
          default:
              System.out.println("num은 3입니다.");
      ->num은 2입니다.
      	num은 3입니다.
      • num을 2로 바꾸자 case2부터 끝까지 실행된 것을 알 수 있다.
    • switch문의 변수로는 char값이나 string값도 올 수 있다.

반복문

  • 반복문은 어떤 코드가 반복적으로 실행되도록 하고 싶을 때 사용된다.

for문

  • for문의 기본 구조
    for (변수 초기화; 조건식; 변수 증감식){
        코드1
    }
    • for문의 기본 구조이며 조건식이 참일 때동안 중괄호 안의 코드가 반복된다.
    • 예제
      for (int i = 0; i<5; i++){
          System.out.println("i = " + i);
      }
      ->i = 0
      	i = 1
      	i = 2
      	i = 3
      	i = 4
      • 위 코드는 i가 0부터 시작하여 1,2,3,4까지 증가하여 5보다 작을 때까지 실행되고 i가 5가 되어 반복문이 중단된 것을 볼 수 있다.
    • 위 코드는 아래와 같이 사용해도 똑같은 결과를 나타낸다.
      int i = 0
      for (; i<5; ){
          System.out.println("i = " + i);
      		i++
      }
  • break, continue
    • 반복문은 break를 통해 반복문을 멈출 수도 있고 continue를 통해 다음 반복문으로 넘어갈 수도 있다.
      for (int i = 0; i<5; i++){
          if (i==1){
              continue;
          }
          if (i==4){
              break;
          }
          System.out.println("i = " + i);
      }
      ->i = 0
      	i = 2
      	i = 3
  • 중첩 for문
    • for문은 또 다른 for문을 내포할 수 있는데 이를 중첩 for문이라고 한다.
      for (int i = 2; i<4; i++){
          for (int j = 1; j<10; j++){
              System.out.println(i + " * " + j + " = " + i*j);
          }
      }
      ->2 * 1 = 2
      	2 * 2 = 4
      	2 * 3 = 6
      	...
      	3 * 8 = 24
      	3 * 9 = 27
    • 중첩 for문을 사용하면 위와 같이 구구단을 출력하는 프로그램을 만들 수도 있다.
    • 바깥 for문이 한 번 실행될 때마다 안쪽의 for문이 전부 실행되고 바깥 for문으로 다시 넘어가는 로직이다.
    • 중첩 for문의 안쪽 for문에서 break를 사용하면 안쪽의 for문만 break된다.
    • 안쪽 for문의 결과에 따라 전체 반복문을 중단해야할 상황이 있을텐데 그럴 때는 어떻게 할까??
    • 이럴 때를 대비하여 break 라벨이라는 것이 존재한다.
      loop1 :
      for (int i = 2; i<10; i++){
          loop2 :
          for (int j = 1; j<10; j++){
              System.out.println(i + " * " + j + " = " + i*j);
              if (j==9){
                  break loop1;
              }
          }
      }
      ->2 * 1 = 2
      	2 * 2 = 4
      	2 * 3 = 6
      	2 * 4 = 8
      	2 * 5 = 10
      	2 * 6 = 12
      	2 * 7 = 14
      	2 * 8 = 16
      	2 * 9 = 18
    • 바깥의 for문은 구구단을 9단까지 반복되도록 했지만 안쪽 for문에서 j==9라는 조건식으로 바깥 반복문을 break시켜줬기 때문에 구구단은 2단만 출력되고 반복을 멈춘 것을 확인할 수 있다.
    • continue도 라벨을 사용할 수 있을까?
      loop1 :
      for (int i = 2; i<10; i++){
          loop2 :
          for (int j = 1; j<10; j++){
              System.out.println(i + " * " + j + " = " + i*j);
              if (j==9){
                  continue loop1;
              }
          }
      }
      ->2 * 1 = 2
      	2 * 2 = 4
      	...
      	9 * 8 = 72
      	9 * 9 = 81
    • 바깥 for문의 첫 번째 반복은 실행되고 두 번째는 continue되고 세 번째는 실행되는 것을 기대했지만 구구단은 전부 출력된 것을 확인할 수 있었다.
    • continue에 label을 사용해도 바깥 반복문에는 영향이 없는 것 같다.
  • java의 반복문은 python처럼 for-else문의 기능은 없는 것 같다.

while문

  • for문이 정해진 횟수만큼 반복한다면 while문은 조건식이 true일 경우 계속하여 반복되고 조건식이 false가 되면 반복문이 종료된다.
  • while문의 기본 구조
    while(조건식){
        코드1
    }
    • 예제
      int i = 0;
      while(i<3){
          System.out.println("i = " + i);
          i++;
      }
      ->i = 0
      	i = 1
      	i = 2
      
      • 위처럼 i가 3이 되기 전까지는 코드를 반복하다가 i가 3이 되어 중단된 것을 알 수 있다.
      • 그렇다면 while문은 i의 값을 코드 한 줄 한 줄이 실행될 때마다 검사하여 i값이 3이 되자마자 반복을 멈추는 것일까??? → 그렇지않다
        int i = 0;
        while(i<3){
            i++;
            System.out.println("i = " + i);
        }
        ->i = 1
        	i = 2
        	i = 3
        • 위 코드를 보면 i가 증가하여 3이 되어도 print문을 실행하고 반복문이 종료된 것을 알 수 있다.
        • 이를 통해 while문은 반복문이 반복될 때마다 조건을 검사하는 것을 알 수 있다.
  • while문의 break와 continue
    • 만약 i가 3이 되자마자 반복을 중단하고 싶다면 for문에서 사용한것처럼 break문을 사용할 수 있다.

    • while문도 for문처럼 continue문을 사용할 수 있다.

      int i = 0;
      while(i<3){
          i++;
          if (i==1){
              continue;
          }
          if (i==3){
              break;
          }
          System.out.println("i = " + i);
      }
      ->i = 2
    • 위 코드에서 확인할 수 있듯이 i가 더해진 후 1이 되고 조건문에 걸려 continue가 되고 i는 2가 되었을 때는 출력, i는 3이 되었을 때는 조건문에 걸려 반복문이 break된 것을 알 수 있다.

    • 이렇게 i가 3이 되자마자 반복을 중단하고 싶거나 조건식이 거짓이 되자마자 중단하고 싶다면 while문 안의 조건식 변수가 변경되고 바로 후에 if문으로 break를 걸어주면 조건식이 거짓이 되자마자 중단될 것이다.

do-while문

  • do-while문은 while문과 비슷하지만 do실행문을 최초에 무조건 실행하고 while문을 실행한다는 것이 while문과 다른 점이다.
  • do-while문의 기본 구조
    do {
        실행문
    } while (조건식);
    • do-while문은 위의 구조로 구성되고 do가 처음에 무조건 실행되고 조건식을 판별하여 실행문을 반복한다.
    • 예제
      do {
          System.out.println("do문 실행");
      } while (false);
      ->do문 실행
      • 위처럼 조건식이 거짓이어도 do의 실행문은 무조건 한 번 실행되는 것을 확인할 수 있다.

배열

  • 자바에서의 배열은 같은 타입의 데이터를 연속된 공간에 나열하고 각 데이터에 인덱스를 부여해놓은 자료구조이다.
    • 인덱스는 0부터 시작한다.
  • 배열은 기본형 배열과 참조형 배열로 나뉜다.

기본형 배열

  • 기본형 배열의 기본 구조
    타입[] 변수명 = new 기본형타입[배열의 크기];
    타입[] 변수명 = {1,2, ...};
    //인덱스로 값에 접근
    변수명[index] =;
  • 배열 변수에 null값을 넣고 참조하려하면 NullPointException이 발생한다.
  • 배열의 길이를 초과한 값을 index로 접근하려하면 ArrayIndexOutOfBoundsException 오류가 발생한다.
    int[] arr = {1,2,3};
    System.out.println(arr[3]);
    ->Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
  • 배열의 길이는 length필드로 알 수 있다.
    int[] arr = {1,2,3};
    System.out.println(arr.length);
    ->3

다차원 배열

  • 행과 열로 구성된 배열을 2차원 배열이라고 한다
  • 수학의 행렬을 떠올리면 되는데 가로 인덱스와 세로 인덱스를 사용한다.
  • 예를 들어 2행 3열의 행렬을 만들기 위해 다음의 코드를 사용한다.
    int[][] arr = new int[2][3];
    int[][] arr2 = {{0,0,0}, {0,0,0}};
    (0,0)(0,1)(0,2)
    (1,0)(1,1)(1,2)
    • 위 형태의 배열이 생성된다.
    • 위 코드는 메모리에 3개의 배열 객체를 생성한다.
      • int 타입 배열 A : [B,C]
      • int 타입 배열 B : [0,0,0]
      • int 타입 배열 C : [0,0,0]

참조형 배열

  • 배열의 타입이 기본형이 아닌 경우
  • 기본형 배열을 각 인덱스에 값을 직접 갖고 있지만 참조형 배열은 각 인덱스에 객체의 번지를 갖고 있다.
  • 즉, 배열이 참조하는 배열의 공간이 값을 저장하는 것이 아니라 값을 참조한다는 것을 의미한다.
    String[] str_arr = {"kim", "min", "je"};
    • 위에서는 총 4개의 객체를 생성한다.
      • String 타입 배열 객체 A : [B ,C ,D]
      • String 타입 객체 B : [”kim”]
      • String 타입 객체 C : [”min”]
      • String 타입 객체 D : [”je”]

for each문

  • for 문은 배열이나 컬렉션을 좀 더 쉽게 처리하기 위해 향상된 for문을 제공한다.
  • for each 문은 루프 카운터 변수와 증감식을 사용하지 않는다.
  • for each문의 기본 구조
    for(int i : array){}
    • i에는 배열의 값이 순차적으로 들어간다
    • 참조형 배열에도 사용가능하다

배열 복사

  • 배열은 한 번 생성하면 크기를 변경할 수 없기 때문에 더 많은 공간이 필요하다면 더 큰 배열을 만들고 이전 배열로 부터 항목 값들을 복사해야한다.

복사 방법

  • for문
    int[] arr1 = {1,2,3};
    int[] arr2 = new int[5];
    for(int i = 0; i < arr1.length; i++){
        arr2[i] = arr1[i];
    }
    for(int i : arr2){
        System.out.print(i + " ");
    }
    ->1 2 3 0 0
  • Arrays
    • 자바가 제공해주는 배열을 사용할때 쓰는 유틸리티
      int[] arr1 = {1,2,3};
      int[] arr2 = java.util.Arrays.copyOf(arr1,5);
      for(int i : arr2){
          System.out.print(i + " ");
      }
      ->1 2 3 0 0
    • int[] arr1=arr2를 하면 같은 배열을 참조하라는 뜻으로 얕은 복사(shallow copy)이지만arrays.copyTo를 사용하면 깊은 복사(deep copy)으로 값들을 복사해서 넣어주는 것이다.
profile
블로그 이전했습니다!! 👉 https://alswp006.github.io/

0개의 댓글