추상 클래스부터 설명해볼까?
추상 클래스는 실체 클래스에서 공통적인 부분만 가지고 선언한 클래스야.
부모와 자식 클래스에 꼭 필요한 부분인 변수와 메소드만을 가졌지만, 적어도 하나 이상 abstract, 즉 추상 메소드가 존재하고 있어.
예시를 들어볼까? 부모 클래스인 Mammalia(포유동물)은 자식 클래스인 Human, Dog, Lion을 가지고 있다고 가정하자.
포유동물은 성대를 가지고 있기에, 모두 울부짖을 수 있어. 그렇다면 이 공통점은 소리낸다 라는 공통적인 행동이 있어.
하지만 포유동물은 어떻게 소리를 내는 지 몰라, 그래도 우리의 목적을 달성해야만 해.
다행이도, 우리는 사람, 개, 사자가 모두 어떻게 소리를 내는 지 알고 있지.
그렇다면 Mammalia 클래스의 소리낸다 라는 메소드를 추상처리하고, Human, Dog, Lion 클래스는 각 각 '아', '왈 왈', '어흥' 이라는 기능을 각 각 오버라이딩하면 돼 !
이번엔 인터페이스를 설명해보자 !
인터페이스는 클래스들이 구현해야 하는 동작을 지정하는데 사용되는 추상 자료형이야.
인터페이스? 추상 클래스와 정말 비슷해, 인터페이스로 작성되는 대부분의 메소드는 추상 메소드이기 때문이야.
?? : 그렇다면 인터페이스랑 추상 클래스는 무슨 차이에요?
추상 클래스랑 비슷해, 다만 목적은 아주 약간 달라. 추상 클래스의 목적은 서브 클래스에서 구현할 수밖에 없는 기능만을 추상 메소드로 선언해 구현하려 하지만 인터페이스의 목적은 클래스의 목적에 따라 인터페이스의 모든 추상 메소드를 만들도록 하는 거야.
예시를 들어보자 !
인터페이스가 없다면 어떤 일이 실세계에서 펼쳐질까 ?
동일한 규격이 없어! A 공장은 볼트를 만들고, B 공장은 너트를 만들어도, 서로 사용할 수 없어. 규격이 맞지 않아 너트가 들어가지 않거나, 너무 커서 쉽게 빠져 버리게 될꺼야.
이 추상 클래스와 인터페이스는 서로 비슷하면서 다른 점도 많아.
추상 클래스와 인터페이스는 둘 다 객체를 생성할 수 없어. 그리고 상속을 위한 슈퍼 클래스로만 사용 가능해.
그리고 클래스의 다형성을 실현하기 위한 목적이지.
하지만 차이점도 있지. 추상 클래스는 추상 메소드와 일반 메소드 그리고 상수와 변수로 구성되었어.
인터페이스는 상수와 추상 메소드로 구성되어있지만 default 메소드, static 메소드도 구현 가능해. 여기서 니가 꼭 기억해야할 내용은 이거야.
추상 클래스는 단일 상속이지만 인터페이스는 다중 상속이 가능하다는 점, 꼭 기억해야해!!!
내가 이번 추상 클래스와 인터페이스를 공부하면서 이런 고민을 하게 되었어.
나는 어떤 상황일 때, 추상화를 사용하고, 인터페이스를 사용하지?
내 생각은 이래, 부모 클래스와 가까운 클래스에는 인터페이스 구현은 선택사항인 것 같아.
추상 메소드를 인터페이스로 하든, 추상 클래스로 하든 큰 상관은 없으니깐.
하지만 부모 클래스와 먼 자식 클래스 사이에서는 인터페이스를 사용할꺼야.
예를 들어보자. 부모 클래스 통신 장비에서 여러 자식 클래스를 거쳤다는 가정을 하자. 통신 장비와는 먼 무전기와 스마트폰이라는 자식 객체가 있을 때, 무전기와 스마트폰의 공통점은 통신하다() 라는 메소드 뿐이야. 하지만 무전기도 와이파이를 사용했으면 좋겠고, 스마트폰은 위성통신을 할 수 있었으면 좋겠다고 생각이 든다면. 인터페이스를 통해 와이파이(), 위성통신()을 스마트폰과 무전기에 주입할 수 있겠지.