추상클래스, 인터페이스

정병웅·2024년 2월 25일
0

자바

목록 보기
8/8

인프런의 김영한 강사님 강의를 듣고 스스로 정리하기 위해 작성한 글 입니다🤔

추상클래스

내 머릿속 정의 🧠

자바의 특징 중 하나인 다형성을 명시적으로 나타내기 위함이고, 제약을 걸기 위해서 생성된 추상적인 개념을 가지고 있는 클래스이다.

사전적 정의 📖

추상 클래스는 이름 그대로 추상적인 개념을 제공하는 클래스이다. 따라서 실체인 인스턴스가 존재하지 않는다. 대신에 상속을 목적으로 사용되고, 부모 클래스 역할을 담당한다.

사용 배경

자바에서 상속을 할 때, 추상 클래스를 일반 클래스로 생성 했을 경우 아래의 문제점들이 발생된다.
1. 추상 클래스는 말 그대로 추상적인 개념으로 생성된 클래스인데, 일반 클래스 처럼 인스턴스를 생성하면 의미 없는 생성이 된다.
2. 상속을 받는 자식 클래스에서 부모 클래스의 메서드를 오버라이딩 해서 사용해야하는데 개발자가 실수로 부모 클래스의 메서드를 사용할 수 있다.

추상 클래스 특징

위의 배경을 가지고 생겨나게된 추상 클래스의 특징은 아래와 같다.
1. 추상 클래스는 인스턴스 생성이 불가능 하다.
2. 상속 받은 자식 클래스는 추상 클래스의 메서드를 꼭 오버라이딩 해야한다.
3. 다중 상속상속이 불가능하다.
4. 추상 메서드가 있는 클래스는 무조건 추상 클래스로 선언 되어야한다.

클래스 생성 방법

public abstract class Animal {
    public abstract void sound();

    public abstract void move();
}

클래스 명 앞에 abstract 를 명시하면 된다.

메서드 생성 방법

접근 제어자와 리턴 타입 사이에 abstract 를 명시하면 된다.

추상 클래스 내부에는 일반 메서드는 정의 할 수 없나?
-> 아니다! 정의가 가능하다.

 public abstract class Animal {
    public abstract void sound();

    public abstract void move();

    public void status() {
        System.out.println("건강합니다.");
    }
}

위의 예시 처럼 추상 클래스이지만, 일반적인 메서드를 정의 할 수 있다.

상속 받는 클래스

Cat 클래스는 Animal 클래스를 상속 받는 클래스이다.

public class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("야옹");
    }

    @Override
    public void move() {
        System.out.println("고양이가 움직입니다.");
    }
}

인터페이스

내 머릿속 정의

다중 상속에서 다중 구현이 안되는 것과 코드 효율성을 증가 시키기 위해 추상클래스에서 보완 하여 나온 추상 클래스라고 생각한다. 😒

사전적 정의 📖

인터페이스(interface)란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미

사용 배경

추상 클래스 중에서 추상 메서드만 작성되어 있는 순수 추상 클래스라고 생각하면 된다. 이때 추상 클래스의 단점(?)인 다중 상속이 안되는 것을 보완 하며, 추상클래스를 선언할 때 작성되는 public abstract를 생략할 수 있어 효율적인 코드 작성이 가능하다.

인터페이스의 특징

  1. 다중 구현 가능
  2. public abstract 생략
  3. 구현을 담당하는 클래스에서는 모든 메서드를 오버라이딩 해야함

인터페이스 구현 방법

public interface Animal {
    void sound();
    void move();
}
  1. class 대신 interface 선언
  2. [return 타입 ][메서드명]

구현 클래스

Cat 클래스는 Animal을 구현하는 인스턴스이다.

public class Cat implements Animal {
    @Override
    public void sound() {
        System.out.println("야옹");
    }

    @Override
    public void move() {
        System.out.println("고양이가 움직입니다.");
    }
}

정리

추상 클래스와 인터페이스를 각각 어떨 때 사용해야하는걸까 🤔

내 생각에는 부모 클래스에서 모든 메서드가 자식 클래스에서 구현이 되어야할 경우에는 인터페이스를 사용하고, 부모 클래스에서 직접 사용해야하는 메서드가 하나라도 있을 경우에는 추상 클래스를 사용하는 것이 적절하다고 판단 된다.
자바 입장에서는 추상 클래스, 인터페이스 모두 상속 구조로 판단하기 때문이다.

profile
인생은 IT 노가다

0개의 댓글