우선, 객체지향 설계원칙(SOLID) 중에서 OCP를 생각해보자.
클래스 안에 메소드각 한개라도 추상메소드가 있다면 해당 클래스는 반드시 abstract 클래스로 표기 되어야 하며 abstract와 final은 동시 표기 불가하다.
일반적인 메소드도 있을 수 있고 추상 메소드가 있을 수도 있다.
추상 클래스도 인터페이스처럼 추상 클래스가 아닌 클래스에서 상속을 받는다면 추상 메소드가 있을 경우 모두 구현해줘야 한다. 물론 추상클래스에서 추상 클래스를 상속 받는다면 모두 구현하지 않아도 된다.
추상클래스는 생성자를 가질 수 있다.
추상클래스는 인스턴스를 만들 수 없지만 추상 클래스를 상속받은 클래스를 통하면 인스턴스화가 가능하다.
extens를 사용해서 상속 받으며 추상 클래스의 궁극적인 목적은 상속을 위함이다.
인터페이스에 새로운 메소드를 추가한다고 하고 그 아래에 인터페이스로부터 상속되는 클래스가 있다면 새로운 메소드에 대한 내용을 반드시 구현해야 한다. 인터페이스 안의 모든 메소드들은 추상 메소드이다.
인터페이스는 final을 붙일 수 없고 인터페이스 변수들은 static이어야 한다.
즉, 인터페이스는 일반 변수를 가질 수 없다.
인터페이스는 생성자를 가질 수 없다.
인터페이스는 인스턴스를 만들 수 없지만 인터페이스를 구현한 클래스를 통해 인스턴스화가 가능하다.
접근 지정자가 아예 없거나 public 이거나 아님 abstract만 가능하다!
다른 클래스에선 implements를 통해 구현한다.
하나 이상의 인터페이스를 상속할 수 있다.
추상 클래스는 객체의 추상적인 상위 개념으로 공통된 개념을 표현할 때 쓴다.
공통된 속성을 동물이라는 추상 클래스에 추상 메소드로 구현하여 하위 개념인 말이라는 객체에 상속시켜 구현하면 객체의 재사용성과 객체를 표현하는 것이 더 명확해진다.
인터페이스는 구성 요소들이 자주 바뀔 때 쓰면 유용하다!
메소드 형태만 서로 공유해서 구현(재정의)되는 상황일 때 사용하는 것이 좋다!
즉, 공통된 메소드(객체 행위)로 만들어 사용하고 싶을 때 인터페이스를 이용하면 효과적이다.
동시 개발이 가능하므로 시간 단축이 많이 된다.
인터페이스 안의 메소드들은 내용이 없는 상태이나 메소드에 대한 결과값은 내용을 만들지 않아도 미리 알수 있기에 인터페이스의 내용을 누군가가 구현하고 있는 동안 다른 한 사람은 그 메소드가 구현되고 나면 작동할 결과 값으로 같은 시간에 다른 일을 할 수 있기에 개발 작업이 빨라진다.
여러 사람이 인터페이스를 통해 그런 작업을 동시에 한다고 했을 때, 인터페이스 안의 메소드 내용을 변경하더라도 그를 구현한 모든 클래스들을 변경할 필요 없이 해당 메소드의 구현되는 내용만 변경하면 모든 처리가 가능해지는 "높은 응집도와 낮은 결합도"를 해결할 수 있따.
서로 관련성이 없는 클래스들이 인터페이스를 구현하게 되는 경우에 사용한다.
Ex) Comparable, Cloneable 인터페이스는 여러 클래스들에서 구현 되는데, 구현 클래스들 간 관련성이 없는 경우가 대부분이다!
특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지 신경쓰고 싶지 않는 경우!
다중 상속을 허용하고 싶은 경우! (정확히는 다중 구현)
템플릿 메소드 패턴에서 왜 인터페이스가 아닌 추상클래스를 써야할까?
여기를 보자!
좋은 글 감사합니다~