자바(JAVA) 기초 함께 알아보자

자바(JAVA) 기초 함께 알아보자(25) - 다중 상속 / 인터페이스(Interface)

jay_the_code 2025. 2. 9. 16:02

지난번 다형성(Polymorphism)에 이어서

이번글에서는 인터페이스(Interface)에 대해서

알아보겠습니다.

 

기초 단계에서 인터페이스를 완벽하게 이해하는

것은 어렵다고 생각합니다.

 

따라서 개념 자체로 인터페이스를 이해하기보다는

인터페이스의 역할과 예시들을 통해서

조금 더 직관적으로 인터페이스에 대해서

알아보겠습니다.

다중상속

 

자바에서는 최근에 들어서 다중상속을 지원하지만

이전 버전의 자바들에서는 다중상속을 지원하고 있지

않습니다.

 

다중상속이란 간단하게 말하면 하나의 클래스가

여러 부모를 가지는 것을 말합니다.

 

아래 그림을 살펴보겠습니다.

 

 

자바에서 다중상속을 지원하지 않았던 이유는

위와 같은 구조에서 'CAMERA'와 'RECORDER' 클래스

모두 DEVICE로부터 A라는 메소드를 override 하였다고

가정합니다.

 

이때 SMARTPHONE 클래스에서 A라는 메소드를

override할 경우 이 메소드가 CAMERA로부터 상속받은 것인지

RECORDER로부터 상속받은 것인지 알 수 없는 상황

발생하기 때문에 자바에서 다중상속을 지원하지 않았습니다.

 

다중상속의 이점은 살리면서 클래스를 이용한 다중상속의

문제점들을 없애기 위해 인터페이스(Interface)라는 개념을

사용하여 자바에서 다중상속을 구현합니다. 

 

인터페이스(Interface)의 경우 추상메소드의 선언만 하기 때문에

클래스를 사용한 다중상속과 달리 출처의 모호성 문제가

발생하지 않습니다.

인터페이스 (Interface)

 

이제 인터페이스의 선언과 사용방법에 대해서

알아보겠습니다.

class University{
	int memberId;
    
    University(int memberId){
    	this.memberId = memberId;
    }
}

interface Credit{
	int showCredit();
}

interface Authorize{
	boolean check(int id, String pwd);
}

// University 클래스를 상속받고
// Credit, Authorize 인터페이스들을 상속받음
class Student extends University implements Credit, Authorize{
	String major;
    int credit;
    String password;
    
    Student(int memberId, String password, String major){
    	super(memberId);
        this.password = password;
        this.major = major;
        this.credit = 24;
    }
    
    // Credit 인터페이스로부터 Override
    @Override
    public int showCredit(){
    	return this.credit;
    }
    
    // Authorize 인터페이스로부터 Override
    @Override
    public boolean check(int id, String pwd){
    	if( id == memberId ){
        	if( pwd == password ){
            	return true;
            }else{
            	return false;
            }
        }else{
        	return false;
        }
    }
}

 

먼저 인터페이스를 선언하는 법에

대해서 알아보겠습니다.

 

인터페이스는

' interface 인터페이스명 { 추상메소드 } '

와 같은 방식으로 선언합니다.

 

그리고 인터페이스를 상속할 때는

' implements '라는 키워드를 사용합니다.

 

위에서 보이는 것과 같이 한 클래스가

다양한 인터페이스를 상속받는 것이

가능합니다.

 

이때 주의할 점은 상속받은 메소드의

접근제어자는 항상 public으로 유지하여야

한다는 것입니다.

 

그렇지 않으면 자바 컴파일러에서

에러가 발생하게 됩니다.

 

또 한 가지 주의해야 할 점은

만약 인터페이스 안에 여러 가지 메소드가 있고

어떠한 클래스가 그 인터페이스를 상속받는다면

선언된 모든 메소드를 override 하여야 합니다.

 

그 이유는 위 코드에서는 보이지 않지만

인터페이스 안의 모든 상수는 ' public static final '

그리고 추상메서드는 ' abstract public ' 으로

자동으로 지정되기 때문입니다.

 

인터페이스를 상속받은 여러 가지 클래스들을

하나의 인터페이스 타입으로 다룰 수 있기

때문에 인터페이스를 사용하면 코드의 확장성

커집니다.

 

이전글에서 살펴본 것과 같이

https://jaythecode.tistory.com/24

 

자바(JAVA) 기초 함께 알아보자(24) - 다형성(Polymorphism)

지난번 함수 오버로딩(Method overloading)에 이어서이번글에서는 다형성(Polymorphism)에 대해서알아보겠습니다. 다형성(Polymorphism)이라는 개념을처음 접하신 분들이라면단어자체만으로는 어떠한 의미

jaythecode.tistory.com

 

다른 클래스를 상속하는 인스턴스 일지라도

같은 인터페이스를 상속하고 있다면

instanceof 키워드를 통해 하나로 묶어서

처리하는 것 또한 가능합니다.

 

이처럼 인터페이스를 사용하면

클래스의 설계에 있어서

상당한 이점을 가지게 됩니다.

 

인터페이스는 눈으로 봐서는 이해하고

사용하기 어려운 개념이라고 생각합니다.

 

다양한 예제를 만들어봄으로써 직접 몸으로

익혀놓으면 이후 코드의 설계에 상당한

도움이 되리라 생각됩니다.

 

다음 글에서는 추상 클래스 / 추상 메소드(abstract)에 대해서

알아보겠습니다.