풀스택 자바 - 20240807

김진아·2024년 8월 12일

예외처리


  • 오류가 나는 상황에 대해서 프로그램이 멈추지 않고, 오류에 대해 사용자가 알아보기 쉽게 편집할 수 있다.

try-catch-final

public class Main {
    public static void main(String[] args) {
    	int arr = new int[10];
        try {
			// 오류 가능성이 있는 코드
            int k = 10/0;
		} catch (ArithmeticException e) {
			// 오류가 발생할 시 실행되는 코드
            System.out.println("0으로 나누면 안됩니다.");
		} catch (ArrayIndexOutOfBoundsException e) {
			// 상황에 따라 오류의 종류가 다르다.
    		// catch는 다중 작성이 가능하다.
		} finally {
			// 오류가 나든 말든 무조건 실행되는 코드
    		// final은 생략 가능
		}
    }
}
  • 모든 예외를 처리할 수 있게 해주는 클래스는 'Exception'이다.
~~
} catch (Exception e) {
	// 오류의 종류에 상관없이 모든 오류를 처리
}
  • 예외처리할 때 오류를 알려주는 '특정 클래스'를 아는 방법은 콘솔에 출력되는 오류메세지에서 확인할 수 있다.


throw

  • 메소드안에서 오류가 날 수 있을 때는 예외를 외부에 던져주고 함수를 호출할 때 잡는다.
  • throws ArithmeticException
  • 아예 리턴값으로 오류를 삼을 수 있다.
  • throw new ArithmeticException("메세지");

    public class ExceptionExam2 {

        //메소드 호출
        public static void main(String[] args) {
            int i = 10;
            int j = 0;
            try{
                int k = divide(i, j);
                System.out.println(k);
            } catch(ArithmeticException e){
                System.out.println("0으로 나눌수 없습니다.");
            }
        }

        //메소드 case1
        public static int divide(int i, int j) throws ArithmeticException{
        	int j = 0;
            int k = 10 / j;
            return k;
        }
        //메소드 case2
        public static int divide(int i, int j) {
        	int j = 0;
            int k = 10 / j;
            throw new ArithmeticException("메세지");
        }
        
    }
        
        



표준입력


스캐너

  • 표준입력 객체
  • 'Scanner' 클래스 'import'문 추가
    import java.util.Scanner;
  • nextLine() 메소드로 문자열 받기
  • nextInt() 메소드로 정수 받기
  • nextDouble() 메소드로 실수 받기
  • ...등등 그외의 메소드는 공식문서 참조

※ 정수를 입력받을 때는 버퍼를 지워주는 작업을 거쳐줘야 한다.
why? => 숫자 입력 메소드는 입력 후 개행 문자("\n")는 읽지 않는다. 'nextLine()'메소드는 이 남아 있는 개행 문자를 읽고 빈 문자열을 반환할 수 있기 때문에 'nextLine()'메소드로 스캐너의 버퍼를 지워준다.

코드는 아래의 예제를 통해 확인한다.



예외처리와 표준입력을 이용한 예제


나이 입력받기

// 조건1. 나이를 모든 조건에 맞게 입력받을 때까지 반복
// 조건2. 0 이하의 숫자를 받을 시 안 되는 이유를 콘솔에 출력하고 다시 입력받기
// 조건3. 숫자가 아닌 값을 받을 시 안 되는 이류를 콘솔에 출력하고 다시 입력받기

// java.lang 패키지안의 오류 클래스를 제외한 모든 오류 클래스는 따로 import 해줘야함.
import java.util.InputMismatchException;		
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {		
 		Scanner sc = new Scanner(System.in);
 		int age;
        while (true) {
            try {
                System.out.println("나이를 입력하세요.");
                age = sc.nextInt();
                sc.nextLine();      //버퍼 초기화
                if (age < 1) {
                    System.out.println("나이는 1살 이상부터 입력 가능합니다. ");
                    continue;
                }
                System.out.println("입력받은 나이는 "+age+" 입니다. ");
            } catch (InputMismatchException e) {
                System.out.println("숫자를 입력해주세요.");
                sc.nextLine();    // 버퍼 초기화
                continue;
            }
            break;
        }
	}
}



상수 선언, final

  • 클래스, 메소드, 변수에 사용가능
  • 값과 행동을 변경할 수 없게 제한한다.

fianl 변수

  • 값을 변경할 수 없는 상수
  • 한 번 초기화 된 후, 값을 변경할 수 없다.
    final int PI = 3.14;

fianl 메소드

  • 서브클래스에서 오버라이딩할 수 없는 메소드를 선언할 수 있다.
class 사람 {
    final void sayHi() {
        System.out.println("hi");
    }
}
class 홍길동 extends 사람 {
    //void sayHi() {   // 오류 : 오버라이딩 할 수 없음
    //    System.out.println("hi, i'm 홍길동");
    //}
}

fianl 클래스

  • 상속할 수 없는 클래스
final class 사람 {}
// class 홍길동 extends 사람 {}    // 오류 : 상속 못 함



제네릭, Generic

  • 사용할 때 타입을 정해주는 문법



ArrayList

  • 크기가 고정된 배열은 유동적인 편집을 할 수 없다. 그래서 동적으로 크기가 조절되는 배열로 ArrayList가 존재한다.
  • ArrayList는 다양한 메소드를 제공하고, 유연성과 편의성이 높다. 그러나 성능이 배열보다는 좋지않다.
  • 객체만 저장할 수 있다. (기본 타입은 래퍼 클래스 사용)
  • 함수



Map

  • 키와 값의 쌍을 저장하는 자료구조

HashMap

profile
https://develop-chick.tistory.com/ 첫번째 블로그

0개의 댓글