1. 내부 클래스
1)내부 클래스의 종류와 특징
a. 내부 클래스의 종류와 유효범위는 변수와 동일
ex) class Outer{
int iv = 0; // 1번
static int cv = 0; // 2번
void myMethod() {
int lv = 0; // 3번
}
}
class Outer {
class InstanceInner {} // 1번
static class StaticInner {} // 2번
void myMethod() {
class LocalInner {} // 3번
}
}
b. 인스턴스 내부 클래스 ( = iv) : 외부 크래스의 멤버변수 선언 위치에 선언함 외부 클래스의 인스턴스 멤버처럼 다루어진다.
주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언된다.
c. 스테틱 내부 클래스 ( = cv) : 외부 클래스의 멤버 변수 선언 위치에 선언하며, 외부 클래스의
static 멤버처럼 다루어진다. 주로 외부 클래스의 static 멤버, 특히 static 메서드에서 사용될 목적으로 선언된다.
d. 지역 내부 클래스 ( = lv) : 외부 클래스의 메서드나 초기화블럭 안에 선언하며, 선언된 영억 내부에서만 사용될 수 있다.
e. 익명 내부 클래스 : 클래스의 선언가 객체의 생성을 동시에 하는 이름없는 클래스 (일회용)
2) 내부 클래스의 제어자와 접근성
a. static 멤버를 정의하고 싶으면 static 클래스를 안에만 사용할 수 있음
b. static 내부 클래스에서는 외부 클래스의 인스턴스 멤버에 접근할 수 없음
c. final static은 상수이므로 다른 클래스에서 사용가능함
ex) void myMethod() {
class LocalInner {
int iv = 300;
final static int CONST = 300; // 지역 내부 클래스의 static 상수는 메서드 내에서만 사용가능
}
}
public static void main(String args[]) {
System.out.println(LocalInner.CONST); // 에러 !!
}
d. 외부 클래스의 private 멤버도 접근가능하다.
e. 외부 클래스의 지역변수는 final이 붙은 변수(상수)만 접근가능하다.
f.
ex) class Outer2 {
class InstanceInner {
int iv = 100;
{
static class StaticInner {
int iv = 200;
static int cv = 300;
}
}
public static void main(String[] args) {
Outer2 oc = new Outer2(); // 외부 클래스의 인스턴스를 먼저 생성해야 인스턴스 클래스의
Outer2.InstanceInner ii = oc.new InstanceInner(); // 인스턴스를 생성 가능!
Outer2.StaticInner si = new Outer2.StaticInner(); // 스테틱 내부 클래스의 인스턴스는 외부 클래스를 먼저 생성하지 않아도 된다!
3)익명 클래스
a. 익명 클래스란?
이름이 없는 일회용 클래스. 정의와 생성을 동시에
ex) new 조상클래스이름() {
// 맴버 선언
}
또는
new 구현인터페이스이름() {
// 맴버 선언
}
2. 프로그램 오류(예외 처리)
1) 종류
a. 컴파일 에러 : 컴파일 할 때 발생하는 에러
b. 런타임 에러 : 실행 할 때 발생하는 에러
c. 논리적 에러 : 작성 의도와 다르게 동작 (프로그램 종료 X)
2) Java의 런타임 에러
에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류 -> 발생했을 때 우리가 처리하여 프로그램이 죽지 않고 돌아갈 수 있게 하는 것이 예외처리!
3) 예외처리의 정의와 목적
정의 : 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것
목적 : 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
4) Exception과 RuntimeException
Exception클래스와 자손 클래스들 : 사용자의 실수와 같은 외적인 요인(입출력 예외, 클래스가 존재 X)에 의해 발생하는 예외
RuntimeException 클래스들 : 프로그래머의 실수(산술계산예외, 형변환, 널포인터, 배열범위 벗어남)로 발생하는 예외
5) try-catch 문
a. try-catch문
ex) try {
// 쇼핑을 한다고 가정하자!
} catch (Exception e1) {
// 돈이 부족한 경우
} catch (Exception e2) {
// 물건이 부족한 경우
} catch (Exception e3) {
// 가게 문닫은 경우
} // 조심할 점: 블럭에 포함된 문장이 한 문장이여도 괄호를 생략할 수 없음!!
b. try블럭 내에서 예외가 발생한 경우
- 발생한 예외와 일치하는 catch 블럭이 있는지 확인한다.
- 일치하는 catch 블럭을 찾게 되면, 그 catch 블럭 내의 문장들을 수행하고 전체 try-catch
문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch블럭을 찾지
못하면 예외는 처리되지 못한다.
c. try블럭 내에서 예외가 발생하지 않은 경우
- catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.
6) printStackTrace()와 getMessage()
a. printStackTrace() : 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메세지를 화면에 출력한다.
b. getMessage() : 발생한 예외클래스의 인스턴스에 지정된 메세지를 얻을 수 있다.
7) 멀티 catch 블럭
: 내용이 같은 catch 블럭을 하나로 합친 것
ex) try {
...
} catch (ExceptionA e) {
e.printStackTrace();
} catch (ExceptionB e2) {
e2.printStackTrace();
}
try {
...
} catch (ExceptionA | ExceptionB e) { // 위의 코드에서 동일내용 중복제거 !! (실행 값은 같음)
e.printStackTrace();
}
8) 예외 발생시키기
a. 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
Exception e = new Exception("고의로 발생시켰음");
b. 키워드 throw를 이용해서 예외를 발생시킨다.
throw e;
9) checked 예외, unchecked 예외
checked예외 : 컴파일러가 예외 처리 여부를 체크 (예외 처리 필수)
unchecked예외 : 컴파일러가 예외 처리 여부를 체크 안함 (예외 처리 선택)
10) 메서드에 예외 선언하기
: 메서드가 호출시 발생가능한 예외를 호출하는 쪽에 알리는 것
11) finally 블럭
: 예외 발생여부와 관계없이 수행되어야 하는 코드를 넣는다.
ex) try (
// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
// 예외처리를 위한 문장을 적는다.
} finally {
//예외의 발생여부에 관계업싱 항상 수행되어야하는 문장들을 넣는다.
// finally 블럭은 try-catch문의 맨 마지막에 위치해야한다.
} // try 블럭 안에 return문이 있어서 try블럭을 벗어나갈 때도 finally 블럭이 실행!!
12) 사용자 정의 예외 만들기
- 우리가 직접 예외 클래스를 정의할 수 있다.
- 조상은 Exception(필수처리 try-catch 구문필요)과 RuntimeException(선태처리)중에서 선택
13) 예외 되던지기
- 예외를 처리한 후에 다시 예외를 발생시키는 것
- 호출한 메서드와 호출된 메서드 양쪽 모두에서 예외처리하는 것
14)연결된 예외
- 한 예외가 다른 예외를 발생시킬 수 있다.
- 예외A가 예외 B를 발생시키면 A는 B의 원인 예외(cause exception)
Trowable initCause(Throwable cause) 지정한 예외를 원인 예외로 등록
Trowable getCause() 원인 예외를 반환
ex) public class Throwable(= Exception) implements Serializable {
...
private Throwable cause = this; // 원인예외를 저장하기 위한 iv , 객체 자신(this)을 원인 예외로 등록
...
public synchroized initCause(Throwable cause) {
...
this.cause = cause; // cause를 원인 예외로 등록
return this;
}
}
'JAVA' 카테고리의 다른 글
java #10 LinkedList , ArrayList , Stack , Queue , Iterator (0) | 2021.05.15 |
---|---|
java #9 컬렉션 프레임웍, 컬렉션 클래스, List , Set , Map 인터페이스 (0) | 2021.05.13 |
java #7 디폴트 메서드와 static 메서드, 추상 클래스와 인터페이스(복습) (0) | 2021.05.11 |
java #문제풀기 4 상속 (0) | 2021.05.07 |
java #문제풀기3 상속문제 (0) | 2021.05.06 |