Java -10

김정현·2024년 4월 23일
0

JAVA

목록 보기
11/19

예외처리

1.오류와 에외
오류(Error): 시스템의 오류, JVM 오류 ...: 통제 불가 오류

예외(Exception): 코드 상의 오류 : 통제 가능한 오류

예외 클래스의 종류

Throwable

  • FileNotFoundException

-예외있든 없든 처리가 안되어 있으면 컴파일 X

-예외의 체크는 컴파일시 체크, 예외가 있으면 컴파일 X

-예외가 발생하든 안하든 반드시 적절한 예외처리가 필요한 예외

-엄격한 예외, 형식을 매우 중시

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class Ex02 {
    public static void main(String[] args) {
        // throw new FileNotFoundException(...)

        try {
            FileInputStream fis = new FileInputStream("da.txt");

            //에러 발생시 하단 코드 실행 X
            System.out.println("파일 처리..");

        } catch (FileNotFoundException e) {  // e = new FileNotFound ...
            System.out.println("예외 발생");
//            String message = e.getMessage();
//            System.out.println(message);
            e.printStackTrace();
        }

        System.out.println("매우 중요한 실행 코드");
    }
}

RuntimeException을 중간에 상속받은 예외 클래스

  • ArithmethicException

-예외가 발생하더라도 컴파일 O, class 파일 생성

-예외의 체크는 실행 중 체크, 실행이 되려면? calss 파일필요 (컴파일은 됨)

-유연한 예외, 형식은 X

public class Ex01 {
    public static void main(String[] args) {
        try {
            int num1 = 10;
            int num2 = 0;
            int result = num1 / num2;

            System.out.println(result);
        } catch (ArithmeticException e) {
            e.printStackTrace();
        }

        System.out.println("매우 중요한 코드...");

    }
}

예외 처리하기

1.try ~ catch 문

 try {
	// 예외가 발생할 가능성이 있는 코드 
	
 } catch (예외 객체 ....) {
	// 예외 발생시 처리할 코드 
 }

참고)
예외 발생
throw 예외객체;

예외, 오류 -> 원인을 확인을 하는것이 중요

예외 클래스 주요 메서드 : 정보확인

java.lang.Throwable
-String get Message() - 오류메세지 확인
-void printStackTrace()

  • 모든 예외는 Exception를 상속받고 있기때문에 다형성을 사용할 수 있다 .
catch (Exception e) {
            System.out.println("유입!");
            e.printStackTrace();
        }

또 두개 이상의 예외 처리를 한 개의 catch문으로 처리할 때

catch (ArithmeticException | NullPointerException e) {
            e.printStackTrace();
        }

위와 같이 처리할 수 있다.

exception 클래스는 최 하단

2.try-catch-finally문
- 자원을 소비하는 객체 - FileInputStream, FileOutputStream, Connection, PrepareStatement ...
- 자원 해제 -> 애플리케이션 종료시에 해제
- 서버? 종료 X -> 자원해제를 하지 않으면 메모리 부족 현상 발생
- 자원해제를 적절하게 해야 된다.(close()...)

try {

} catch (...) {
	...
} finally {
	// 예외가 발생하든 안하든 항상 실행되는 코드 
	// return 하더라도 코드가 실행 
}
  • 자원해제
public class Ex04 {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("a.txt" );

            System.out.println("파일 작업...");

        }   catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {  //자원 해제 
                try {
                    fis.close();
                } catch (IOException e) {
                    
                }
            }
        }
    }
}

다소 복잡하다.
그걸 보완하기 위해 나온 구문
3.try-with-resources문
- JDK7에서 추가
- 자원 해제를 자동

	try ( 해제할 자원 객체;
			해제할 자원 객체 ...) {
		// 예외가 발생할 가능성이 있는 코드 
		
	} catch(예외 객체 ...) {
	
}
	

자원 자동해제의 기준
AutoCloseable 인터페이스의 구현 클래스

  • close() 메서드를 자동 호출

public class Ex05 {
    public static void main(String[] args) {
        try(FileInputStream fis = new FileInputStream("a.txt")) {

//        AutoCloseable auto = fis;

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

다형성으로 AutoCloseable 이용해서 자동 해제. (생략)

사용자 정의 예외

-JDK 기본 정의 예외 외에 따로 작성하는 예외

java.lang 패키지

  • 기본적으로 많이 사용하는 클래스들이 포함

예) String
java.lang.String

컴파일러가 패키지명 바로 아래쪽 import java.lang.*;가 추가

  • lang 패키지의 모든 클래스는 그냥 사용 가능

Object 클래스
- 모든 클래스의 상위 클래스
- 상속이 명시 X -> extends java.lang.Object 가 추가(컴파일러)

  • Object 클래스에 정의된 메서드
  1. toString() 메서드

  2. equals() 메서드

  3. hashCode() 메서드

String 클래스

  1. String을 선언하는 두 가지 방법
  2. String 클래스의 final char[] 변수
  3. StringBuffer와 StringBuilder 클래스 활용하기

Wrapper 클래스

  • 기본 자료형을 위한 클래스
  1. Wrapper 클래스의 종류

  2. Integer 클래스 사용하기
    1) Integer 클래스의 메서드

  3. 오토박싱과 언박싱

컴파일러가 자동 추가해주는 내용

  1. 기본 생성자
  2. 생성자에서 super()를 첫 줄에 추가
  3. 참조 변수를 출력 -> 참조변수.toString()
  4. 지역 변수의 상수화 (final)
  5. 인터페이스의 추상 메서드 - public abstract
  6. 인터페이스의 변수 정의(정적 상수): public static final
  7. import java.lang.*;
  8. extends java.lang.Object

Object

public String toString() {
	return getClass().getName() + "@" + Integer.toHexString(hashCode());
 }

1. toString

-getClass().getName(): 클래스명(패키지명을 포함한 전체 클래스명)

-Integer.toHexString(hashCode()) : 객체의 주소값을 16진수로 변환한 문자열

위 형식을 따르지 않았을경우 모두 재정의 된것 .
generate -> override method -> toString

2. hashCode() 메서드

-개체를 찾기 위한 값

-기본값은 유일한 값으로 쓰기 위한 객체의 주소 값

-> 동등성 비교를 위한 재정의 가능

hash: 같은 값에 대해서 같은 값을 생성

3. equals() 메서드

public boolean equlas(Object obj) {
	return(this == obj);
}
  • 동일성 비교(주소) : ==

  • 동등성 비교 : equals를 재정의(내부 가치를 비교함)
    재정의를 사용하게끔 의도해서 설계되어있고
    기본적으로는 str과 int만 재정의가 되어있다.

(주소 비교가 아닌 object를 새로 만들어 동등성을 비교하게끔)
나머지 자료형에 관해서는 주소값 비교.

참고)
String
문자열 비교 == 사용 X
equals 사용 O
해시코드도 동등성비교의 기준

public static void main(String[] args) {
        Book book1 = new Book(1000, "책1", "저자1");
        Book book2 = new Book(1001, "책2", "저자2");

        System.out.println(book1.equals(book2));
    }

참고) 중복제거

 @Override
    public int hashCode() {
        return Objects.hash(isbn, title, author);
    }

를 제너레이터로 생성하면 동일한 해쉬태그와 같은 equals 동등성을 가지고 있다면 제거 된다.

java.util.Objects 문서확인

가변 매개변수

매개변수를 가변적으로 받음

public class Ex08 {
    public static void main(String[] args) {
        sum(10, 20, 30, 40);
    }
    public static int sum(int...nums) {
        System.out.println(Arrays.toString(nums));
        return 0;
    }
}

0개의 댓글