본문 바로가기
Programming/Java

인터페이스와 추상 클래스

by Tarake 2024. 8. 7.

인터페이스


public interface Car {
    void run();
    void stop();
    
    default void Klaxon() {
        System.out.println("클락션");
    }
}

class Volvo implements Car {
    @Override
    public void run() {
        System.out.println("달립니다.");
    }
    @Override
    public void stop() {
        System.out.println("멈춥니다.");
    }
    @Override
    public void Klaxon() {
        System.out.println("경적");
    }
}

class Main {
    public static void main(String[] args) {
        Car volvo = new Volvo();
        volvo.run();
        volvo.stop();
        volvo.Klaxon();
    }
}

자바 인터페이스는 객체 지향 프로그래밍에서 추상화의 한 형태로, 클래스가 구현해야 하는 메소드의 집합을 정의합니다. 인터페이스는 클래스의 행동을 규약하는 계약서와 같은 역할을 하며, 클래스 간의 관계를 유연하게 설계할 수 있도록 돕습니다.

 

인터페이스의 특징


  • 추상 메소드의 집합: 인터페이스는 기본적으로 구현되지 않은 메소드들의 집합입니다. 이러한 메소드들은 abstract 키워드를 사용하지 않아도 추상 메소드로 간주됩니다.
  • 다중 상속 지원: 자바에서 클래스는 단일 상속만 가능하지만, 인터페이스는 여러 개를 구현할 수 있습니다. 이를 통해 클래스는 다양한 행동을 가질 수 있습니다.
  • 기본 메소드 (Default Methods): Java 8부터 인터페이스는 default 키워드를 사용하여 기본 구현을 제공하는 메드를 정의할 수 있습니다.
  • 구체적인 구현이 없는 추상화: 인터페이스는 구현을 제공하지 않기 때문에, 이를 구현하는 클래스에서 인터페이스의 모든 메소드를 반드시 구현해야 합니다.

인터페이스 정의


public interface Car {
    void run();
    void stop();
    
    default void Klaxon() {
        System.out.println("클락션");
    }
}

인터페이스는 interface 키워드를 사용하여 정의됩니다. 인터페이스 내부의 모든 메소드는 기본적으로 public이며, 명시적으로 public 접근 제한자를 쓸 필요가 없습니다.

 

인터페이스 구현


class Volvo implements Car {
    @Override
    public void run() {
        System.out.println("달립니다.");
    }
    @Override
    public void stop() {
        System.out.println("멈춥니다.");
    }
    @Override
    public void Klaxon() {
        System.out.println("경적");
    }
}

클래스가 인터페이스를 구현할 때는 implements 키워드를 사용합니다. 클래스는 인터페이스에 정의된 모든 메소드를 구현해야 합니다.

 

기본 메소드 (Default Methods)


public interface Car {
    default void Klaxon() {
        System.out.println("클락션");
    }
}

class Volvo implements Car {
    @Override
    public void Klaxon() {
        System.out.println("경적");
    }
}

기본 메소드는 인터페이스에서 기본 구현을 제공할 수 있게 하며, 클래스가 해당 메소드를 반드시 재정의할 필요는 없습니다.

 

정적 메소드 (Static Methods)


// Car.java 파일
public interface Car {
    static void Klaxon() {
        System.out.println("클락션");
    }
}

// Main.java 파일
pubic class Main {
    public static void main(String[] args) {
        Car.Klaxon();
    }
}

정적 메소드는 인터페이스 자체에서 호출할 수 있으며, 특정 구현과 관련이 없는 유틸리티 메드로 사용할 수 있습니다.

 

다중 인터페이스 구현


public interface Runnable {
    void run();
}
public interface Stopable {
    void stop();
}

class Car implements Runnable, Stopable {
    @Override
    public void run() {
        System.out.println("Run");
    }
    
    @Override
    public void stop() {
        System.out.println("Stop");
    }
}

class Main {
    public static void main(String[] args) {
        Car car = new Car();
        car.run();
        car.stop();
    }
}

클래스 상속은 하나 이상의 클래스를 상속 받을 수 없습니다. 하지만 인터페이스의 경우에는 하나 이상의 인터페이스를 상속 받을 수 있습니다.

코드에서는 두 인터페이스를 구현하여 각각의 행동에 대한 메소드를 제공합니다. 인터페이스를 통해 다중 상속의 문제를 피하면서도 다양한 기능을 클래스에 부여할 수 있습니다.

 

인터페이스 상속


interface BlackTV {
    void print();
}
interface ColorTV extends BlackTV {
    void colorprint();
}
class TV implements ColorTV {
    @Override
    public void print() {
        System.out.println("흑백티비");
    }
    @Override
    public void colorprint() {
        System.out.println("컬러티비");
    }
}
class Main {
    public static void main(String[] args) {
        ColorTV ctv = new TV();
        ctv.colorprint();
    }
}

인터페이스는 기본적으로 클래스에서 규약에 중점을 두기위해 제작되었습니다. 그래서 인터페이스 끼리도 상속이 가능합니다. 주로 상속을 하는 이유는 기존 인테페이스에서 추가를 하고 싶은 기능이 존재할 때 기존 인터페이스에 기능을 추가하면 인터페이스 특성상 구현하는 클래스는 새로 생긴 기능을 구현해야하기 때문에 기존 코드에 문제가 생깁니다. 그래서 이러한 문제를 해결하기 위해 새로운 인터페이스를 생성하고 기존 인터페이스를 상속받는 식으로 해결하였습니다.

 

추상 클래스


abstract class Car {    // 추상 클래스
    private String name;
    
    public Car(String name) {
        this.name = name;
    }
    
    public abstract void run();    // 추상 메소드
    
    public void printName() {    // 미리 구현된 메소드
        System.out.println("Name is : " + name);
    }
}

class Volvo extends Car {
    public Volvo(String name) {
        super(name);
    }
    @Override
    public void run() {
        System.out.println("Run");
    }
}

class Main {
    public static void main(String[] args) {
        Car volvo = new Volvo("volvo");
        volvo.run();
        volvo.printName();
    }
}

자바에서 추상 클래스는 객체 지향 프로그래밍의 중요한 구성 요소로, 클래스와 인터페이스의 중간 역할을 합니다. 추상 클래스는 추상 메소드(구현되지 않은 메소드)와 구현된 메소드를 모두 가질 수 있으며, 이를 통해 공통적인 특성과 기능을 제공하면서도 구체적인 구현은 서브클래스에 위임할 수 있습니다.

 

추상 클래스의 특징


  • 추상 클래스 선언: abstract 키워드를 사용하여 선언됩니다. 추상 클래스를 직접 인스턴스화할 수 없습니다.
  • 추상 메소드 포함: 추상 메소드는 abstract 키워드를 사용하여 선언되며, 구현은 포함하지 않습니다. 추상 메소드는 반드시 서브클래스에서 구현해야 합니다.
  • 구현된 메소드 포함: 추상 클래스는 구현된 메소드도 가질 수 있어, 공통의 기능을 서브클래스에 제공할 수 있습니다. 상속의 기반: 추상 클래스는 다른 클래스에 의해 상속되어야 하며, 상속받은 클래스는 모든 추상 메소드를 구현해야 합니다.

 

추상 클래스 vs 인터페이스


추상 클래스와 인터페이스는 모두 추상화를 제공하지만, 사용 목적과 방식에서 몇 가지 차이점이 있습니다.

  • 다중 상속: 인터페이스는 다중 구현이 가능하지만, 추상 클래스는 단일 상속만 가능합니다.
  • 구현 제공: 추상 클래스는 상태(필드)와 구현된 메소드를 가질 수 있지만, 인터페이스는 상태를 가질 수 없습니다.
  • 사용 시점: 추상 클래스는 공통된 기본 구현과 상태를 여러 서브클래스에 제공할 때 유용하고, 인터페이스는 클래스 간의 계약을 정의하여 유연성을 높일 때 사용됩니다.
  • 기본 메소드: 인터페이스는 Java 8부터 default 메소드를 통해 일부 구현을 제공할 수 있지만, 이는 완전히 구현된 메소드를 갖는 추상 클래스만큼 유연하지 않습니다.

 

출처

W3school

 

W3Schools.com

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

'Programming > Java' 카테고리의 다른 글

래퍼 클래스  (0) 2024.08.09
메모리 모델과 Object 클래스  (0) 2024.08.08
자바 예외처리  (0) 2024.08.06
상속  (0) 2024.08.06
배열  (0) 2024.08.05