1. 상속(extend)
extends(상속) : 이는 '상속'을 의미합니다. '상속'이란 기존의 클래스를 재사용하여 새로운 클래스를 생성하는 개념입니다. 즉, 부모 클래스의 특성과 메서드를 자식 클래스가 물려받는 것을 말합니다. 'extend'는 이러한 상속 관계를 구현할 때 사용됩니다. 이를 통해 코드의 재사용성을 높이고, 코드의 중복을 줄일 수 있습니다. 또한, 상속 관계를 통해 클래스 간의 계층적인 관계를 표현할 수 있습니다.
예를 들면, '동물'이라는 클래스가 있고, 그 내부에 '먹는다', '달린다'라는 메서드가 있다고 가정해보자.
이제 '사자'라는 새로운 클래스를 만들려고 하는데, '사자' 역시 '먹는다', '달린다' 라는 행동을 할 수 있다. 이럴 때 '사자' 클래스를 '동물' 클래스로부터 상속을 받아 생성하게 되면, '동물' 클래스의 메서드를 다시 작성할 필요 없이 사용이 가능하다.
class 동물 {
void 먹는다() {...}
void 달린다() {...}
}
class 사자 extends 동물 {
// '먹는다', '달린다' 메서드를 상속받음
}
2. 인터페이스(interface)
implements (인터페이스 구현) : 'implements' 키워드는 인터페이스를 클래스에서 구현할 때 사용됩니다. 인터페이스는 일종의 계약이며, 클래스가 특정 인터페이스를 구현한다는 것은 인터페이스가 제공하는 메서드를 반드시 구현한다는 의미입니다. 클래스에서 인터페이스를 구현하기 위해서는 인터페이스에서 정의된 모든 메서드를 클래스에서 재정의해야 합니다.
예를 들면, '비행 가능'이라는 인터페이스가 있고, 그 안에 '날다'라는 메서드가 정의되어 있다고 한다. '새'라는 클래스에서 이 인터페이스를 구현하면, '새' 클래스에서는 '날다'라는 메서드를 만드시 구현해주어야 한다고 한다.
interface 비행가능 {
void 날다();
}
class 새 implements 비행가능 {
// '날다' 메서드를 반드시 구현해야 함
public void 날다() {...}
}
2-1. 인터페이스를 사용하는 이유?
메서드를 다시 꼭 구현해야한다면 굳이 interface를 왜 쓰는지 의문이 들었다.
쉽게 말하면 , 상속은 'is-a'(A는 B이다) 라고 이해하면 편하고, 인터페이스는 'has-a'(A는 B를 가지고 있다)로 보면 좋을 것 같다.
예를 들면, '차' 클래스를 상속받은 '전기차' 클래스는 '차'이며, '비행 가능' 인터페이스를 구현한 '비행기' 클래스는 '비행 가능'한 기능을 가지고 있다. 따라서, 메서드를 반드시 구현해야 하는 이유는 클래스가 특정 기능을 보장하도록 하기 위함이다. 이는 클래스의 사용자가 해당 클래스가 어떤 동작을 할 것이라는 것을 확인할 수 있게 해준다고 한다.
내가 의문을 가졌던건 그때 그때 메서드를 구현해야하면 굳이 인터페이스를 쓸 이유가 있나였는데, 인터페이스는 특정한 메서드를 반드시 구현하도록 강제하는 역할을 해주기 때문에 '비행가능' 인터페이스에 '날다'라는 메서드가 정의되어 있다면, 이 인터페이스를 구현하는 클래스는 반드시 '날다'라는 메서드를 구현해주어야만 한다고 한다. 이때 '날다'라는 메서드가 정의되어 있음에도 구현하지 않게되면 컴파일 에러가 발생하게 된다. 이와같이 인터페이스를 통해 강제성을 부여함으로, 클래스가 특정한 동작을 보장하도록 할 수 있다. 이는 코드의 안정성을 높이고, 다른 개발자가 해당 클래스를 사용할 때도 어떤 메서드를 제공하는지 명확하게 알 수 있게 해준다.
협업 : 여러 개발자가 함께 작업할 때, 각자가 작업하는 부분이 서로 다를 수 있습니다. 이때 인터페이스를 미리 정의해두면, 개발자들이 인터페이스에 정의된 메서드를 구현하면서 일관된 코드를 작성할 수 있습니다. 즉, 인터페이스는 개발자들 사이의 '계약'과 같은 역할을 합니다.
오류 방지 : 인터페이스를 구현하는 클래스는 인터페이스에 정의된 모든 메서드를 구현해야 합니다. 이를 통해 개발 과정에서 누락되는 메서드 없이 안정적인 코드를 작성할 수 있습니다. 또한, 인터페이스를 통해 클래스의 예상 가능한 동작을 명시적으로 나타내므로, 다른 개발자가 해당 클래스를 사용할 때도 오류를 줄일 수 있습니다.
따라서, 인터페이스는 협업 환경에서 코드의 일관성을 유지하고, 오류를 방지하는 데 큰 도움이 됩니다.
3. 결론
extends는 클래스 간의 상속을 통해 코드의 재사용성을 높이고, implement는 인터페이스를 통해 클래스의 행동을 명시적으로 나타낼 수 있다. 이를 통해 객체 지향 프로그래밍에서 유연하고 확장 가능한 코드를 작성할 수 있다고 한다. 여전히 이론적인 공부를 하고 있다보니 extend, implement 같은 것들을 사용할 때 왜지 뭐지? 라고만 생각하고 넘어갔었는데 이렇게 찾아놓고 보니 100%는 당연히 아니겠지만 궁금증이 어느 정도 해소가 되었다. 코드 재사용성은 백을 하던 프론트를 하던 참 중요한 것 같다😅
걱정되는 부분은 내가 활용을 잘 할 수 있을까...? 라는 생각이 정말 많이 든다. 3달을 내내 붙잡고 있다보니 이제 흐름...?은 알겠는데 나보고 코드를 짜서 구현하라고 하면 손도 대지 못할 것 같은 느낌... 얼른 부족한 부분을 채워서 게시판이든 뭐든 무한 반복하면서 손에 익혀야할 것 같다🔥🔥
'Framework > Spring' 카테고리의 다른 글
ERD 그게 뭔데 날 힘들게 해 (1) | 2024.01.13 |
---|---|
스프링 프레임워크와 스프링 부트 (0) | 2024.01.03 |
VScode와 intelliJ 사용할 때 로그 처리 방식이 왜 다를까? (0) | 2023.12.30 |
Gradle이 Maven 대신에 많이 사용되는 이유는 뭘까? (0) | 2023.12.21 |
트랜잭션(Transaction)이 뭐지? (0) | 2023.12.07 |
쓰임 있는 사람이 되기 위해 노력 중입니다.