개발 한번 해블로그
[Java] 21. 추상클래스와 인터페이스의 두둥등장 본문
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)
'Java' 카테고리의 다른 글
[Java] 22. 자바 최상위 포식자 클래스 Object (0) | 2023.12.20 |
---|---|
[Java] 20. 다형성과 활용 (0) | 2023.12.20 |
[Java] 19. 객체 형 변환(feat. 캐스팅) (2) | 2023.12.20 |
[Java] 18. 상속관계에서 객체 생성 및 Override (2) | 2023.12.20 |
[Java] 17. 자바의 상속(Feat. 김탄&최영도) (0) | 2023.12.20 |