추상 클래스 vs 인터페이스의 차이

백엔ㄷ현·2024년 10월 7일
1

추상 클래스와 인터페이스의 차이점

  • 인터페이스

    • 클래스가 아니며, 클래스와 관련이 없다.

    • 추상 메소드와 상수만을 멤버로 가진다.

    • 한 개의 클래스가 여러 인터페이스를 구현할 수 있다. (다중 구현 가능.)

    • Java 8부터 default 메소드가 추가되었다.

      • default 키워드가 붙은 메소드는 구현할 수 있으며(일반 메소드처럼), 자식 클래스에서는 이를 오버라이딩할 수 있다.
      • 인터페이스가 변경되면 이를 구현하는 모든 클래스들이 해당 메소드를 다시 구현해야하는 번거로운 문제가 있었다. 이런 문제를 해결하기 위하여 인터페이스에 메소드를 구현할 수 있도록 변경되었다.
    • Java 8부터 static 메소드가 추가되었다.

      • 인터페이스에 static 메소드를 선언 가능하게 함으로써, 간단한 기능을 가지는 유틸리티성 인터페이스를 만들 수 있게 되었다.
    • 목적 : 구현 객체의 같은 동작을 보장하기 위해 사용한다.

    public interface Animal {
    	public static final String name = "동물";
      
      	public abstract void move();
      	public abstract void eat();
      	public abstract void bark();
    }

    인터페이스에는 static, final 로 생성할 수 있는 상수와 abstract 로 생성할 수 있는 추상 메서드만 가질 수 있다.

    public class Dog implements Animal {
    	
      @Override
      public void move() {
      	System.out.println("슥슥~~");
      }
      
      @Override
      public void bark() {
      	System.out.println("멍멍!");
      }
    }

    Dog 클래스를 생성한다. Animal 인터페이스를 implements 키워드로 구현하고 인터페이스의 추상 메소드들을 모두 재정의 한다.

     public class Cat implements Animal{
    
        @Override
        public void move() {
            System.out.println("사뿐사뿐~~");
        }
    
        @Override
        public void bark() {
            System.out.println("야옹~~");
        }
    }

    Cat 클래스를 생성한다. 마찬가지로 인터페이스의 추상 메서드들을 오버라이드 한다.

    public class Main {
      public static void main(String[] args) {
          Dog dog = new Dog();
          Cat cat = new Cat();
          
          dog.move();
          dog.bark();
          
          cat.move();
          cat.bark();
      }
    }

  • 추상 클래스

    • 클래스이며, 클래스와 관련이 있다. (주로 베이스 클래스로 사용)

    • 추상 메소드 및 일반 메소드와 멤버도 포함할 수 있다.

    • 한 개의 클래스가 여러 개의 클래스를 상속받을 수 없다. (다중 상속 불가능.)

    • 상속을 받아 기능을 확장시키는 데 목적이 있다.

    • 목적 : 기존의 클래스에서 공통된 부분을 추상화하여 상속하는 클래스에게 구현을 강제화한다. 메소드의 동작은 구현하는 자식 클래스로 위임한다.

    • 공유의 목적.

    package org.example.abstractexam;
    
    public abstract class Animal {
    
        String name;
        int age;
    
        public Animal(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public void move(){
            System.out.println("이동한다");
        }
    
        public void eat(){
            System.out.println("먹는다");
        }
    
        public abstract void bark();
    }

    추상 클래스도 일반 클래스와 마찬가지로 필드, 생성자, 메소드를 선언할 수 있으며 자식 객체가 생성될 때 super 를 호출하므로 생성자는 반드시 있어야 한다. 그리고 추상 클래스를 작성하다보면 선언만 하고 상속받는 자식 클래스에서 메소드를 재정의하여 사용하여야 하는 경우들이 있다. 예를 들면 Animal 클래스의 bark() 메소드이다.
    동물마다 짖는 소리는 모두 다르기때문에 이런 경우에는 추상 메소드로 생성을 하는 방법이 좋다. 추상 메소드는 자식 클래스에서 오버라이드를 강제할 수 있기 때문이다.

    package org.example.abstractexam;
    
    public class Dog extends Animal{
    
        public Dog(String name, int age) {
            super(name, age);
        }
    
        @Override
        public void bark() { //메서드 오버라이딩
            System.out.println("멍멍!!");
        };
    }
    

    Dog 클래스를 생성한다. 여기서 bark 는 추상메소드로 생성이 되어 있기 때문에 이곳에서 재정의한다.

    package org.example.abstractexam;
    
    public class Cat extends Animal{
        public Cat(String name, int age) {
            super(name, age);
        }
    
        @Override
        public void bark() { //메서드 오버라이딩
            System.out.println("야옹~~");
        };
    }

    Cat 클래스를 생성한다. 마찬가지로 추상메소드 bark 를 이곳에서 오버라이드 한다.

    package org.example.abstractexam;
    
    public class Main {
        public static void main(String[] args) {
            Dog dog = new Dog("강아지", 3);
            Cat cat = new Cat("고양이",3);
    
            dog.move();
            dog.bark();
    
            cat.move();
            cat.bark();
        }
    }

추상 클래스와 인터페이스의 차이점

추상 클래스(Abstract Class)인터페이스(Interface)
상속하여 공통된 기능을 만들고, 확장하기 위함구현하는 객체들이 같은 동작을 보장하기 위함
다중상속 불가능다중상속 가능
생성자와 일반변수 모두 가질 수 있다.생성자와 일반변수를 가질 수 없다.
메서드를 부분적으로 구현할 수 있다.메서드 선언만 가능하다.
extends 키워드를 사용한다.implements 키워드를 사용한다.
profile
매일매일 공부한 내용과 코드 기록하겠습니다

0개의 댓글