자바 인터페이스

인터페이스는 추상 클래스(Abstract Class)의 일종으로 추상 클래스와 같이 추상 메소드를 같지만 값이 변하는 일반 멤버 변수는 가질 수 없습니다. JDK 1.8 이전 버전에서는 몸통(구현부)이 있는 일반 메소드를 가질 수 없었으나 JDK 1.8 버전부터는 디폴트 메소드와 정적 메소드 구현이 가능해졌습니다. 인터페이스는 inteface 키워드를 통해 선언하며 기능을 물려받는 클래스는 추상 클래스를 물려받는 것과는 다르게 상속(extends)이 아닌 구현(implements)한다고 표현합니다.

interface 인터페이스명 {
	
    // 상수 선언
    public static final 타입 상수이름 = 값;
    
    // 추상 메소드 선언
    public abstract 타입 메소드명();
	
    // 디폴트 메소드
    default 타입 메소드명();
    
    // 정적 메소드
    static 타입 메소드명() {
    	// 구현부
    }
}

위와 같이 상수, 추상 메소드, 디폴트 메소드, 정적 메소드를 구성원으로 가질 수 있습니다.

인터페이스를 사용하는 이유

인터페이스를 사용하면 구현하는 클래스에게 일부 구성원 구현에 대해 강제할 수 있습니다. 추상 메소드를 오버라이딩을 통해 구현해야 하며 인터페이스가 제공하는 정적 메소드를 무조건 사용해야 합니다. 이는 자바의 다형성을 극대화하여 코드의 생산성을 높이고 프로그램 유지, 보수의 용이성을 높이기 위함에 있습니다.

인터페이스의 구현

인터페이스도 추상 클래스와 마찬가지로 혼자서는 객체를 생성할 수 없습니다. 즉 추상 클래스가 하위 클래스에서 상속을 통해 추상 메소드를 완성시키는 것과 같이 인터페이스도 구현 클래스에서 추상 메소드를 완성시킵니다.

class 클래스명 implements 인터페이스명 {
	
    // 인터페이스를 구현하면 인터페이스에 선언된 추상 메소드를 반드시 구현해야 합니다.
    
}

인터페이스와 추상 클래스의 차이

얼핏 봤을 때 인터페이스와 추상 클래스는 구현(implements)하고, 상속(extends)한다는 키워드만 제외하고 보면 둘 다 추상 메소드를 갖으며 스스로 객체를 생성할 수 없다는 점에서 같아 보입니다. 하지만 자바에서는 추상 클래스의 다중 상속을 막아두었기 때문에 인터페이스를 통해 다중 상속을 할 수 있고 구현하는 모든 클래스에 대해 특정한 메소드를 반드시 구현하도록 강제할 수 있습니다.

자바 추상 클래스

  추상 클래스는 하나 이상의 추상 메소드를 포함한 클래스를 말합니다. 추상 클래스는 생성 시 클래스명 앞에 'abstract'라는 키워드를 붙여 해당 클래스가 추상 클래스임을 나타냅니다. 추상 클래스의 기본 조건이 추상 메소드를 하나 이상 포함하는 것이라고 했는데 추상 메소드도 마찬가지로 리턴 타입 앞에서 abstract를 붙여 추상 메소드임을 나타냅니다.

public abstract class 클래스명 {
	
    public abstract void 메소드명(); // 구현부({})는 작성하지 않고 남겨둡니다.
    
}

추상 클래스와 추상 메소드는 위의 코드처럼 작성합니다.

// 추상클래스
public abstract class Animal {
	
	public abstract void move();
	
}

// 위의 추상클래스 Animal을 구현한 Man 클래스
class Man extends Animal {
	
	@Override
	public void move() {
		System.out.println("두 발로 이동합니다.");
	}
}

// 위의 추상클래스 Animal을 구현한 Bird 클래스
class Bird extends Animal {
	
	@Override
	public void move() {
		System.out.println("날아서 이동합니다.");
	}
}

위 코드를 보면 추상 클래스 하나와 추상 클래스를 상속받은 두 개의 클래스가 있습니다. 동물은 모두 이동을 하지만 이동하는 방법에는 차이가 있습니다. 사람은 두 발로 걸어서 이동하고 새는 날아서 이동하지만 둘 다 '이동' 한다는 것은 다르지 않기 때문에 추상 클래스 Animal에서 추상 메소드 move()를 선언하여 Man과 Bird 클래스가 상속받아 클래스에 맞게 오버라이딩을 해 준 것입니다.

상속을 받으면 부모 클래스가 갖고 있는 추상 메소드를 반드시 오버라이딩 해야 합니다.

추상 클래스를 상속받은 클래스는 부모 클래스가 갖고 있는 추상 메소드를 받드시 오버라이딩 해야 합니다. 그렇지 않으면 위의 이미지 17번째 줄처럼 클래스명에 빨간줄이 생기면서 오류가 발생하는 것을 확인할 수 있습니다.

'Java > Java 객체 지향' 카테고리의 다른 글

[Java] DTO란?  (0) 2022.02.08
[Java] 자바 MySQL 연동  (0) 2021.05.13
[Java] 데이터 베이스를 연동한 DButil 클래스 만들기  (0) 2021.01.05
[Java] 인터페이스(Interface)  (0) 2020.12.28

+ Recent posts