[Java] 명품 Java Programming 정리 - 3장

근이의 개발일기·2024년 8월 19일
post-thumbnail

3장

반복문

for문

  • for문의 구성과 실행 순서 for( 1. 초기문 ; 2. 조건식 ; 4. 반복 후 작업){
    1. 작업문

      }

    • 초기문과 반복 후 작업은 ,로 여러 문장을 나열할 수 있다. 문장이기 때문에 여러 형태가 가능하다
    • 조건식이 작업문 이전에 검사되므로 처음부터 false이면 바로 반복문을 벗어남
  • 주의! 조건식에 true가 있거나 비어있으면 무한반복한다
  • for문 사용 예시: 1부터 10까지 합 출력
    public class Main {
        public static void main(String[] args) {
            int sum=0;
            for(int i=1;i<=10;i++)
            {
                sum +=i;
                System.out.print(i);
    
                if(i<=9)
                    System.out.print("+");
                else {
                    System.out.print('=');
                    System.out.print(sum);
                }
            }
        }
    }
    출력 결과: 1+2+3+4+5+6+7+8+9+10=55

while문

  • while문 구성 while( 1. 조건식){
    1. 작업문

      }

    • 반복 횟수를 알 수 없을 때 조건을 달아서 사용하는 경우가 많다
    • while문 실행 이전에 조건식에 사용되는 변수를 초기화 해야한다
    • 반복이 진행되면서 조건식이 false가 되어 빠져나올 수 있게 설계해야한다
    • for문과 다르게 while문은 조건식이 없을 시 컴파일 오류가 발생한다
  • while문 사용 예시: -1이 입력될 때까지 입력된 수의 평균구하기
    import java.util.Scanner;
    public class Main {
        public static void main(String[] args) {
            int count=0;
            int sum=0;
            Scanner scanner = new Scanner(System.in);
            System.out.println("정수를 입력하고 마지막에 -1을 입력하세요");
    
            int n = scanner.nextInt();
            while(n!=-1){
                sum += n;
                count++;
                n = scanner.nextInt();
            }
            if(count==0) System.out.println("입력된 수가 없습니다.");
            else{
                System.out.print("정수의 개수는 "+count+"개이며 ");
                System.out.println("평균은 "+ (double)sum/count+"입니다.");
            }
            scanner.close();
        }
    }
    • 출력 결과: 정수를 입력하고 마지막에 -1을 입력하세요
      10 20 -19 40 -1
      정수의 개수는 4개이며 평균은 12.75입니다.

do while문

  • do-while문 구성 do{
    1. 작업문

      } while( 2. 조건식 );

    • 작업문 실행 후 조건식을 검사하므로 작업문이 최초 한번은 반드시 실행
    • do-while문 실행 이전에 조건식에 사용되는 변수를 초기화 해야한다
    • do-while문의 조건식은 while문과 동일하며 조건식이 없으면 컴파일 오류가 발생한다.
  • do-while문 사용 예시: a-z까지 출력
    public class Main {
        public static void main(String[] args) {
            char c = 'a';
    
            do {
                System.out.print(c);
                c = (char) (c + 1);
            }while(c<='z');
        }
    }
    • 출력 결과: abcdefghijklmnopqrstuvwxyz

중첩 반복

  • 중첩 반복 예시: 2중 중첩을 이용한 구구단
    public class Main {
        public static void main(String[] args) {
            for(int i=1;i<10;i++)
            {
                for(int j=1;j<10;j++){
                    System.out.print(i+"*"+j+"="+i*j);
                    System.out.print('\t');;
                }
                System.out.println();
            }
        }
    }
    • 출력 결과: 11=1 12=2 13=3 14=4 15=5 16=6 17=7 18=8 19=9
      2
      1=2 22=4 23=6 24=8 25=10 26=12 27=14 28=16 29=18
      31=3 32=6 33=9 34=12 35=15 36=18 37=21 38=24 39=27
      4
      1=4 42=8 43=12 44=16 45=20 46=24 47=28 48=32 49=36
      51=5 52=10 53=15 54=20 55=25 56=30 57=35 58=40 59=45
      6
      1=6 62=12 63=18 64=24 65=30 66=36 67=42 68=48 69=54
      71=7 72=14 73=21 74=28 75=35 76=42 77=49 78=56 79=63
      8
      1=8 82=16 83=24 84=32 85=40 86=48 87=56 88=64 89=72
      91=9 92=18 93=27 94=36 95=45 96=54 97=63 98=72 9*9=81

continue문과 break문

  • continue문
    • 반복문을 빠져 나가지 않으면서 다음 반복으로 진행
    • 주의! for문에서는 반복 후 작업을 분기하고 while문에서는 조건식으로 분기한다.
  • countinue문 사용 예시: 양수 합 구하기
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            System.out.println("정수를 5개 입력하세요.");
            int sum=0;
            for(int i=0;i<5;i++) {
                int n = scanner.nextInt();
                if (n <= 0)
                    continue;
                else
                    sum += n;
            }
            System.out.println("양수의 합은 "+sum);
    
            scanner.close();
            }
    }
    • 출력 결과: 정수를 5개 입력하세요.
      5
      -2
      6
      10
      -4
      양수의 합은 21
  • break문
    • 반복문 하나를 완전히 빠져 나갈 때 사용
    • 주의! 하나의 반복문만 벗어남
    • 중첩 반복의 경우 안쪽 반복문의 break문이 실행되면 안쪽 반복문만 벗어남
  • break문 사용 예시: while문 벗어나기
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            System.out.println("exit를 입력하면 종료합니다");
            while(true) {
                System.out.print(">>");
                String text = scanner.nextLine();
                if(text.equals("exit"))
                    break;
            }
            System.out.println("종료합니다...");
    
            scanner.close();
            }
    }
    • 출력 결과: exit를 입력하면 종료합니다

      hi my name is hogeun
      exit
      종료합니다...

중요 배열

  • 배열(array)
    • 인덱스와 인덱스에 대응하는 데이터들로 이루어진 자료구조
      • 배열을 이용하면 한 번에 많은 메모리 공간 할당 가능
    • 같은 타입의 데이터들이 순차적 저장
      • 인덱스를 이용하여 원소 데이터 접근
      • 반복문을 이용하여 처리하기에 적합
      • 메모리의 모양이 중요함
    • 배열 인덱스
      • 0부터 시작
      • 인덱스는 배열의 시작 위치에서부터 데이터가 있는 상대 위치
  • 배열의 필요성과 모양
    • 논리적으로 영역을 분리해줌

      Untitled

    • 지역변수는 stack에 메모리를 할당하여 초기화하지 않고 사용이 불가능

    • 주의! 배열 및 클래스는 heap에 메모리를 할당하여 초기화 하지 않고 사용이 가능하다. → 초기화시 변수의 공간에 0만을 넣어준다. 이미 초기화된 것

  • 배열 만들기
    • 배열 선언과 배열 생성의 두 단계 필요

      Untitled

    • 배열 선언 방법 2가지

      • int intArray[]; char charArray[];
      • int [] intArray; char[] charArray;
    • 배열 생성 ← 초기화 X (선언 후 생성 / 선언과 생성 동시에)

      • intArray = new int[10]; charArray = new char[20];
      • int intArray[] = new int[10]; char charArray[] = new char[20]; //선언과 생성 동시에..
    • 선언과 함께 초기화

      • int intArray[] = {0,1,2,3,4,5,6,7,8,9}; //[]는 비워두어야함

      • int intArray[10]; //잘못된 배열 선언

        Untitled

    • 주의사항

      • int []a; //int []는 reference type이고, a는 reference variable
      • a = new int[3]; int []a={1,2,3}; // 두 개의 식은 같은 구조를 가짐
  • 배열 인덱스와 원소 접근
    • 배열 원소 접근
      • 배열 변수명과 []사이에 원소의 인덱스를 적어 접근
        • 배열의 인덱스는 0부터 시작
        • 배열의 마지막 항목의 인덱스는 (배열크기-1)
      • 주의! 인덱스의 범위
        • 인덱스로 음수 사용 시 컴파일 오류
        • 인덱스의 범위(0~배열 크기-1)을 넘어가면 컴파일 오류
      • 주의! 반드시 배열 생성 후 접근
        • 선언만 하고 접근 시 컴파일 오류
  • 중요 레퍼런스 치환과 배열 공유
    • 하나의 배열을 다수의 레퍼런스가 참조 가능

    • 배열이 인자로 사용되거나 return값으로 사용되든지 전부 reference 값으로 전달 → 포인터를 사용하지 않는다는 의미

      ```java
      /* reference 값의 전달 예시 */
      int []f(int[]b){
      	b[0] = 1;
      	return b;
      }
      
      int []a;
      a = new int[3];
      int[] c = f(a); // **c는 a를 참조하게 된다!!**
      	
      ```

      Untitled

  • 배열 사용 예시: 배열에 입력받은 수 중 제일 큰 수 찾기
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            int intArray[]=new int[5];
            int max=0;
            System.out.println("양수 5개를 입력하세요.");
            for(int i = 0; i<5; i++) {
                intArray[i]=scanner.nextInt();
                if(intArray[i]>max)
                    max = intArray[i];
            }
            System.out.print("가장 큰 수는 "+max+"입니다.");
        }
    }
    • 출력 결과: 양수 5개를 입력하세요.
      3
      45
      23
      73
      19
      가장 큰 수는 73입니다.
  • 배열의 크기, length 필드(data)
    • 배열은 자바에서 객체로 관리

    • 배열 객체 내에서 length필드는 아예 생성 시에 함께 생성됨

    • length 필드는 배열의 크기를 나타냄

      Untitled

  • length 필드 사용 예시: 배열 원소의 평균 구하기
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int sum=0;
            int intArray[]=new int[5];
            System.out.print(intArray.length + "개의 정수를 입력하세요>>");
            for(int i = 0;i<intArray.length;i++)
                intArray[i]=scanner.nextInt();
            for(int i=0;i<intArray.length;i++)
                sum+=intArray[i];
    
            System.out.print("평균은 " + (double)sum/intArray.length);
            scanner.close();
        }
    }
    • 출력 결과: 5개의 정수를 입력하세요>>2 3 4 5 9
      평균은 4.6
  • 배열과 for-each문 (inhanced for)
    • 배열이나 나열(enumeration)의 각 원소를 순차적으로 접근하는데 유용한 for문 → 꼭 배열이 아니더라도 동일한 타입을 가지는 container이면 가능함

    • 값의 출력과 사용은 가능하지만, 값의 변경은 되지 않는다

    • 값의 갱신은 원래의 for문을 사용

    • for([*type명*] [*변수명*] : [*type배열이름*]) 식으로 사용

      /* 예시1 */
      int[] num = {1,2,3,4,5};
      int sum=0;
      **for(int k: num) //반복될 때 마다 k의 값이 num[0],..,num[4]값으로 설정**
      	sum += **k**;
      System.out.println("합은" + sum);
    • 출력 결과:

      합은 15
      Stirng names[] = {"사과", "배", "바나나", "체리", "딸기", "포도"};
      for(String s : names)
      	System.out.print(s + " ");
    • 출력 결과:

      사과 배 바나나 체리 딸기 포도
      enum Week {,,,,,,};
      for(Week day : Week.values())
      	System.out.print(day + "요일 "); 
      //values함수를 통해 Week enum의 모든 상수를 저장한 배열을 생성하여 반환함
    • 출력 결과:

      월요일 화요일 수요일 목요일 금요일 토요일 일요일

      • 주의! values() 함수를 이용해서 enum의 모든 상수 값을 배열의 형태로 인스턴스를 반환한다

중요 2차원 배열 및 배열 리턴

  • 2차원 배열
    • 2차원 배열 선언
      • int intArray[][]; int [][]intArray;
    • 2차원 배열 생성
      • intArray = new int[2][5]; int intArray[][] = new int[2][5];
      • 생성 시, 배열 내부의 bit는 전부 0(null)으로 되어있음
    • 2차원 배열 선언, 생성, 초기화 동시에
      • int intArray[][] = {{0,1,2}, {3,4,5}, {6,7,8}};
  • 2차원 배열의 모양과 length 필드
    • i[0], i[1] 각각은 1차원 배열을 가짐 → 1차원 배열 객체의 트리구조를 가짐!

      Untitled

    • i.length → 2차원 배열의 행의 개수로서 2

    • i[n].length → n번째 행의 열의 개수

      • i[0].length → 0번째 행의 열의 개수로서 5
      • i[1].length → 1번째 행의 열의 개수로서 5
  • 2차원 배열의 for문 처리
    for(int n;n<i.length; n++){
    	for(int m;m<i[n].length;m++){
    		System.out.println(i[n][m]);
    	}
    }
    • 위와 같은 형태로 출력 시, 비정방형 배열에서도 그대로 사용 가능하다!
  • 2차원 배열 사용 예시: 4년 평점 구하기
    public class Main {
        public static void main(String[] args) {
                double score[][]={{3.3, 3.4},{3.5,3.6},{3.7,4.0},{4.1,4.2}};
                double sum=0;
                for(int year=0; year<score.length; year++)
                    for(int term=0; term<score[year].length; term++)
                        sum+=score[year][term];
    
                int n=score.length;
                int m=score[0].length;
                System.out.println("4년 전체 평점 평균은 "+sum/(n*m));
        }
    }
    • 출력 예시: 4년 전체 평점 평균은 3.7254
  • 주의! 동적으로 하위 배열들을 만들어 줄 수 있다. → 비정방형 배열 생성 가능 (동적: 실행 중에 / 정적: 컴파일 중에)
    • int a[][]; //a는 int[][] reference변수 1개
    • a=new int[2][]; //a가 가르키는 것은 오직 a[0], a[1]이고 뒤에 것은 필요x
    • a[0]=new int[3]; a[1]=new int[4];
  • 비정방형 배열
    • 정방형 배열
      • 각 행의 열의 개수가 같은 배열
    • 비정방형 배열
      • 각 행의 열의 개수가 다른 배열

      • 비정방형 배열의 생성

        Untitled

      • i.length: 2차원 배열의 행의 개수로서 4

      • i[n].length는 n번째 행의 열의 개수

  • 비정방형 배열의 생성과 접근 예시
    public class Main {
        public static void main(String[] args) {
            int intArray[][] = new int[4][];
            intArray[0] = new int[3];
            intArray[1] = new int[2];
            intArray[2] = new int[3];
            intArray[3] = new int[2];
    
            for(int i = 0; i < intArray.length; i++)
                for(int j = 0; j < intArray[i].length; j++)
                    intArray[i][j] = (i+1)*10 + j;
            for(int i = 0; i < intArray.length; i++) {
                for (int j = 0; j < intArray[i].length; j++)
                    System.out.print(intArray[i][j] + " ");
                System.out.println();
            }
        }
    }
    -출력 예시: 10 11 12
    20 21
    30 31 32
    40 41
  • 메소드에서 배열 리턴
    • 배열의 레퍼런스 리턴

    • 메소드의 리턴 타입과 리턴 받는 배열 타입의 일치

    • 리턴 타입에 배열의 크기를 지정하지 않음

      Untitled

    • 베열 레퍼런스 타입이면 배열 받을 수 있음

    • int arrayInt[][];

      arrayInt=new int[2]; (X) arrayInt = new int[2][]; (O)
      
      ㄴ같은 차원이어야한다.

      Untitled

main() 메소드

  • main()은 자바 응용프로그램의 실행 시작 메소드
    • main()의 원형은 반드시 public static void main(문자열 배열)
  • main(String[] args) 메소드의 인자 전달
    • main() 메소드의 매개변수로 명령행 인자의 전달

    • 개발 tool에서는 Run Configurations에서 program arguments에 넣어주면 된다

    • 주의! 명령행에서 인자를 전달했는데 클래스에 main()메소드가 없을 경우 실행 시작 후 바로 오류를 내면서 종료한다

      Untitled

  • main()에서 명령행 인자의 합 계산
    public class Main{
        public static void main(String[] args) {
            double sum=0.0;
    
            for(int i=0; i<args.length; i++)
                sum+=Double.parseDouble(args[i]);
            
            System.out.println("합계: " + sum);
        }
    }
    • 출력 결과: 합계: 110.6

중요 자바의 예외 처리

<type 개념을 쓰는 언어>

compile시 문장에 따라 Compile time error 발생

semetics에 관계 없이 Run time error 발생

  • 컴파일 오류: 문법에 맞지 않게 작성된 코드, 컴파일 시 발견
  • 예외: 오동작이나 결과에 악영향을 미칠 수 있는 오류, 실행 중 발생
  • 자바에서 예외 처리 가능
    • 예외 발생 → 자바 플랫폼 인지 → 응용프로그램에서 전달
      • 응용프로그램이 예외를 처리하지 않으면, 응용프로그램 강제 종료 (비정상적 종료)
      • Run time error중 일부가 예외 상태를 나타냄; handling 가능한 Run time error (치명적이지 않은 오류)
        • Run time error는 반복문이 무한루프를 실행하거나 recursion을 잘못 제어 하는등의 JVM의 메모리가 부족할 때까지 실행되는 등 어디서 발생하는지 예측 불가능하고 멈출 수 없는 경우이다
  • 예외 처리가 필요한 이유
    • 예외 예방: 예외 발생 시 프로그램이 다운됨
    • 예외 처리: 후에 처리 → 프로그램이 다운되지 않고 이어가게 함
  • 예외 처리 방식 Untitled
    • JVM이 문제의 위치에 exception을 넘기고 프로그램이 비정상적 종료한다. 그리고 다시 exception을 넘긴다 → 프로그램이 compile은 됐지만 run하지 못하고 비정상적 종료 후 프롬프트에 예외상황을 전달한다.
    • 예외 처리해주지 않으면 프롬프트에 전달한다
  • 예외 처리, try-catch-finally문
    • 예외가 발생할 때 대응하는 프로그램 코드

    • try-cahch-finally문 사용; finally 블록 생략 가능

      Untitled

    • try블록에서 예외가 발생하지 않은 정상적인 경우: try블록 내 실행 후, finally 블록 내 실행한다.

    • try블록에서 예외가 발생한 경우: try블록 내에서 전달받은 예외 객체를 catch의 매개변수로 보내준다. 그리고 catch블록 내의 예외 처리문을 실행하고 finally 블록 내 실행한다

      *예외를 클래스로 묶어서 던져준다!!

    • 주의! catch 블럭은 여러개 가능하여 여러가지 상황의 예외를 받을 수 있다. n중으로 try문을 만들어서 여러 예외를 받는 방법도 있다.

    • 주의! finally 블럭은 catch에서 continue, break, return등의 문장을 써주더라도 항상 실행된다. 일부러 try나 catch에서 제어 옮겨도 항상 finally는 그 제어 옮기는 문장 전 우선적으로 실행됨!

  • 예외 타입(클래스): error가 미리 클래스의 형태로 정의되어 있음 → catch문 내에 예외 객체 생성, 통합해서 Exception클래스로도 사용가능
    • ArithmeticException (산술 예외): 정수를 0으로 나눈 경우
      • 일반적인 나눗셈 연산 시 입력 받을 때 사용해줌
        • 예시

          Untitled

    • ArrayIndexOutOfBoundsException (배열 인덱스 예외): 배열보다 큰 인덱스로 배열의 원소를 접근하는 경우
      • 배열의 사용에서 임의의 인덱스 값 입력 받을 시 사용
        • 예시

          Untitled

    • 중요 InputMismatchException (입력 불일치 예외): 정수 입력을 기다리는 코드가 실행되고 있을 때, 문자가 입력된 경우 → import java.util.InputMismatchException; 필요
    • 클래스 하나 당 import하는 것임, import java.util.Scanner는 Scanner클래스를 위한 것이라서 다른 것임
      • Scanner에서 nextInt()를 사용할 때 사용
        • 예시 Untitled 주의! catch문에서 scanner.next();를 하여서 버퍼에 이미 입력된 키를 비워주어야 한다. 버퍼 비우지 않으면 무한 Exception throw발생! Scanner가 대기 상태가 될 수 없다.
    • NumberFormatException (숫자 포맷 예외): 문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환 시 발생
      • main의 args등의 String 배열 parse시에 사용해줌
        • 예시

          Untitled

    • NullPointerException (널 포인터 예외): null 레퍼런스를 참조할 때 발생
    • ClassCastException (클래스 형변환 예외): 변환할 수 없는 타입으로 객체를 변환할 때 발생
    • OutOfMemoryError (메모리 부족 오류): 메모리가 부족한 경우 발생
    • IllegalArgumentException (부적절한 인자 예외): 잘못된 인자 전달 시 발생
    • FileNotFoundException (파일 찾을 수 없음 예외): 존재하지 않는 파일을 읽으려고 하는 경우
    • 주의! IOException (입출력 예외): 입출력 동작 실패 또는 인터럽트 시 발생 → import java.io.IOException; 필요

원본 노션 링크

https://believed-poinsettia-f0f.notion.site/4-ee015a23d2424e419cc971b8cdbc5db0?pvs=4

0개의 댓글