상속은 객체지향 프로그래밍에서 하위 클래스가 상위 클래스의 특성을 물려 받는 개념이다. 다시 말해 특성이라고 하면 상위 클래스의 멤버 변수와 메서드를 하위 클래스에서도 사용할 수 있도록 하는 것이죠!!!후훗
🫡이렇게 함으로써 코드의 재사용성을 높이고, 코드의 중복을 줄이는 효과가 있다.
예를 들면, 포켓몬으로 예를 들어보자. 포켓몬은 보통 최종형태까지 2단계가 필요하다. 꼬부기는 최하위 클래스이다. 어니부기, 거북왕까지의 속성과 메서드를 가질 수 있다. 꼬부기 extends 어니부기(어니부기 extends 거북왕) 을 했다면 꼬부기는 거북왕이 가지고 있는 속성과 기술(기능)을 가지고 있다. 물 속성이라는 점, 또 물대포와 같은 기본 기술을 가지고 있다는 점이다.(여기서 거북왕만이 쓸 수 있는 기술들은 Private을 제한 한 걸로 설정) 또한 거북왕이 가지고 있는 속성과 메서드를 그대로 물려 받아 사용할 수 있지만, 추가적으로 속성과 메서드를 정의할 수 있다(물 뿌리기 같은 기술을 배움. 거북왕은 그 기술이 없는 상태가 default).
또 상속을 받은 꼬부기는
이렇게 하면 거북왕이 가지고 있는 기본 속성과 기술들을 꼬부기가 또 저장할 필요가 없어 코드의 재사용성을 높일 수 있고, 코드의 중복을 줄이는 효과를 가진다고 볼 수 있다.
🎯상속을 오용할 경우, 하위 클래스들이 상위 클래스의 내부 구현에 의존성을 가지게 될 가능성이 있고, 그렇게 될 경우 상속 관계가 복잡해지면서 코드의 유지보수가 어려워질 수 있다.
먼저 인터페이스란 일종의 계약서라고 생각할 수 있다. 인터페이스는 어떤 클래스가 반드시 구현해야 하는 메소드들의 목록을 정의하고, 이를 구현한 클래스는 반드시 그 인터페이스에서 정의한 메소드들을 모두 구현 해야 한다. 덕분에 인터페이스를 사용하여 여러 개의 클래스에서 동일한 메소드를 사용할 수 있다. 만약 인터페이스를 구현 하는 클래스가 인터페이스의 모든 메서드들을 구현 하지 않는다면, 그 클래스는 추상 클래스로 인터페이스를 구현해야 한다. 추상 클래스가 싫다면 새로운 인터페이스를 만들어 이 인터페이스에 기능을 추가하자!!
🍄만약 기존 인터페이스에 추가하게 된다면 이 인터페이스를 구현 하고 있는 많은 클래스들은 새로운 기능을 구현해야 한다. 그렇기 때문에 새로운 인터페이스로 이용하자!
그러면 인터페이스는 클래스가 구현해야 하는 메서드의 집합이고, 인터페이스를 구현하는 클래스가 인터페이스에 정의된 모든 메서드를 구현한다면, 클래스 간에 일관성 있는 메서드 사용이 가능해지고, 다형성을 구현할 수 있을 것이다. 하지만 인터페이스는 클래스의 상속과는 달리, 기존 클래스를 수정하지 않고도 새로운 기능을 추가할 수 있다는 장점이 있다.
이렇게 보면 비슷한 목적을 가지고 있지만, 상속은 클래스의 확장과 기존 코드의 재사용을 위해 사용되고, 인터페이스는 다형성과 일관성 있는 메서드 사용을 위해 사용되는 걸 알 수 있다.
다음은 다형성에 대해 알아보자!!!