Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java)에서 인터페이스와 클래스의 차이점 완벽 정리

클래스(Class)란?

클래스는 개별 객체를 생성하기 위한 설계도(blueprint)입니다. 클래스 내부에는 다음과 같은 유형의 변수들을 포함할 수 있습니다.

  • 지역 변수(Local variables) – 메서드, 생성자 또는 블록 안에서 정의되는 변수입니다. 지역 변수는 해당 메서드 내에서 선언되고 초기화되며, 메서드의 실행이 끝나면 함께 소멸합니다.
  • 인스턴스 변수(Instance variables) – 클래스 내부에 있지만 어떤 메서드에도 속하지 않는 변수입니다. 인스턴스 변수는 클래스가 인스턴스화될 때 초기화되며, 해당 클래스의 모든 메서드, 생성자, 블록 안에서 접근할 수 있습니다.
  • 클래스 변수(Class variables) – 클래스 내부에 선언되되, 메서드 밖에서 static 키워드와 함께 선언된 변수입니다.

인터페이스(Interface)란?

인터페이스는 자바의 참조 타입(reference type) 중 하나로, 클래스와 유사하지만 추상 메서드들의 집합이라는 점이 다릅니다. 클래스가 인터페이스를 구현(implements)하면 해당 인터페이스가 가진 추상 메서드들을 물려받게 됩니다.

추상 메서드 외에도 인터페이스는 상수(constants), 디폴트 메서드(default methods), 정적 메서드(static methods), 중첩 타입(nested types)을 포함할 수 있습니다. 단, 메서드 본문(body)은 디폴트 메서드와 정적 메서드에만 존재합니다.

인터페이스를 작성하는 방식은 클래스를 작성하는 것과 비슷하지만, 그 목적이 다릅니다. 클래스는 객체의 속성과 동작을 기술하는 반면, 인터페이스는 클래스가 구현해야 할 동작(behavior)을 정의합니다.

클래스와 인터페이스의 주요 차이점

번호구분클래스(Class)인터페이스(Interface)
1지원하는 메서드추상 메서드와 구체(concrete) 메서드를 모두 가질 수 있습니다.기본적으로 추상 메서드만 가질 수 있습니다. 단, Java 8부터는 디폴트 메서드와 정적 메서드도 허용됩니다.
2다중 상속다중 상속을 지원하지 않습니다.다중 상속을 지원합니다.
3지원하는 변수final, non-final, static, non-static 변수를 모두 사용할 수 있습니다.static이면서 final인 변수만 허용됩니다.
4구현 방식클래스는 인터페이스를 구현할 수 있습니다.인터페이스는 다른 인터페이스를 구현할 수 없으며, 확장(extend)만 가능합니다.
5선언 키워드class 키워드로 선언합니다.interface 키워드로 선언합니다.
6상속 대상extends 키워드로 다른 클래스를 상속받고, 인터페이스를 구현할 수 있습니다.인터페이스는 오직 인터페이스만 상속받을 수 있습니다.
7상속/구현 키워드extends 키워드를 통해 상속됩니다.implements 키워드를 통해서만 구현됩니다.
8접근 제어private, public 등 다양한 접근 제한자를 가진 멤버를 가질 수 있습니다.public 멤버만 가질 수 있습니다.
9생성자생성자(constructor)를 가질 수 있습니다.생성자를 가질 수 없습니다.

클래스 vs 인터페이스 예제 코드

아래 예제는 인터페이스를 정의하고 이를 클래스가 구현하는 기본적인 방법을 보여줍니다.

JavaTester.java

public class JavaTester {
    public static void main(String args[]) {
        Animal tiger = new Tiger();
        tiger.eat();
        Tiger tiger1 = new Tiger();
        tiger1.eat();
    }
}
interface Animal {
    public void eat();
}
class Tiger implements Animal {
    public void eat(){
        System.out.println("Tiger eats");
    }
}

실행 결과

Tiger eats
Tiger eats

위 코드에서 Tiger 클래스는 Animal 인터페이스를 구현하여 eat() 메서드의 실제 동작을 정의합니다. 덕분에 Animal 타입의 참조 변수로도 Tiger 객체를 다룰 수 있으며, 이것이 인터페이스가 제공하는 다형성(polymorphism)의 핵심 장점입니다.