인터페이스
역할:
어떤 객체가 있고 그 객체가 특정한 인터페이스를 사용한다면 그 객체는 반드시 인터페이스의 메소드들을 구현해야한다.
만약 인터페이스에서 강제하고 있는 메소드를 구현하지 않으면 이 에플리케이션은 컴파일조차 되지않는다.
interface I{
public void z();
}
class A implements I{//이 클래스는 인터페이스 I를 구현한다
public void z(){}//interface I 의 멤버인 public void z() 를 반드시 포함해야한다
}
몇 가지 규칙
하나의 클래스가 여러개의 인터페이스를 구현할 수 있다.
인터페이스도 상속이 된다
인터페이스의 멤버는 반드시 public이다(외부에서 제어할 수 있는 가장 개방적인 접근제어자)
다형성
다형성 : 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것
대표적인 예 ) 오버로딩
//Please don't change class name 'Main'
class O{
public void a(int param){
System.out.println("숫자출력");
System.out.println(param);
}
public void a(String param){
System.out.println("문자출력");
System.out.println(param);
}
}
class Main {
public static void main(String[] args) {
O o = new O();
o.a(1);;
o.a("one");
}
}
결과화면
숫자출력
1
문자출력
one
클래스 O의 메소드 a는 두개의 본체를 가지고 있다
두개의 본체는 a라는 같은 이름을 가졌지만 서로 다른 동작 방법을 가지고있기 때문에
오버로딩은 다형성의 한 예라고 할 수 있다.
예외
try...catch 는 예외에서 핵심적인 역할을 담당하는 문법적인 요소다.
try{
예외의 발생이 예상되는 로직
}catch(예외 클래스 인스턴스){
예외가 발생했을 때 실행되는 로직{
}
}catch(Exception e){
System.out.println("오류가 발생했습니다: "+e.getMessage());
}
에서 e는 변수다. Exception은 변수의 데이터 타입이 Exception이라는 의미
Exception은 자바에서 기본적으로 제공하는 클래스로 java.lang에 소속되어 있다.
getMessage라는 메소드는 오류의 원인을 사람이 이해하기 쉬운 형태로 리턴하도록 약속되어 있다.
e.getMessage();
오류에 대한 기본적인 내용을 출력해준다. 상세하진 않다
e.toString();
더 자세한 예외 정보를 제공한다.
e.printStackTrace()
위의 메소드들과 다르게 이건 리턴값이 없다.
이 메소드를 호출하면 메소드가 내부적으로 예외 결과를 화면에 출력한다.
이게 가장 자세한 예외 정보를 제공한다.
좀 더 다양한 예외 상황 처리
//Please don't change class name 'Main'
class A{
private int[] arr = new int[3];
A(){
arr[0]=0;
arr[1]=10;
arr[2]=20;
}
public void z(int first, int second){
try {
System.out.println(arr[first] / arr[second]);
} catch(ArrayIndexOutOfBoundsException e){
System.out.println("ArrayIndexOutOfBoundsException");
} catch(ArithmeticException e){
System.out.println("ArithmeticException");
} catch(Exception e){
System.out.println("Exception");
}
}
}
class Main {
public static void main(String[] args) {
A a = new A();
a.z(10, 0);
a.z(1, 0);
a.z(2, 1);
}
}
arr라는 배열은 3개의 값을 담을 수 있는데 10번째 인덱스를 호출한다면 오류가 날 것이다.
이럴때에는 ArrayIndexOutOfBoundsException을 발생시킨다
또한 메소드 z 내부적으로 10을 0으로 나누는 걸 실행하는데 이건 불가능 하기 때문에
ArithmeticException을 실행시킨다.
같은 로직이지만 상황에 따라서 다른 예외가 발생할 수있다는 거다.
이럴 땐 다중 catch를 이용하면된다.
else if 처럼 여러개의 catch를 사용하는 거다
근데 저 위의 코드에서 첫번째 catch안의 내용을
Exception e 로 바꾸면 컴파일이 안된다.
왜냐면 Exception이 ArrayIndexOutOfBoundsException...ArithemeticException
이러한 것들보다 포괄적인 예외를 의미하기 때문에 불필요한 로직을 감지하고 자바가 이를 개발자에게 알려준다
finally
//Please don't change class name 'Main'
class A{
private int[] arr = new int[3];
A(){
arr[0]=0;
arr[1]=10;
arr[2]=20;
}
public void z(int first, int second){
try {
System.out.println(arr[first] / arr[second]);
} catch(ArrayIndexOutOfBoundsException e){
System.out.println("ArrayIndexOutOfBoundsException");
} catch(ArithmeticException e){
System.out.println("ArithmeticException");
} catch(Exception e){
System.out.println("Exception");
} finally {
System.out.println("finally");
}
}
}
class Main {
public static void main(String[] args) {
A a = new A();
a.z(10, 0);
a.z(1, 0);
a.z(2, 1);
}
}
이건 try 구문에서 예외가 발생하는 것과 상관없이 언제나 실행되는 로직이다.
try 내의 구문이 실행되면 finally가 실행되고 있다.