인터페이스와 추상 클래스

leehyunjon·2022년 12월 17일
0

Java

목록 보기
7/7

자바의 중요한 개념인 OOP의 특징에서 추상화에 대해 알아보기 위해 남궁성님의 자바의 정석 중 객체지향에 대해 학습하고 정리해보겠습니다.


추상화

추상화란 공통적으로 사용되는 속성과 기능을 추출하여 정의하는 것입니다.

참새와 독수리는 둘다 날개를 가지고 있고 날 수 있습니다. 하지만 참새는 노래를 부를수 있고, 독수리는 사냥을 할수 있는 차이가 있습니다.
참새와 독수리의 공통 속성인 날개와 비행을 추출하여 새라고 추상화 할 수 있습니다.
추상화한 새를 기준으로 보았을때 참새와 독수리는 각각 구체화 하였다고 할 수 있습니다.

추상화의 장점

  • 구체적인것보다 명확하지 않기 때문에 변화에 유연
    • 새 종류에 펭귄를 추가할때 새만 상속받아서 구현하면 됩니다.
    • public class Pengine extends Bird{
      	@Override
          public void fly(){
          	System.out.println("펭귄은 못 날아ㅠ");
          }
      }
  • 조건에 따라 다형성을 이용하여 유연하게 사용
    • Bird를 상속받는 Sparrow와 Egle을 Bird로 통일하여 사용해줄 수 있습니다.
    • class Zoo{
      	List<Bird> cage = new ArrayList<>();
          
      	void goHome(){
          	Tiger tiger = new Tiger();
              Bird sparrow = new Sparrow();
              Bird egle = new Egle();
              
              goCage(sparrow);
              goCage(egle);
              goCage(tiger);	//(에러)호랑이는 새장에 못들어갑니다.
          }
          
          void goCage(Bird bird){
          	cage.add(bird):
          }
      }
    • 다형성을 이용해 추상화된 Bird만 사용가능하도록 할 수 있습니다.

그렇다면 추상화를 하기 위해 알아야할 추상클래스와 인터페이스에서 대해 알아보겠습니다.


추상클래스

추상 클래스란, 일반 클래스에 추상 메서드를 가지고 있는 클래스입니다.

추상 클래스는 추상메서드를 구현해야하는 것도 있지만, 상속을 통해 구체화 하고 추상 클래스를 통해 일반화 하여 다형성을 제공하기 위한 목적으로 사용됩니다.

추상 메서드란, 정의만 되어있고 구현이 되어있지 않은 메서드를 말합니다.

클래스에서 추상 클래스를 나타낼때는 접근 제어자 앞에 abstract로 나타냅니다.
추상 메서드를 나타낼때도 접근 제어자 앞에 abstract로 나타냅니다.

추상 클래스는 단 하나의 추상 메서드를 가지고 있다면 추상 클래스가 됩니다.

//추상 클래스
abstract public class Bird{
	Wing wing;
    
    //추상 메서드
    abstract void fly();
    
    public Bird(Wing wing){
    	this.wing = wing;
    }
}

추상 클래스의 특징

  • 인스턴스 생성 불가능
    • 추상 메서드를 구현하지 않으면 인스턴스에서 메서드를 사용할 수 없기 때문입니다.
  • 다중 상속 불가능
    • 다이아몬드 문제라고 해서 다중 상속시 동일한 메서드를 부모 클래스에서 가지고 있다면, 어떤 메서드를 호출해야하는지 모르기 때문에 문제가 발생합니다.
  • 자식 클래스가 추상 클래스를 상속받았을때, 추상 메서드를 구현하지 않으면 자식 클래스도 추상클래스

인터페이스

인터페이스란, 공통으로 구현해야하는 기능을 정의한 추상 메서드의 집합입니다.

인터페이스를 구현체가 인터페이스에 정의되어있는 추상 메서드의 구현을 강제하여 동일한 동작을 수행하기 위한 목적으로 사용됩니다.

인터페이스는 interface로 정의하고 추상메서드와 상수만 사용이 가능합니다.
(default method, static method도 사용가능하지만, 인터페이스와 추상클래스 차이를 중점으로 하기 위해 논외로 하겠습니다.)

인터페이스의 추상메서드를 구현하기 위해서는 implements를 선언하여 인터페이스의 추상 메서드를 구현해줍니다. (강제, 필수)

interface Flyable{
	void goHigh();
}

class Sparrow extends Bird implements Flyable{
	@Override
    public void fly(){
    	System.out.println("푸드덕 푸드덕");
    }

	@Override
    public void goHigh(){
    	System.out.println("난다 날아~");
    }
}

인터페이스 특징

  • 모든 멤버 변수는 public
    • 추상 메서드는 반드시 구현되어야 하기 때문에 참조가 가능하기 위해 public이다.
  • public과 abstract 생략 가능
    • 인터페이스의 멤버변수는 항상 public이고 추상 메서드만 선언이 가능하기 때문에 public과 abstract가 생략이 가능합니다.
  • 다중 상속 가능
    • 부모 인터페이스가 가지고 있는 추상 메서드는 정의만 되어있고 구현이 되어있지 않기 때문에 부모 인터페이스가 동일한 메서드를 가지고 있어도 자식 클래스에서는 해당 메서드를 구현해야하기 때문에 문제가 발생하지 않습니다.
  • 인터페이스로 타입 사용 가능
    • 구현한 인터페이스 타입으로 존재가 가능합니다. 하지만 해당 인터페이스가 정의한 메서드만 사용이 가능합니다.

인터페이스 장점

두 객체간의 '연결, 대화, 소통'을 돕는 중간자 역할을 합니다.

  • 컴퓨터와 하드웨어를 연결시켜 사용자가 사용할 수 있도록 해주는 GUI가 있습니다.

변경에 유리합니다 (표준화).

  • JPA라는 ORM을 위한 인터페이스 집합을 이용하여 구현체인 Hibernate가 변경이 되어도 일관성 있는 코드로 서비스를 제공해줄 수 있습니다.
  • JDBC를 통해 데이터베이스와 연동하는 방법이 인터페이스로 표준화 되어있기 때문에, 일관성 있는 코드로 다른 데이터베이스와 통신할 수 있게 해줍니다.

선언과 구현를 분리시킬 수 있습니다.

  • interface : 선언부
  • class : 구현부
//선언부
interface Food{
	void tasty();
}

//구현부
class Noodle implements Food{
	@Override
    void tasty(){
    	System.out.println("맛있다!");
    }
}

개발시간을 단축 시킬 수 있습니다.

  • 의존하는 객체에서 의존하려는 객체가 만들어질때까지 기다리는 것이 아닌, 인터페이스에 의존하여 인터페이스에 정의되어있는 메서드를 참조하고 그 후에 의존하려는 객체를 인스턴스에 정의된것에 따라 구현하여 시간을 단축 시킬수 있습니다.
interface Cookable{
	void cook();
}

public class Chef{
	void cook(Cookable cookable){
    	Food food = cookable.cook();
        ...
    }
}

//나중에 구현
public class Pasta implements Cookable{
	@Override
    public void cook(){
    	...
    }
}
  • Chef는 파라미터로 cook을 호출하여 비즈니스 로직을 구현해야합니다.
    하지만 실질적으로 요리할수 있는 파라미터를 설계되어야 코드에 적용할 수 있습니다.
    인터페이스를 통해 수행할 수 있는 추상 메서드를 먼저 선언함으로써, 클래스를 먼저 설계하지않아도 코드를 구현할 수 있게 됩니다.

관계없는 클래스끼리 맺어줄 수 있습니다.

  • 비행기는 기계이고 참새는 동물이고 서로 관계없는 클래스입니다.
    하지만 서로 날수 있다는 공통점을 가지고 있기 때문에 Flyable이라는 인터페이스를 통해 추상화하여 두 클래스를 맺어줄 수 있게 됩니다.

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

추상클래스와 인터페이스 둘 다 추상 메서드를 포함하고 있어 추상 메서드 구현을 강제하게됩니다.
추상 클래스와 인터페이스는 추상 메서드 구현이라는 공통점을 가지고 있고 추상 클래스는 다중 상속이 불가능하고, 인터페이스는 다중상속이 가능하다는 차이점으로 인해 인터페이스가 다중 상속을 못하는 추상 클래스의 해결책이라고 오해할 수도 있습니다.

하지만 추상 클래스와 인터페이스는 뚜렷한 목적을 가지고 사용되기 때문에 사용의 목적과 용도에 따라 사용됩니다.

추상클래스는 일반 클래스에서 추상 메서드를 포함하고 있는 클래스로써, 상속을 통해 구체화하여 확장하는것을 목적으로 사용됩니다.

인터페이스는 상수와 추상 메서드를 포함하고 있어 공통된 기능을 수행하여 표준화를 만들기 위한 목적으로 사용됩니다.

클래스는 캡슐화된 클래스를 상속함으로써, 클래스의 의미를 더 구체화하고 확장합니다. 추상 클래스는 이 클래스의 확장을 위해 자식 클래스들이 가지는 공통된 속성을 추출하여 정의함으로써 코드의 중복을 줄이고 공통된 특성을 쉽게 파악할 수 있게 해줍니다.

Animal은 Bird와 Mammal로 구체화하여 확장할 수 있습니다. 또 Bird는 Sparrow, Egle, Penguin으로 더 구체화하여 확장할 수 있습니다. 마찬가지로 Mammal도 더 구체화하여 Human, Dog, Cat등으로 확장해 나갈 수 있습니다.

인터페이스는 특정 클래스들의 공통된 속성을 표준화함으로써, 각 클래스들의 공통점을 만들어 주고 동일한 행동을 하게 만들어 줄 수 있습니다.

공통점

  • 인스턴스 생성 불가능
  • 추상 메서드 정의
  • 상속을 통한 확장 가능

차이점

  • 추상 클래스
    • 다중 상속 불가능
    • 멤버변수, 생성자 포함
  • 인터페이스
    • 다중 상속 가능
    • 상수, 추상 메서드만 포함

Reference

https://www.youtube.com/watch?v=CXuA31XcBZ0&list=PLW2UjW795-f5JPTsYHGAawAck9cQRw5TD

https://wildeveloperetrain.tistory.com/112

https://myjamong.tistory.com/150

profile
내 꿈은 좋은 개발자

0개의 댓글