[JAVA] ABSTRACT, INTERFACE, EXCEPTION

abstract, interface, implements, exception, finally, throws, throw

Posted by iheese on April 14, 2022 · 9 mins read

abstract

  • abstract method (추상 메소드)
  • 선언부만 존재하고 구현부(바디 부분, {})는 존재하지 않는다.
  • 자식 클래스에서 반드시 오버라이딩해야만 사용이 가능하다.
  • abstract class (추상 클래스)
  • 하나 이상의 추상 메소드를 포함한 클래스를 추상 클래스라 한다.
  • 반드시 사용되어야 하는 메소드를 추상 클래스에 선언해놓으면 이 클래스를 상속받는 모든 클래스에서 반드시 추상 메소드를 재정의(overriding)해야한다.
  • 추상 클래스는 스스로 객체 생성이 불가능하다.
  • 생성자, 일반 멤버변수, 일반 메소드도 포함될 수 있다.
  • 추상 클래스, 추상 메소드의 사용법 :

abstract class 클래스 이름{ //추상 클래스

 	abstract 반환타입 메소드이름();  //추상 메소드

 }

  • 예시 :

 abstract class Number{

 	abstract void showNumber();

 }


class Num1 extends Number{

 	void showNumber(){

 	   System.out.println("1")

    }

  }

class Num2 extends Number{

 	void showNumber(){

  	  System.out.println("2")

    }

  } 

  

public class NumTest{

	public static void main(String[] args){

    //Number num = new Number(); 추상 클래스 인스턴스 생성 불가

    Num1 num1 = new Num1();

    Num2 num2 = new Num2();

    

    num1.showNumber();  //1

    num2.showNumber();  //2

    }

}


interface (인터페이스)

  • 기능적으로는 추상 클래스와 같지만 상수와 추상 메소드만 포함한다.

  • JAVA8 이후에 default method, static method가 추가되었다.

  • default method : 필수 구현은 아닌 선택 사항, 인터페이스를 구현한 클래스에서 구현할 필요는 없지만, 재정의도 가능하다.
  • static method : 인터페이스에서 직접 가져다 쓰는 메소드(static 메소드 사용법과 같다. )
  • 일반적으로 java에서는 다중 상속이 불가되지만 인터페이스는 다중 상속이 가능하다.

  • 인터페이스의 사용법


접근제어자 interface 인터페이스이름{

	public static final 타입 상수이름 = ;

    // 상수 이름은 대문자로 스네이크 문법을 이용한다(BIG_NUMBER)

    public abstract 메소드이름(매개변수); //추상메소드

}

  • 위 제어자 부분은 인터페이스의 공통된 부분이라 컴파일 시 자바 컴파일러가 자동으로 추가해준다.

  • 인터페이스를 구현하는 클래스


class 클래스이름 implements 인터페이스이름{}

  • 예시

interface Number {

	public abstract void showNumber();

}


class num1 implements Number{

	public void showNumber(){

    	System.out.println("1")

    }

}



class num2 implements Number{

	public void showNumber(){

    	System.out.println("2")

    }

}



public class NumTest{

	public static void main(String[] args){

    

    Num1 num1 = new Num1();

    Num2 num2 = new Num2();

    

    num1.showNumber();  //1

    num2.showNumber();  //2

    }

}




exception(예외)

checked, unchecked Exception

  • error(오류) : 어떤 문제에 의해 프로그램이 종료되는 것, 개발자가 예측하여 처리할 수 없는 것, 처리 불가능

  • exception(예외) : 어떤 문제에 의해 프로그램이 종료되는 것, 발생하는 상황을 예측하여 처리할 수 있다.

  • try ~ catch문을 이용한 예외 처리(다중 catch문 가능)


try{

	예외를 처리하길 원하는 실행 코드

} catch(예외 e){

	예외 발생  실행코드

} catch(예외 e){

	예외 발생  실행코드

}



finally{

  예외 발생 여부와 상관없이 실행되는 코드

}

  • 예시

public class ExceptionTest{

public static void main(String[] args){

		try {

			System.out.println(2/0);

		} catch (Exception e) {

			System.out.println("나눌 수 없습니다.");

		}

	}

}




throws, throw

  • throws : 예외가 발생했을 때 전가한다. 보통 호출한 메소드에서 처리하게 된다. (보통 main 메소드에서 호출한다. )

  • 예시


public static void divideNumbers(int i, int j) throws Exception{

	System.out.println((i/j));

	}

}





public class ExceptionTest{

public static void main(String[] args){

		try {

			divideNumbers(2,0);

		} catch (Exception e) {

			System.out.println("예외 발생! 나눌 수 없습니다.");

		}

		

	}



//예외 발생! 나눌 수 없습니다.

  • 예외가 발생해서 divideNumbers 가 예외를 넘겼고, main 메소드가 처리하여 catch 문으로 넘겼다.

  • 예시를 들기 위해 Exception을 이용했지만 catch에는 보통 예상되는 예외를 넣고 올바른 실행 코드를 입력하고 맨 마지막 catch에 최상위 클래스 예외인 Exception을 적어줘야 한다.

throw : 예외를 객체로 생성해 발생시킨다.

  • 예시1 :

public class ExceptionTest{

    static void makeException() {

        try {

            throw new Exception();

        } catch (Exception e) {

            System.out.println("호출된 메소드에서 예외가 처리되었습니다.");

        }

    }



public static void main(String[] args) {

        try {

            makeException();

        } catch (Exception e) {

            System.out.println("main메소드에서 예외가 처리되었습니다.");

        }

    }

}//호출된 메소드에서 예외가 처리되었습니다.

  • 예시2

import java.util.Scanner;



public class dd {

	 public static void main(String[] args) throws Exception {

	        Scanner sc = new Scanner(System.in);

	        int a = sc.nextInt();

	        

	        if(a>=0){

	        	throw new Exception("양수 혹은 0입니다.");

	        } else {

	        	System.out.println(a);

	        }

	    }

}

// 양수를 넣으면 에러를 발생시키고

// 음수를 넣으면 그대로 출력하는 실행문이다.

  • 위처럼 예외를 발생시켜서 프로그램을 종료할 수 있다.


Reference: