본문 바로가기
Back-End/Java

Java(7)

by newny 2023. 3. 21.
반응형

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

댓글