Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

개발 한번 해블로그

[Java] 21. 추상클래스와 인터페이스의 두둥등장 본문

Java

[Java] 21. 추상클래스와 인터페이스의 두둥등장

hide on bush 2023. 12. 20. 11:50

1. 다형성을 보장한다는 의미는 무엇인가?

  • 상위클래스가 명령을 내리면 하위클래스가 반드시 동작(반응)을 해야 한다.
  • 오버라이드를 하지 않으면 다형성이 보장 안된다
    • 다형성을 보장하려면?
      • 다형성 전제 조건(상속, 오버라이드, 업캐스팅, 동적 바인딩)
      • 반드시 재정의가 되어야 한다
      • 상위클래스를 추상 클래스로 만든다
  • 추상 클래스는 메서드의 구현부가 없는 것, 반드시 하위 클래스가 완전하게 오버라이드
public abstract class Animal02 {
    public abstract void eat(); //추상메서드(불완전 메서드) : 메서드의 구현부가 없음
public class Dog02 extends Animal02 {  //추상메서드
    // 재정의를 안함 -> 에러
    // 재정의를 해야함 -> 바디를 만들어야함
    public void eat(){
        System.out.println("개처럼 먹다");
    }

}
public class Cat02 extends Animal02 {
    public void night(){
        System.out.println("밤에 눈에서 빛이 난다");
    }

    @Override
    public void eat() {
        System.out.println("고양이처럼 먹다");
    }
}

2. 추상클래스와 다형성

<추상클래스란?>

  • 다형성을 일부 보장하기 위해서 등장
  • 서로 비슷한 클래스의 공통 부분을 묶을 때 사용
  • 단독으로 객체 생성 X
    • ex) Animal ani=new Animal();
  •  업캐스팅 사용
    • Animal ani=new Dog();
  • 구현된 메서드를 가질 수 있다
    • ex) public void move(){System.out.println(“무리를 지어 이동한다”)}
public abstract class Animal02 {
    public abstract void eat(); //추상메서드(불완전 메서드) : 메서드의 구현부가 없음
    public void move(){
        System.out.println("무리를 지어서 다닌다"); //구현메서드(재정의 안해도됨)
    }
}
public class Cat02 extends Animal02 {
    public void night(){
        System.out.println("밤에 눈에서 빛이 난다");
    }

    @Override
    public void eat() {
        System.out.println("고양이처럼 먹다");
    }
}
public class Dog02 extends Animal02 {  //추상메서드
    // 재정의를 안함 -> 에러
    // 재정의를 해야함 -> 바디를 만들어야함
    public void eat(){
        System.out.println("개처럼 먹다");
    }

}
import fc.java.poly.Animal02;
import fc.java.poly.Cat02;
import fc.java.poly.Dog02;

public class AbstractTest02 {
    public static void main(String[] args) {
        //추상 클래스는 단독으로 객체를 생성할 수 없다
        Animal02 ani=new Dog02();
        ani.eat();
        ani.move();

        ani=new Cat02();
        ani.eat();
        ani.move();
        ((Cat02)ani).night();
    }
}

3. 인터페이스의 등장

<인터페이스란?(추상메서드+final static 상수)>

  • 다형성을 보장하기 위함
  • 서로 다른 클래스의 공통부분을 묶을 때 사용
  • 단독으로 객체를 생성할 수 없음(RemoCon r=new RemoCon(); XX)
  • 부모의 역할로 사용(업캐스팅, RemoCon r=new Radio();)
  • 추상메서드와 fianl static 상수만 올 수 있음
  • 구현된 메서드를 가질 수 없다
  • 예를 들어, 라디오와 TV가 있는데 둘 다 채널 U/D, 볼륨 U/D 비슷한 부분을 추상메서드로 쓸 수 있지만 구현 메서드에 인터넷이 된다를 추가하면 라디오에는 해당하지 않으므로 추상클래스를 쓰기는 어려움. 즉, 재정의를 하게 만들어서 다형성을 보장할 수는 있지만 구현 클래스를 가질 수 있어서 하위 클래스가 오동작 할 수 있다(서로 다른 동작을 가지는 클래스라서)
public abstract Remocon_03_1 {
    public abstract chUp();
    public abstract chDown();
    public abstract volUp();
    public abstract volDown();
    public abstract internet(){
    	System.out.println("인터넷이 된다");
    }
}
public class Radio_03_1 implements Remocon_03_1 {
    @Override
    public void chUp() {
        System.out.println("Radio의 채널이 올라간다");
    }

    @Override
    public void chDown() {
        System.out.println("Radio의 채널이 내려간다");
    }

    @Override
    public void volUp() {
        System.out.println("Radio의 볼륨이 올라간다");
    }

    @Override
    public void volDown() {
        System.out.println("Radio의 볼륨이 내려간다");
    }

    @Override
    public void internet() {
        System.out.println("Radio에서는 인터넷이 안됨");
    }
}
public class TV_03_1 implements Remocon_03_1 {

    @Override
    public void chUp() {
        System.out.println("TV 채널이 올라간다");
    }

    @Override
    public void chDown() {
        System.out.println("TV 채널이 내려간다");
    }

    @Override
    public void volUp() {
        System.out.println("TV 볼륨이 올라간다");
    }

    @Override
    public void volDown() {
        System.out.println("TV 볼륨이 내려간다");
    }

    @Override
    public void internet() {
        System.out.println("TV에서는 인터넷이 된다");
    }
}
import fc.java.poly.Radio_03_1;
import fc.java.poly.Remocon_03_1;
import fc.java.poly.TV_03_1;

public class interfacetest_03_1 {
    public static void main(String[] args) {
        //리모콘으로 라디오와 TV를 동작시켜보자
        Remocon_03_1 remo=new Radio_03_1();
        remo.chUp();
        remo.chDown();
        remo.volUp();
        remo.volDown();
        remo.internet(); //오동작

        remo=new TV_03_1();
        remo.chUp();
        remo.chDown();
        remo.volUp();
        remo.volDown();
        remo.internet();
    }

}

→ 이 코드는 잘못된거임. 우리는 Radio에서 인터넷을 출력하면 안됨. 그래서 인터페이스를 사용해야함(Interface-implements)
- 인터페이스에서 사용하는 final static 상수(예를 들어 채널을 1~99까지만 적용할 때)


4. 인터페이스와 다중상속

- 자바는 단일상속임. 다만, 인터페이스가 다중상속을 지원

- dog는 Animal 클래스를 상속받고, pet, rovots 인터페이스를 구현

public class dog extends Animal implements Pet,Robots{}
Animal r=new Dog();

Pet r=new Dog();

Robots r=new Dog();

 

- 인터페이스가 인터페이스를 상속

A=인터페이스, B=인터페이스, C

public interface B extends A{}

public class C implements B{}


5. 추상 클래스와 인터페이스의 공통점과 차이점

1) 공통점

  • 다형성을 보장하기 위해서 등장
  • 추상 메서드를 가질 수 있음
  • 단독으로 객체 생성 불가
  • 업캐스팅(부모의 역할)

 

2) 차이점

  • 서로 비슷한 클래스의 공통 부분을 묶을 때 사용 : 추상 클래스
    • 추상 메서드 + 구현 메서드
  • 서로 다른 클래스의 공통 부분을 묶을 때 사용 : 인터페이스
    • 추상 메서드 + final static 상수

※ 추상메서드(abstract, extends), 인터페이스(interface, implements)