6_interface_error
인터페이스
- 클래스의 인터페이스를 설계할 때 이용
- 추상 클래스와 유사한 역할
- but… 상속과는 별개로 취급
- 클래스에서 구현될 추상메서드 선언
- 일반 메서드는 정의 불가(but… JDK8부터는 디폴트 메서드 허용)
- 인스턴스 변수는 선언 불가(static, final변수는 허용)
-
인터페이스 선언
1 2 3 4 5 6 7 8
접근자 interface 인터페이스_이름{ //상수 필드 //추상 메서드 //static메서드 ->JDK8부터 가능 //default메서드->JDK8부터 가능 //private메서드->JDK8부터 가능 }
- 인터페이스 내부 변수, 메서드의 키워드는 생략
- 컴파일 시 자동으로 추가됨
- 변수는 상수:
int MAX=10;
→public static final int MAX=10;
메서드는 추상 메서드:void func();
→public abstract void func();
extends
이용해 인터페이스가 다른 인터페이스 상속가능-
인터페이스 구현
class 클래스_명 implements 인터페이스1,2,...{//abstract메서드 구현}
- 인터페이스에 선언 된 추상 메서드는 모두 구현되어야 함
- 여러 인터페이스 상속 가능
- 구현 시 추가로 메서드 정의 가능
인터페이스와 오브젝트 참조
- 인터페이스로 구현 클래스 오브젝트 참조가능
- 상속의 다형성과 유사
- 인터페이스에 선언된 메서드만 참조 가능
Figure f=new Rectangle(10,20); f.area();
인터페이스와 변수 선언
- 인터 페이스 내 선언 되는 변수는 상수로 취급
- 즉, 상속 후에 변경 불가
- 여러 클래스에서 사용하는 상수를 정의할 때 편리
분류 | 인터페이스 | 추상 클래스 |
---|---|---|
구현 메서드 | 포함 불가(단 디폴트 메서드와 정적 메서드는 예외) | 포함 가능 |
인스턴스 변수 | 포함 불가 | 포함가능 |
다중 상속 | 가능 | 불가 |
디폴트 메서드 | 선언 가능 | 선언 불가 |
생성자와 main() | 선언 불가 | 선언 가능 |
상속에서의 부모 | 인터페이스 | 인터페이스, 추상클래스 |
접근 범위 | 모든 멤버를 공개 | 추상메서드를 최소한 자식에게 공개 |
중첩 인터페이스
- 클래스 내부에 인터페이스가 선언될 때
- 중첩 인터페이스를 멤버로 둔 클래스 이름을 명시
1
2
3
4
5
6
7
8
9
10
11
12
13
class A {
**public interface NestedIf {**
boolean isNotNegative(int x);
}
}
class B implements **A.NestedIF** {
public boolean isNotNegative(int x) {
return x < 0? false: true;
}
}
//…
**A.NestedIf** nif = new B();
default메서드
- 인터페이스 내 메서드 구현을 정의(JDK8~)
- 장점
- 호환성을 유지하며 새기능을 추가할 때
- 클래스에서 구현할 필요 없는 메서드가 있을 때
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
public interface MyIF { int getNumber(); **default** String getString() { return “default string”; } } class MyIFImp implements MyIF { public int **getNumber()** { return 100; } } //… MyIFImp obj = new MyIFImp(); obj.getNumber();//구현없이 호출가능 obj.getString();
static메서드
- 인터페이스 내에 static 메서드를 정의할 때(JDK8~)
1
2
3
4
5
6
7
public interface MyIF {
static int getDefaultNumber() {
return 0;
}
}
//..
MyIf.getDefaultNumber();
private메서드
- 인터페이스 내에 private메서드를 정의할 때
- default메서드가 내부적으로 호출할 때 유용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
interface IntStack {
//…
default int[] popNElements(int n) {
return getElements(n);
}
default int[] skipAndPopNElements(int skip, int n) {
getElements(skip);
return **getElements(n);//중복된 구현을 줄일 수 있음**
}
**private** int[] getElements(int n) {
int[] elements = new int[n];
for(int i=0; i < n; i++) elements[i] = pop();
return elements;
}
}
예외처리
예외(exception)
- 프로그램 실행 중 발생하는 오류
- 개발자가 직접 처리해줘야함
- 예외 발생을 위한 우회 경로 구축 필요
예외 타입
- Java에서 모든 예외는 Throwable 클래스를 상속 (2개의 서브 클래스로 구분)
Error
개발자가 처리할 수 없는 오류 예: 스택 오버플로우, JVM자원 부족
Exception
개발자가 처리할 수 있는 오류 예: 0으로 나누기, 배열 밖 접근 비검사형 예외(실행 예외) & 검사형 예외(일반예외)
비검사형 예외(실행 예외)
- 예외 처리를 하지 않아도 컴파일이 가능한 예외 (개발자의 실수로 발생할 수 있음)
실행 예외 | 발생이유 |
---|---|
ArithmeticException | 0으로 나누기와 같은 부적절한 산술연산을 수행할 때 발생한다. |
IllegalArgumentException | 메서드에 부적절한 인수를 전달할 때 발생한다. |
IndexOutOfBoundsException | 배열, 벡터 등에서 범위를 벗어난 인덱스를 사용할 때 발생한다. |
NoSuchElementException | 요구한 원소가 없을 때 발생한다. |
NullPointerException | null값을 가진 참조 변수에 접근할 때 발생한다. |
NumberFormatException | 숫자로 발꿀 수 없는 문자열을 숫자로 변환하려 할 때 발생한다. |
java.lang.산술연산에 관련된 예외/간량한 이유at스택트레이스(소스행번호)
java.lang.ArithmeticException:/by zero at Zero.main(Zero.java:4)
검사형 예외(일반 예외)
- 예외 처리를 하지 않으면 컴팡리 오츄가 발생
- 예외 처리 코드를 반드시 추가해 줘야함
일반예외 발생이유 ClassNotFoundException 존재하지 않는 클래스를 사용하려 할때 발생 InterruptedException 인터럽트되었을 때 발생 NoSuchFieldException 클래스가 명사한 필드를 포함하지 않을 때 발생 NoSuchMethodException 클래스가 명시한 메서드를 포함하지 않을 때 발생 IOException 데이터 읽기 같은 입출력 문제가 있을 때 발생
Java의 예외 처리 방식
- 예외 발생 시 해당 예외를 담은 오브젝트 생성
- 예외를 생성한 메서드가 잡거나(
catch
) - 다른 메서드로 던질 수 있음(
throws
)
- 예외를 생성한 메서드가 잡거나(
- Java 런타임 시스템이 프로그램을 종료시킴
- 적절한 예외 처리로 예기치 못한 종료를 방지하는 것이 중요!
1
2
3
4
5
try{
//예외 발생 구간
}catch(예외클래스1 매개변수){//매개변수로 정의된 예외클래스만 잡히게 됨
//핸들러
}
예외 출력
-
Throwable 클래스는
toString()
을 오버라이딩println()
→ 호출 되어 예외 출력1 2 3 4
catch (ArithmeticException e) { System.out.println(“Exception: “ + e); } //>>Exception: java.lang.ArithmeticException: / by Zero
-
출력 시 사용하는 주요 메서드
메서드 설명 public String getMessage() Throwable 객체의 자세한 메시지를 반환 public String toString() Throwable 객체의 간단한 메시지를 반환 public boid printStackTrace() Throwable rorcpdhk 추적정보를 콘솔 뷰에 출력 -
다중 catch 문
1 2 3 4 5 6 7
try{ //예외 발생 구간 }catch(예외클래스1매개변수){ //핸들러 }catch(예외클래스2매개변수){ //핸들러 }
1 2 3 4 5 6 7 8 9 10
try { int a = 0; int b = 42 / a; int[] c = { 1 }; c[42] = 99; } catch(ArithmeticException e) { System.out.println("Divide by 0: " + e); } catch(ArrayIndexOutOfBoundsException e) { System.out.println("Array oob: " + e); }
- 상속 관계를 고려한 catch문 정의 필요
- 항상 서브 클래스가 슈퍼 클래스보다 먼저 와야함
- 슈퍼 클래스는 서브 클래스 예외를 모두 잡기 때문
1 2 3 4 5 6 7 8 9
try { int a = 0; int b = 42 / a; } catch(**Exception e**) {//서브 클래스 예외를 모두 잡음 System.out.println("Generic catch."); } catch(ArithmeticException e) { **// ERROR - unreachable** System.out.println(”Never reached."); }
- 상속 관계를 고려한 catch문 정의 필요
-
throw문
throw 예외_오브젝트;
- 프로그램이 예외를 직접 발생시킬 때
- 예외 오브젝트는 Throwable 타입이어야함
1 2 3 4 5 6
try { throw new NullPointerException("demo"); } catch(NullPointerException e) { System.out.println("Caught."); throw e; }
1 2 3 4 5 6 7 8 9
class ThrowsDemo { static void throwOne() { **throw new IllegalAccessException("demo"); //예외를 생성했으나 아무도 처리안하면 컴파일 에러가 발생함에 유의** } public static void main(String[] args) { throwOne(); } }
- throws문
- 호출자(caller)로 예외처리(직접 예외 처리가 어려울 경우)
- 메서드 선언문에 넘길 예외를 명시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
public void write(String filename) **throws IOException, ArithmeticException** //… class ThrowsDemo { static void throwOne() **throws IllegalAccessException** { **throw new IllegalAccessException("demo");** } public static void main(String[] args) { try { throwOne(); } catch (IllegalAccessException e) { //… } } }
- finally블록
- 예외가 발생 여부와 관계없이 실행되는 블록
- catch문에 예외가 매칭되지 않아도 실행됨
- 반드시 실행되어야 하는 코드에 적용(열었던 파일, 소켓 닫기)
1 2 3 4 5 6 7 8 9
try { int a = 0; int b = 10 / a; } catch (ArithmeticException e) { System.out.println(“Caught”) finally { System.out.println(”Finally"); } //>>Caught Finally
- 예외가 발생 여부와 관계없이 실행되는 블록
- try-with-resouces
- try 문 내부에 사용된 자원을 자동으로 릴리즈(JEK7~)
1 2 3 4 5 6
try(자원({ //... }catch(예외클래스1매개변수){ //... } //...
- 개선된 다중 catch문
- catch문에서 OR논리 연산자 사용(JDK7~)
- catch문이 길어지는 걸 방지
1 2 3 4 5 6
try { int result = a / b; vals[10] = 19; } catch(ArithmeticException | ArrayIndexOutOfBoundsException e) { //… }
- catch문에서 OR논리 연산자 사용(JDK7~)