- 선언부만 존재하고 구현부(바디 부분, {})는 존재하지 않는다.
- 자식 클래스에서 반드시 오버라이딩해야만 사용이 가능하다.
- 하나 이상의 추상 메소드를 포함한 클래스를 추상 클래스라 한다.
- 반드시 사용되어야 하는 메소드를 추상 클래스에 선언해놓으면 이 클래스를 상속받는 모든 클래스에서 반드시 추상 메소드를 재정의(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
}
}
기능적으로는 추상 클래스와 같지만 상수와 추상 메소드만 포함한다.
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
}
}
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 : 예외가 발생했을 때 전가한다. 보통 호출한 메소드에서 처리하게 된다. (보통 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을 적어줘야 한다.
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메소드에서 예외가 처리되었습니다.");
}
}
}//호출된 메소드에서 예외가 처리되었습니다.
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:
백엔드 개발 필수_패스트캠퍼스를 학습하고 정리한 내용입니다.