본문 바로가기
개발자 전향 프로젝트

[Java] 상속이란? + Interface가 뭐고 그거 왜 쓰는건데?

by 샘오리 2022. 3. 19.

자바에서 가장 중요한 개념이라고 할 수 있는 것이 상속인데
상속이란 문자 그대로 부모에게 무언가를 물려받는 것이다.
우리가 흔히 알고있는 금수저가 좋은 예시가 될 수 있을 것이다.

금수저는 태어날 때부터 금으로된 수저를 물고 태어났다고 해서 붙여진 이름인데
부모가 가진 모든~것을 자식이 갖기에
자식은 본인이 기존 소유하고 있는 것 + 부모의 것을 소유하게 된다.

그리고 상속을 하기 위해서는 extends라는 키워드를 꼭 써줘야 한다.
Extend라는 키워드의 뜻은 확장하다, 손 따위를 뻗치다 라는 뜻으로 부모클래스가 더 넓고 포괄적인 개념이고
자식클래스가 좀더 세부적인 디테일을 다룰 때 쓰는데
부모의 것을 사용하기 위해서 extends라는 키워드를 쓰는 것이다.

ex) 자식클래스 extends 부모클래스
삼성노트북 extends 노트북

그러나 때로는 부모의 것을 그대로 사용하지 않고 그 껍데기는 유지하되 그 알맹이는 입맛에 맞게
변경하고 싶을 때가 있을 수 있다. 이럴 때 쓰는 키워드가 @Override이다.

Override의 뜻은 기존의 것을 새로운 것으로 덮어버려서 기존의 것을 무용지물로 만들다라는 뜻이다.
마치 기존에 있는 그림에 새로운 것을 그리기 위해 흰 페인트로 덮어버리는 것과 같은 원리이다.

자 그러면 상속은 알겠다. 그럼 Interface는 무엇이고 이는 왜 쓰는것인가?
인터페이스는 그 자체로 아무것도 못하는 빈껍데기인 틀이다. 주로 개발쪽에서 높은 사람이 프로젝트를 설계하고 그 틀을 인터페이스에 녹여서 뿌려주는데 그 프로젝트에 참여하는 모든 개발자들이 이 틀을 마치 매뉴얼처럼 가지고 그 틀에 맞게 각자 할당된 작업을 하는 것이다.

인터페이스를 사용하기 위해 필요한 키워드는 implements이다.
Implement란 구현한다는 뜻으로 클래스 이름 뒤에 implements를 적어주고 인터페이스 이름을 적어주면 된다.
implements 키워드를 적게 되면 반드시 인터페이스에 적어둔 메서드를 불러온 클래스에서 구현해줘야 한다.

근데 좀 복잡해보이는 이 인터페이스를 왜 쓰는지가 궁금할 것이다. 인터페이스를 사용하게 되면 다음과 같은 장점이 있다.

1. 협업 용이
혼자 하는 프로젝트라면 몰라도 한 프로젝트에 무수히 많은 인원이 참여하는데 사전에 메서드 이름을 통일하는 어떤 계획없이 각자 개성에 맞게 메서드를 다 다르게 생성했다고 생각해보자. 엄청난 혼돈이 예상 된다. 이를 미연에 방지하기 위해 각자 클래스는 만들되 그 클래스에 사용되는 메서드의 기본 틀은 인터페이스에 적어두고 그 인터페이스를 가져다씀으로써 모두가 동일한 메서드 이름으로 클래스를 작성할 수 있고 자칫 생길 수 있는 혼돈을 방지할 수 있다.

프로젝트의 절반은 구상이다

2. 교체 용이
인스턴스는 항상 고정이기 때문에 실행메서드에서 호출할 때 그 인터페이스를 구현한 클래스를 다른 클래스로 쉽게 변경할 수 있다. 다른 클래스로 변경해서 사용하고 싶을 때 new 뒤에 있는 생성자(클래스이름)만 변경해주면 된다.
ex) Car car = new Audi(); ------------> Car car = new Bmw();

그렇다면 상속과 인터페이스의 구현이 얼핏 비슷한 개념인 것 같은데
둘중 뭐를 써야 할까? 둘다 적절하게 사용하면 된다.
하지만 결합도와 유연성만 놓고 보면 인터페이스가 좀 더 좋은 방법이다.

상속을 통해 다형성을 제공하면 자식클래스와 부모클래스는 강하게 결합되게 된다. 부모클래스를 상속받은 자식클래스에서는 부모클래스의 모든 메서드를 그대로 사용할 수 있기에 원치않은 메서드들도 상속되기 때문에 의도치 않은 버그도 발생시킬 수 있다. ( 남이 그려둔 그림 가져와서 배경으로 두고 몇개 추가하는 정도. )

인터페이스는 반면에 그냥 틀(그림 그릴 때 색칠하기 전에 연필로 가볍게 그려둔 밑그림 정도)이기에 가져다 구현한다 하더라도 큰 영향을 끼치지 않는다. 고로 결합도가 높지 않고 상속보다는 더 유연하다고 할 수 있다.

간단한 밑그림 == 인터페이스