Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

인터페이스의 장점 본문

Java/객체지향

인터페이스의 장점

빌드이너프 2023. 6. 16. 15:43

인터페이스의 장점

두 대상(객체) 간의 연결, 대화, 소통을 돕는 중간 역할을 한다

선언(설계)와 구현을 분리시킬 수 있게 한다

개발 시간을 단축할 수 있다

표준화가 가능하다(JDBC)

서로 관계없는 클래스들의 관계를 맺어줄 수 있다

 

인터페이스 덕분에 B가 변경되어도 A는 안바꿀 수 있게 된다(느슨한 결합)

A클래스의 변경 불필요, 인터페이스만 변경해주면됨 -> 변경에 유리

 

B의 method()를 추상메서드로 갖는 인터페이스 작성

(점선은 B를 C로 변경)

 

강한 결합

class A {
    public void method(B b) {
        b.method();
    }
}

class B {
    public void method() {
        System.out.println("B클래스의 메서드");
    }
}


public class InterfaceTest {
    public static void main(String[] args) {
        A a = new A();
        a.method(new B()); // A가 B를 사용(A가 B에 의존하고 있다)
    }
}

B클래스의 메서드

 

만약 C라는 클래스가 생길경우 A 클래스와 main메서드를 바꿔야한다

(중요)A 클래스: public void method(B b) -> public void method(C b)

main 메서드: a.method(new B()); -> a.method(new C());

class A {
    public void method(C b) { // public void method(B b) {
        b.method();
    }
}

class B {
    public void method() {
        System.out.println("B클래스의 메서드");
    }
}

class C {
    public void method() {
        System.out.println("C클래스의 메서드");
    }
}


public class InterfaceTest {
    public static void main(String[] args) {
        A a = new A();
        a.method(new C()); // a.method(new B());
    }
}

C클래스의 메서드

 

인스턴스 사용 후

class A {
    // public void method(C c) {
    public void method(I i) { // 인터페이스 I를 구현한 것들만 가능하게 함
        i.method();
    }
}

// B 클래스의 선언과 구현을 분리
interface I {
    public void method();
}


class B implements I {
    public void method() {
        System.out.println("B클래스의 메서드");
    }
}

class C implements I {
    public void method() {
        System.out.println("C클래스의 메서드");
    }
}


public class InterfaceTest {
    public static void main(String[] args) {
        A a = new A();
        a.method(new C()); // a.method(new B());
    }
}

C클래스의 메서드

 

 

 

서로 관계없는 클래스들의 관계를 맺어줄 수 있다

오버로딩(같은이름 메서드)

문제점: GroundUnit에 SCV, Tank는 가능하지만, Marine는 들어가면 안되지만 들어갈 수도 있다,

            또한 Dropship도 GroundUnit의 자손이 아니기 때문에 불가능하다

void repair (Tank t) {
    
}

void repair (Dropship d) {

}

void repair (GroundUnit gu) {

}

인터페이스 다형성 사용

Repairable이라는 인터페이스를 만들어 SCV, Tank, Dripship에 부여한다

interface Reapirable {}

class SCV extends GroundUnit implements Repairable {
    // ...
}

class Tank extends GroundUnit implements Repairable {
    // ...
}

class Dripship extends AirUnit implements Repairable {
    // ...
}

 

인터페이스 구현한 것들만 가능

void repair(Repairable r) { // 매개변수: Repairable
    if (r instanceof Unit) {
        Unit u = (Unit) r;
        while(u.hitPoint != u.MAX_UP) {
            u.hitPoint++;
        }
    }
}

'Java > 객체지향' 카테고리의 다른 글

객체지향언어 정리  (0) 2023.10.22
default 메서드와 static 메서드  (0) 2023.06.16
인터페이스를 이용한 다형성  (0) 2023.06.15
인터페이스의 선언, 상속, 구현  (0) 2023.06.15
추상클래스의 작성  (0) 2023.06.14