반응형
abstract
추상클래스
- 미완성 클래스
- new 연산자를 직접 사용할 수 없다 (객체를 생성할 수 없다)
- 추상메소드가 1개라도 있으면 추상클래스
추상메소드
- 미완성 메소드
- 형식) 리턴형 메소드명();
- 메소드의 중괄호가 없는 함수
- 메소드를 선언만 해놓음
인터페이스
인터페이스 간의 상속은 다중상속이 가능하다
[public] interface [인터페이스명] {
(public static final) [타입] [상수명]; // 상수 필드
(public abstract) [리턴타입] [메소드명] (매개변수); // public 추상메소드 (default)
(public) default [리턴타입] [메소드명] (매개변수) {실행코드}; // 디폴트 메소드
(public) static [리턴타입] [메소드명] (매개변수) {실행코드}; // 정적 메소드
private [동적/정적] [리턴타입] [메소드명] (매개변수) {실행코드}; // private 동적/정적 메소드
}
추상메소드(default)
- public abstract를 생략하더라도 컴파일 과정에서 자동으로 붙게 됨
- 실행코드 없음 → 오버라이딩할 구현객체 있어야 함
디폴트메소드
- public을 생략하더라도 컴파일 과정에서 자동으로 붙게 됨
- 접근제한자 뒤에 default라는 키워드를 붙여야 함
- 실행코드 있으나 구현객체가 있어야만 사용가능
정적메소드
- 추상메소드와 디폴트메소드는 구현객체가 필요하지만 정적메소드는 인터페이스만으로 호출 가능함
- 접근제한자는 public과 private 사용가능 → 접근제한자를 생략하더라도 컴파일 과정에서 public이 붙음 (기본값이 public)
- 실행코드가 있고 구현객체가 없어도 호출할 수 있음 (static)
- static이기 때문에 인터페이스 내부의 동적 메소드 호출 불가
private 메소드
- 동적/정적 둘 다 구현 가능
- 디폴트와 정적메소드들의 중복 코드를 줄이기 위해 사용
자동타입변환
- 인터페이스 변수에 구현객체를 넣으면 자동 타입변환이 일어남
- 인터페이스 타입으로 선언되었기 때문에 인터페이스의 메소드만 사용가능
- 부모클래스가 인터페이스를 구현하고 있다면 자식클래스도 인터페이스 타입으로 자동 타입변환할 수 있음
인터페이스 변수 = 구현객체;
public interface A {} // A 인터페이스
public class B implements A {} // A 인터페이스의 구현클래스 B
public class C extends B {} // B 클래스의 자식클래스 C
A ab = new B(); //인터페이스 자동타입변환
A ac = new C(); //인터페이스 자동타입변환
B bc = new C(); //부모타입 자동타입변환
강제타입변환
구현 객체가 인터페이스 타입으로 자동 변환될 경우(매개값을 상위타입으로 받는 경우 등) 인터페이스에 선언된 메소드만 사용 가능하다.
인터페이스 타입으로 자동 타입 변환이 일어난 후 구현 객체만 가지고 있는 메소드(오버라이딩하지 않은 메소드)도 호출하고 싶다면 다시 구현 클래스 타입으로 강제타입변환 해야 한다.
구현클래스 변수 = (구현클래스) 자동타입변환된 인터페이스 변수;
public interface A { // 인터페이스 A
public void a();
}
public class B implements A { // A 인터페이스의 구현클래스 B
@Override
public void a() {} // 오버라이딩 된 a메소드
public void b() {} // B 클래스 메소드
}
A ab = new B();
ab.a();
// 오버라이딩 된 a메소드만 사용가능
// b메소드 사용 불가
B ba = ab;
ba.a();
ba.b();
// 오버라이딩 된 a메소드와 b메소드 사용가능
예외와 예외 클래스
에러(error)
하드웨어의 고장으로 인해 응용 프로그램 실행 오류가 발생하는 것
개발자가 대처할 수 없음
예외(exception)
- 잘못된 사용 또는 잘못된 코딩으로 인한 오류
- 예외 처리를 통해 개발자가 대처할 수 있음
- 일반예외(Exception)→ Exception 클래스를 상속받음
- → Compile시에 발생
- 실행예외(Runtime Exception)→ Exception.RuntimeException 클래스를 상속 받음
- → Runtime에 발생
- 예외가 발생하면 예외 클래스로부터 객체를 생성함
예외처리 코드
- 예외가 발생했을 때 프로그램의 갑작스러운 종료를 막고 정상 실행을 유지할 수 있도록 처리하는 코드
- 실제 오류를 처리하는 코드를 의미하는 것은 아니고, 예외가 일어났을 때 어떠한 예외가 발생했는지 알 수 있게 코드를 작성하는 것
- try-catch-finally블록으로 구성되어 있음
- 생성자, 메소드 내부에서 작성됨
- finally블록은 생략 가능
- 다중 catch블록 사용가능 (단, 위쪽 catch블록보다 아래쪽 catch블록이 예외처리범위가 더 커야 함)
- 두 개 이상의 예외를 하나의 catch블록으로 동일하게 처리하고 싶을 때는 ‘| ‘사용
- catch(NullPointerException | NumberFormatException e)
- try블록에서 정상실행 → finally블록실행
- try블록에서 예외 발생 → catch블록실행 → finally블록실행
throws 키워드
- 메소드를 호출 한 곳으로 예외를 떠넘김
- 해당 메소드에서 예외처리를 떠넘겼기 때문에 이 메소드를 호출한 곳에서 예외처리를 해야 함
public void method1() {
try{
method2(); // 호출한 곳에서 예외처리
} catch(ClassNotFoundException e) {
...
}
public void methos2() throws ClassNotFoundException {
...
}
나열해야 할 예외 클래스가 많을 경우
리턴타입 메소드명(매개변수, …) throws Exception {}
main()메소드에서 throws 키워드를 사용하게 되면 JVM이 최종적으로 예외처리를 하게 됨
JVM은 예외의 내용을 콘솔에 출력하는 것으로 예외 처리를 함
public static void main(String[] args) throws Exception {}
반응형
'Back-End > Java' 카테고리의 다른 글
Java(8) (0) | 2023.03.22 |
---|---|
Java 예제(4) (0) | 2023.03.20 |
Java(6) (0) | 2023.03.20 |
댓글