Coupling
서로 다른 두 클래스가 서로의 영향을 긴밀하게 받을 때 이 두 객체를 Couple이라고 부른다.
이러한 구조는 한 쪽이 변경되었을 때 다른 쪽에서 에러가 발생할 수 있기 때문에 지양해야 한다.
(운좋게 에러가 발생하지 않는다고 해도 한 쪽을 변경하면 다른 쪽도 다시 컴파일해야 하기 때문에 번거로운 건 마찬가지이다.)
최대한 객체가 서로에게 의존적이지 않은 코드를 "Loosely coupled code"라고 하며 이러한 코드를 지향해야 한다.
Interface
Java에서 이러한 Coupling 문제를 해결(혹은 완화)할 수 있는 방법이 바로 Interface이다.
C++에서는 추상 클래스를 통해 어느 정도 비슷하게 구현할 수 있다.
(Java에는 추상 클래스와 인터페이스의 개념이 둘 다 존재한다!)
쉽게 말해 뼈대만 갖추어진 객체(java에서는 interface)를 만들어 놓고
해당 객체를 상속(java에서는 Implement)해 하위 클래스를 만드는 것인데,
이렇게 코드를 짜면 두 객체의 상호의존성을 낮춤으로서 coupling 문제를 완화할 수 있다.
ex.
// Java program to illustrate
// tight coupling concept
class Subject {
Topic t = new Topic();
public void startReading()
{
t.understand();
}
}
class Topic {
public void understand()
{
System.out.println("Tight coupling concept");
}
}
// Java program to illustrate
// loose coupling concept
public interface Topic
{
void understand();
}
class Topic1 implements Topic {
public void understand()
{
System.out.println("Got it");
}
} class Topic2 implements Topic {
public void understand()
{
System.out.println("understand");
}
} public class Subject {
public static void main(String[] args)
{
Topic t = new Topic1();
t.understand();
}
}
<Java 예시>
Chef 라는 Interface를 만들고 해당 Interface에 makeFood()라는 메소드를 정의한다.
(인터페이스이기 때문에 makeFood()의 메소드 내의 세부적인 몸체는 정의하지 않는다.
애초에 정의하려고 하면 컴파일 에러가 발생한다.)
GordonRamsay라는 class를 만들고 Chef 인터페이스를 implement한다.
GordonRamsay 클래스 내에서 makeFood()메소드를 오버라이딩한다.
<C++ 예시>
Chef 라는 추상 클래스를 만들고 해당 추상 클래스에 makeFood()라는 virtual 메소드를 정의한 후 = 0으로 초기화한다.
GordonRamsay라는 클래스를 만들고 Chef 클래스를 상속받는다.
GordomRamsy 클래스 내에서 makeFood()메소드를 오버라이딩한다.
왜 Java는 클래스라는 개념과 인터페이스라는 개념을 분리할까?
->
Java는 C++와 다르게 다중 클래스 상속을 지원하지 않기 때문이다.
Java는 이를 보완하기 위해 다중 인터페이스 상속을 지원한다.
Java에서 Interface implementation(인터페이스 사용)과 class extension(클래스 상속)의 차이점은?
->
인터페이스를 implement하는 건 "기능을 추가한다"라는 느낌에 더 가깝고
클래스를 extend하는 건 "클래스를 확장한다"라는 느낌에 더 가깝다.
이 둘의 가장 큰 차이점은,
1. 여러 인터페이스를 implement할 수는 있어도 여러 클래스를 extend(상속)할 수는 없다.
2. 인터페이스를 implement했다면 무조건 오버라이딩 해야 한다. 반면 클래스는 오버라이딩을 강요하지 않으며, 심지어 부모 클래스의 메소드를 가져다 쓸 수도 있다.
'lang > java' 카테고리의 다른 글
나만의 Java 레퍼런스 (0) | 2021.03.21 |
---|---|
[Java] Package란? (0) | 2021.01.09 |