1. 내부클래스
- 내부클래스는 클래스 내에 클래스가 선언된다는 점을 제외하고는 일반적인 클래스와 다르지 않다.
- 내부클래스는 사용빈도가 높지 않으므로 내부 클래스의 기본 원리와 특징을 이해하는 정도만 알아보자.
- 내부클래스는 클래슨 내에 선언된 클래스로써 두 클래스가 서로 긴밀한 관계에 있기 때문에 사용한다.
- 내부클래스의 장점은 다음과 같다.
① 내부클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
② 코드의 복잡성을 줄일 수 있다.
1-1) 내부클래스의 종류와 특징
- 내부클래스의 종류는 변수의 선언위치에 따른 종류와 같다.
- 내부클래스는 마치 변수를 선언하는 것과 같은 위치에 선언할 수 있으며, 변수의 선언위치에 따라
인스턴스변수, 클래스변수, 지역변수로 구분되는 것과 같이 내부클래스도 다음과 같이 구분되어 진다.
내부클래스 종류 | 특징 |
인스턴스 클래스 (instance class) |
외부클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스처럼 다뤄진다. 주로 외부클래스의 인스턴스멤버들과 관련된 작업에 사용될 목적으로 선언된다. |
스태틱 클래스 (static calss) |
외부클래스의 멤버변수 선언위치에 선언하며, 외부클래스의 static멤버처럼 다루어진다. 주로 외부클래스의 static멤버, 특히 static 메소드에서 사용될 목적으로 선언된다. |
지역 클래스 (local calss) |
외부클래스의 메소드에 선언하며, 선언된 영역 내부에서만 사용될 수 있다. |
1-2) 내부클래스의 제어자와 접근성
- 인스턴스크래스와 스태틱클래스는 외부 클래스의 멤버변수와 같은 위치에 선언되며, 또한 멤버변수와 같은 성질을 가진다.
- 즉, 내부클래스가 외부클래스의 멤버와 같이 간주되고 인스턴스 멤버와 static 멤버간의 규칙이 내부클래스에서도 똑같이 적용된다.
*** O/X 퀴즈 ***
1.인스턴스 메소드에서 스태틱변수(클래스변수)를 사용할 수 있다? ==> O
2. 스태틱메소드에서 인스턴스 변수를 사용할 수 있다? ==> X
- 내부클래스 중에서 스태틱클래스만 static 멤버를 가질 수 있다.
- 다만 final과 static이 동시에 붙은 변수는 상수이므로 모든 클래스에서 정의가 가능하다.
- 인스턴스멤버는 같은 클래스에 있는 인스턴스멤버와 static멤버 모두 직접 호출이 가능하지만, static멤버는 인스턴스 멤버를 직접 호출할 수 없는 것처럼 인스턴스클래스는 외부클래스의 인스턴스멤버를 객체생성없이 바로 사용할 수 있지만 스태틱클래스는 외부클래스의 인스턴스멤버를 객체생성없이 사용할 수 없다.
- 마찬가지로 인스턴스 클래스는 스태틱클래스의 멤버들을 객체생성없이 사용할 수 있지만, 스태틱클래스에서는 인스턴스클래스의멤버들을 객체생성없이 사용할 수 없다.
2. 익명클래스(anonymous class)
- 익명클래스는 특이하게도 다른 내부클래스들과 달리 이름이 없다.
- 클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한번만 사용될 수 있고 오직 하나의 객체만으로 사용할 수 있는 일회용 클래스이다.
- 이름이 없기 때문에 생성자도 가질 수 없으며, 조상클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다.
- 오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다.
3. 예외처리(exception handling)
3-1)프로그램 오류
- 프로그램 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우가 있다.
- 이러한 결과를 초래하는 원인을 프로그램 에러 또는 오류라고 한다.
- 이를 발생시점에 따라 '컴파일에러(compile error)'와 '런타임에러(runtime error)'로 나눌 수 있는데 컴파일에러는 컴파일할 때 발생하는 에러이고 프로그램 실행 중에 발생하는 에러를 런타임에러라고 한다.
컴파일에러 | 컴파일시에 발생하는 에러(주로 문법) |
런타임에러 | 실행 시에 발생하는 에러(배열 범위 벗어남) |
논리적에러 | 실행은 되지만 의도와 다르게 동작하는 것 |
- 자바에서는 실행 시 (runtime)발생할 수 있는 프로그램 오류를 에러(error)와 예외(exception) 두 가지로 구분하였다.
- 에러가 발생하면 프로그램의 비정상적인 종료를 막을 길이 없지만, 예외는 발생하더라도 프로그래머가 이를 적절한 코드를 미리 작성해 놓음으로써 프로그램의 비정상적인 종료를 막을 수 있다.
* 에러 (error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
* 예외 (exception) : 프로그램 코드에 의해서 수습될 수 있는 미약한 오류
3-2) 예외처리 try-catch문
- 프로그램 실행 도중에 발생하는 에러는 어쩔 수 없지만, 예외는 프로그래머가 이에 대한 처리를 미리 해주어야 한다.
- 예외처리란 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것이며 예외처리의 목적은 예외의 발생으로 인한 실행 중인 프로그램의 갑작스런 비정상 종료를 막고 정상적인 실행상태를 유지할 수 있도록 하는 것이다.
① try 블록 내에서 예외가 발생한 경우
- 발생한 예외와 일치하는 catch 블록이 있는지 확인한다.
- 일치하는 catch블록을 찾게되면 그 catch블록 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 수행한다.
- catch문을 찾지 못하면 예외는 처리되지 않는다.
② try 블록 내에서 예외가 발생하지 않은 경우
- catch블록을 거치지 않고 try-catch문을 빠져나가서 수행을 계속한다.
3-3) 예외의 발생과 catch블록
- catch 블록은 괄호{}와 블록{} 두 부분으로 나누어져 있는데 괄호내에는 처리하고자 하는 예외와 같은 타입의 참조변수를 선언해야 한다.
- 예외가 발생하면 발생한 예외에 해당하는 클래스의 인스턴스가 만들어진다.
- 또한 예외가 발생했을 때 생성되는 예외 클래스의 인스턴스에는 발생한 예외의 대한 정보가 있으며 아래와 같다.
* getMessage() : 발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
* printStackTrace() : 예외발생 당시에 호출스택에 있었던 메소드의 정보와 예외 메시지를 화면에 출력한다.
3-4) 예외 발생시키기
- 키워드 throw를 사용해서 프로그래머가 고의로 예외를 발생시킬 수 있으며 방법은 아래의 순서를 따르면 된다.
① 먼저 new를 이용해서 발생시키려는 예외 클래스의 객체(인스턴스)를 만든 다음
② throw를 이용해서 예외를 발생시킨다.
3-5) 메소드에 예외 선언하기
- 예외를 try-catch문을 사용하는 것 외에 예외를 메소드에 선언하는 방법이 있다.
- 메소드에 예외를 선언하려면 메소드의 선언부에 throws를 사용해서 메소드 내에서 발생할 수 있는 예외를 적어주면 된다.
- 만약, 예외가 여러개일 경우 쉼표로 구분해서 여러개를 적어준다.
3-6) finally 블록
- finally 블록은 예외 발생여부에 상관없이 실행되어야 할 코드를 포함시킬 목적으로 사용된다.
- try-catch-finally의 순서로 구성된다.