∞. 기술 면접/7. 자바

10. 기술면접 - 자바 - 인터페이스와 추상 클래스 차이

THE HEYDAZE 2021. 10. 21. 12:47
공부목적으로 다른 블로그의 글을 그대로 따라치면서 작성되었습니다. 저작권 문제 시, 비공개 처리하겠습니다

공통점과 차이점
  추상 클래스 인터페이스
공통점 인스턴스(객체)를 생성 할 수 없다 (구현체가 필요하다는 말)
선언만 되어있고 구현 내용이 없다
자식 클래스가 메소드의 구체적인 동작을 구현하도록 책임을 위임한다
차이점 추상 클래스는 추상 메소드를 자식 클래스가
구체화하여 그 기능을 확장하는 데 목적이 있다
(상속을 위한 부모 클래스)
인터페이스는 서로 관련이 없는 클래스에서 공통적으로 
사용하는 방식이 필요하지만 기능을 구현할 필요가 있는
경우에 사용한다
클래스 o 클래스 x
단일 상속 (extends) 다중 상속  (implement)
is a kind of (일종의 라는 속한다는 개념에 가까움) can do this (이것은 무엇무엇을 할 수 있다에 가까움)

 

추상 메소드 (Abstract Method)

- abstract 키워드와 함께 원형만 선언되고, 코드는 작성되지 않은 메소드이다

public abstract String getName(); // 추상 메서드
public abstract String fail() { return "Fail"; } // 추상 메서드 아님. 컴파일 오류 발생

 

추상 클래스 (Abstract Class)

- 개념 : abstract 키워드로 선언된 클래스
    1. 추상 메소드를 최소 한 개 이상 가지고, abstract로 선언된 클래스
        i. 최소 한 개의 추상 메소드를 포함하는 경우 반드시 추상 클래스로 선언하여야 한다

/* 개념 i의 예시 */
abstract class Shape { // 추상 클래스
  Shape() {...}
  void edit() {...}
  abstract public void draw(); // 추상 메서드
}

    2. 추상 메소드가 없어도 abstract로 선언한 클래스
        ii. 그러나 추상 메소드가 하나도 없는 경우라도 추상클래스로 선언할 수 있다

/* 개념 ii의 예시 */
abstract class Shape { // 추상 클래스
  Shape() {...}
  void edit() {...}
}

- 추상클래스의 구현
    1. 서브클래스에서 슈퍼 클래스의 모든 추상 메소드를 오버라이딩 하여 실행 가능한 코드로 구현한다

- 추상클래스의 목적
    1. 객체(인스턴스)를 생성하기 위함이 아니며, 상속을 위한 부모 클래스로 활용하기 위한 것 이다.
    2. 여러 클래스들의 공통된 부분을 추상화(추상 메소드) 하여 상속받는 클래스에게 구현을 강제화하기 위한 것 이다
    3. 즉, 추상 클래스의 추상 메소드를 자식 클래스가 구체화하여 그 기능을 확장하는 데 목적이 있다

- 선언만 했기 때문에, 인스턴스로 생성될 수 없다
- 인스턴스로 만들기 위해서는 구현 클래스가 필요하다

 

예시
public  class AbstractTest {

    public static void main(String[] args) {

        Animal animal = new Pig();
        animal.setName("martin");

        System.out.println(
                ((Pig) animal).getName()
        );
    }
}

abstract class Animal {
     Long id;
     String name;

     public abstract void setName(String name);
}

class Pig extends Animal {

    public String getName() {
        return this.name;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }
}

추상 클래스에는 getName() 없기 때문에 다운 카스케이딩을 해주었다

 

인터페이스 (Interface)

- 개념: 추상메소드와 상수만을 사용함,  interface 키워드를 사용하여 선언
- 인터페이싀 구현
     1. 인터페이스를 상속받고, 추상 메소드를 모두 구현 한 클래스를 작성한다
     2. implements 키워드를 사용하여 구현한다

- 인터페이스의 목적
     1. 상속받을 서브 클래스에게 구현할 메소드들의 원형을 모두 알려주어, 클래스가 자신의 목적에 맞게 메소드를
       구현하도록 하는 것이다
     2. 구현 객체의 같은 동작을 보장하기 위한 목적이 있다
     3. 즉, 서로 관련이 없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 각각 구현할 필요가 있는 경우
        에 사용한다

- 인터페이스의 특징
    1. 인터페이스는 상수 필드와 추상 메소드만으로 구성된다
    2. 모든 메소드는 추상 메소드로서 pulbic abstract 속성이며 생략 가능하다
    3. 상수는 public static final 속성이 생략하여 선언할 수 있다

interface Animal {
    /** public static final 생략 */ String name = "defaultName";

    /** public abstract 생략 */ void setName(String name);
}


    4. 인터페이스를 상속받아 새로운 인터페이스를 만들 수 있다

interface Animal {
    /** public static final 생략 */ String name = "defaultName";

    /** public abstract 생략 */ void setName(String name);
}

/** 육지동물 */
interface LandAnimal extends Animal { }
/** 해양동물 */
interface MarineAnimals extends Animal { }

 

   5. default 키워드를 사용하면 인터페이스에서도 코드를 작성할 수 있다

interface Animal {
    /** public static final 생략 */ String name = "defaultName";

    /** public abstract 생략 */ void setName(String name);
    
    default void print() {
        System.out.println("Hello World");
    }
}

class AnimalImpl implements Animal {
    @Override
    public void setName(String name) {
        
    }
}