본문 바로가기
Languages/Java

[Java] 상속과 인터페이스 개념 정리

by 젊은오리 2023. 4. 10.
728x90

🤔상속(Inheritance)이란?

상속은 말 그대로 부모 자식 간의 상속을 의미한다. 부모 클래스를 상속 받는 다는 말의 뜻은, 부모 클래스의 클래스 변수, 메서드(private 불가), 를 재사용, 확장한다는 의미이다.

Java에서 상속을 사용한 간단한 예시를 보자.

  • Animal 클래스는 클래스 변수로 name필드를 갖고, move(), eat()메서드를 갖는다.
  • Cat은 Animal을 상속받고 있으며, move()메서드를 오버라이드하여 “x 만큼 뒤로 움직인다”로 재정의하였다.
class Animal{
    protected String name;

    public Animal(String name){
        this.name = name;
    }

    public void move(int x){
        System.out.println(x + "만큼 앞으로 움직인다.");
    }

    public void eat(String food){
        System.out.println(food + "를 먹는다.");
    }
}

class Cat extends Animal{

    public Cat(String name){
        super(name);
    }

    @Override
    public void move(int x){
        System.out.println(x + "만큼 뒤로 움직인다.");
    }
}

public class Main {
    public static void main(String[] args){
        Cat cat = new Cat("mycat");
        cat.move(5);
        cat.eat("fish");
    }
}
  • Main함수에서 Cat객체를 생성 후 move()메서드를 호출하면 Cat에서 재정의한 함수가 호출된다.
  • eat()메서드는 Animal 클래스에서 상속받은 것이므로 Cat 클래스에서 별도로 구현하지 않아도 사용이 가능하다.

 

🤔인터페이스란?

인터페이스는 객체의 행위의 추상화이다. 인터페이스는 객체가 무엇을 할 수 있는 지 설명할 뿐 아니라 객체가 특정한 형식을 따르게 강제할 수 있기 때문에 코드의 일관성과 유지 보수성을 높일 수 있다.

Java에서 인터페이스을 사용한 간단한 예시를 보자.

  • Swimmable이라는 인터페이스에 swim이라는 메서드를 통해 객체 행위를 추상화하였다.
  • A 클래스와 B 클래스는 Swimmable의 구현체로, swim메서드를 오버라이드하여 구현했다.
interface Swimmable {
    void swim();
}

class A implements Swimmable {

    @Override
    public void swim() {
        System.out.println("A can backstroke");
    }
}

class B implements Swimmable {

    @Override
    public void swim() {
        System.out.println("B can butterfly");
    }
}

public class Main {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        a.swim(); // A can backstroke
        b.swim(); // B can butterfly
    }
}

A, B 객체를 생성하여 swim()메서드를 각각 실행한 결과, 각 클래스의 메서드를 호출하는 것을 볼 수 있다.

따라서 인터페이스를 만들면, 인터페이스를 구현한 구현 클래스를 통해 각 클래스 특성에 맞게 행위를 구현할 수 있다.

 

※참고 - 추상클래스 vs 인터페이스

추상 클래스인터페이스는 모두 추상화를 통해 구현을 강제하는 방법이지만, 차이가 있다.

추상 클래스는 추상 메서드를 포함한 클래스로, 일반 클래스와 마찬가지로 객체의 상태와 동작을 가질 수 있다. 추상 클래스 안의 추상 메서드는 하위 클래스에서 반드시 구현해야 하지만, 일반 메서드는 반드시 구현할 필요가 없다. 반면에 인터페이스는 메서드와 상수만 가질 수 있으며, 구현 클래스에서 인터페이스에서 정의한 메서드를 반드시 구현해야 한다.

 

🤔상속과 인터페이스의 차이가 뭘까?

상속은 하나 클래스에 대해서만 가능하지만, 인터페이스는 다중 구현을 할 수 있다.

David에게 부모가 여럿일 수는 없지만 여러가지 행위를 할 수 있는 것처럼 말이다.

아래 예제를 살펴보자.

탈모 여부 클래스 변수를 갖는 Parents 클래스를 생성했다.

public class Parents {
    protected boolean hairLoss = true;

    public void display(){
        System.out.println("IM PARENT");
    }
}

Programer와 Driver 인터페이스는 각각 programming(), drive()메서드를 선언해 놓았다.

public interface Programer {
    void programming();
}
public interface Driver {
    void drive();
}

 

David는 Parents를 상속받았으며, Programer, Driver인터페이스의 구현체이다.

즉, David는 탈모(상속)이고, 프로그래밍을 할 수 있고, 운전을 할 수 있다.

public class David extends Parents implements Programer, Driver{

    public David(){
        if(this.hairLoss == true){
            System.out.println("I am hairloss..");
        }
    }
    
    @Override
    public void programming() {
        System.out.println("I can programming");
    }
    
    @Override
    public void drive() {
        System.out.println("I can drive");
    }
}

 

정리

상속 : 부모-자식 관계를 나타내며, 부모 클래스의 코드를 재사용하고 확장하는 방법

인터페이스 : 클래스가 따라야 할 규약을 정의하여 다형성을 구현하는 방법

상속과 인터페이스의 차이 

  •  상속의 경우 하위 클래스에서 부모 클래스의 메서드를 전부 오버라이드할 필요는 없지만 인터페이스의 경우 반드시 구현해야 한다.
  • 상속의 경우 단일 상속만이 가능하지만, 인터페이스는 다중 상속이 가능하다.
728x90

댓글