공부/JAVA

[java] 자바의 정석 요약정리 8 ~ 9장

junani0v0 2024. 4. 4. 14:27

자바의 정석 8~9장 정리.pdf
0.13MB

 

[ 8장 예외처리 ]

<예외처리>

-예외처리

1. 직접처리(try-catch)

2. 보고(예외선언)(예외 떠넘기기)

3. 은폐 (catch블럭)

4. (1,2) 예외 되던지기

-프로그램 오류의 종류

  컴파일 에러 : 컴파일 시에 발생하는 에러(컴파일 中)

런타임 에러 : 실행 시에 발생하는 에러(비정상 종료)

논리적 에러 : 실행은 되지만

작성 의도와 다르게 동작 하는 것

(제일 심각한 에러, 문제 찾기 어렵고 수정이 어렵다)

심각도 : 컴파일 에러 < 런타임 에러< 논리적 에러

 

-런타임 에러                                    

에러는 어쩔 수 없지만, 예외는 처리하자

1. 에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류(복구불가)(포기)

2. 예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류(처리가능)(예외처리)

 

-예외 처리의 정의 와 목적

정의 : 프로그램 실행 시 발생할 수 있는 예외의

발생에 대비한 코드를 작성하는 것

목적 : 프로그램의 비정상 종료를 막고,

정상적인 실행상태를 유지하는 것

 

<예외 클래스의 계층구조(Exception을 나누면)>

Exception클래스들 : 사용자의 실수와 같은 외적요인

으로 발생하는 예외 필수처리

RuntimeException클래스들 : 프로그래머의 실수로

 발생하는 예외 선택처리

 

<예외 처리하기 try-catch>

예외가 발생할 가능성이 있는 문장을 try에 넣는다

예외가 발생했을 때 수행할 문장 catch에 입력(다수 가능)

try catch문은 if 문과 다르게 { }생략 불가

1.     예외가 발생하기 않은 경우 : catch 거치지 않고 전체 try-catch문 빠져나가서 수행 계속

2.     예외가 발생한 경우 :

발생한 예외와 일치하는 catch블록이 있는지 확인

일치 catch블럭 찾게 되면, catch블럭 내의 문장들을 수행하고 전체 try-catch문 빠져나옴(나머지 무시)

(예외가 발생한 이후의 문장은 실행X)

일치하는 블록 없으면 예외처리 안됨 (프로그램 비정상종료)

Exception이 선언된 catch블록은 모든 예외처리가능(모든 예외의 최고조상)(제일 마지막 catch블록에 넣음)

 

<예외의 발생과 catch블럭>

printStackTrace() : 예외발생 당시의 호출스택에 있던 메서드의 정보와 예외 메시지를 화면에 출력

getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다

멀티 catch블럭 : 내용이 같은 catch블록을 하나로 합친 것 (두 멤버의 공통 멤버만 사용 가능)

 

<예외 발생시키기>

1.     연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음

Exception e = new Exception(“고의로 발생시킴”);

2.     키워드 throw를 이용해서 예외 발생시킨다

throw e;

checked예외 : 컴파일러가 예외처리여부 체크(예외처리 필수)(=Exception자손들)

unchecked예외 : 컴파일러가 예외 처리 여부를 미체크(예외처리 선택)(=RuntimeException자손들)

 

<메서드에 예외 선언하기>

-예외 처리 방법: try-catch, 예외 선언하기

-메서드가 호출 시 발생가능한 예외를 호출하는 쪽에 알리는 것

 

<finally블럭>

예외 발생여부와 관계없이 수행되야 하는 코드 넣는다

finally블록은 try-catch문 맨 마지막에 위치해야 한다

 

< 사용자 정의 예외 만들기 >

우리가 직접 예외 클래스를 정의하는 것(상속을 통해)조상 Exception RuntimeException 중에 선택

Exception 사용자가 발생시키는 예외(필수처리)(try-catch사용)

RuntimeException 프로그래머의 실수로 발생시키는 예외(선택처리)

(가능하면 선택처리가능한 RuntimeException을 조상으로 하기)

매개변수 생성자 생성 필요

ex) MyException(String msg){

//문자열을 매개변수로 받는 생성자

super(msg); }      //조상 클래스의 생성자 호출

 

< 예외 되던지기 >

예외를 처리한 후 다시 예외를 발생시키는 것

호출한 메서드와 호출된 메서드 양쪽 모두에서 예외 처리하는 것(분담처리)

< 연결된 예외 >

한 예외가 다른 예외를 발생시킬 수 있다(한 예외안에 다른 예외를 넣어  포함시킨다)

예외 A가 예외 B를 발생시키면, A B의 원인 예외

- 연결된 예외 사용이유

 1. 여러 예외를 하나로 묶어서 다루기 위해서

 2. checked예외(필수)->unchecked예외(선택)변경 위해

 

[ 9java.long패키지와 유용한 클래스 ]

< Object클래스 >

모든 클래스의 최고 조상. 오직 11개의 메서드만 가지고 있다

 

< boolean equals (Object obi) >

객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true 다르면 false

Object 클래스의 equals()는 객체의 주소를 비교(참조변수 값 비교)

인스턴스 변수( iv )의 값을 비교하도록 equals()를 오버라이딩해야 한다

 

< toString( ) >

객체를 문자열(String)로 변환하기 위한 메서드

 

< 얕은 복사와 깊은 복사 >

- 얕은 복사

값을 공유 , 그렇기에 수정하면 원본 바뀜

읽기를 할 때 주로 사용

복사 시간이 빠르다

- 깊은 복사

값을 개별로 가진다 수정해도 원본에 문제 X

쓰기를 할 때 주로 사용

복사 시간이 느림

 

< String 클래스 >

String클래스 = 데이터(char[])+메서드(문자열 관련)

내용을 변경할 수 없는 불변(immutable)클래스

불변의 특징 ex)  String a= “a” ;

                      String b =”b” ;

a = a + b ;        

문자열 결합에서 aab가 저장되는 게 아닌 새로운 ab문자열이 만들어져 거기에 저장됨, 주소만 바뀜

불변의 특징

- 문자열 비교

String str =”abc“; String str = new String(“abc”);차이

ex)        String str1 =”abc“;

String str2 =”abc“

//문자열 리터럴 “abc”의 주소가str1,2저장됨(하나 공유)

String str3 = new String(“abc”);

String str4 = new String(“abc”);

//새로운 String인스턴스 생성(항상새로운 문자열 생성)

문자열은 내용 변경 불가라 여러 참조변수 내용 공유해도 상관 X  String str = new String(“abc”); 보다는 String str =”abc“; 사용이 적합

==는 주소비교 , equals 는 내용비교

< 빈 문자열( “ “, empty string) >

내용이 없는 문자열. 크기가 0char형 배열을 저장하는 문자열

크기가 0인 배열을 생성하는 것은 어느 타입이나 가능

문자(char)와 문자열(String)의 초기화