본문 바로가기
프로그래밍/JAVA

[JAVA] Java TPC 강의 정리 (PART 2) - 추상클래스/인터페이스

by 소소로드 2020. 9. 20.

  • 1. 추상클래스
    (1) 추상클래스 사용의 이유
    (2) 추상클래스의 구현
  • 2. 인터페이스
    (1) 인터페이스 사용의 이유
    (2) 인터페이스의 구현
    (3) 다중 상속
  • 3. 추상클래스와 인터페이스의 공통점 / 차이점

1. 추상클래스

(1) 추상클래스 사용의 이유

public void eat() { 
    System.out.println("동물은 먹는다");
}
해당 코드는 부모의 클래스에 존재하지만 자식이 재정의를 해서 사용 용도가 크지않은 eat() 메서드이다.

이 부모를 확장한 자식클래스인 Dog, Cat에서 
만약 재정의를 하게 되면 System.out.println("동물은 먹는다"); 이 부분은
출력을 하지 않게 된다. 각자 같은 부분에 대한 재정의를 하기 때문이다.
그럼 저 부분(eat()의 바디부분)은 사실상 있어도 필요가 없는 내용이 된다.

저 부분을 없애버리고 추상클래스로 만들어버리면 어떨까

public abstract void eat();
불완전한 메서드인 추상클래스로 구현

코드가 훨씬 깔끔해졌다.
그렇다면 왜 추상클래스로 만들까?
다형성은 보장하고 싶어서 상속관계를 만들었고,
자식이 반드시 부모의 메서드를 구현해서 재정의를 해야만 하는 상황에서 만든다.
또한, 공통적인 부분을 묶어서 의미를 확장할 때 사용한다.
즉, 추상클래스는 '상속'의 개념이 크기 때문에 부모의 어떤 메서드를 자식이 받아 구현한다는 의미가 강하다.

(2) 추상클래스의 구현

1
2
3
4
5
6
7
8
9
10
11
public class Animal { // 변경전
    public void eat() {
        System.out.println("동물은 먹는다.");
    }
}
 
public abstract class Animal { // 변경후
    public abstract void eat(); 

// public void move() {
// System.out.println("무리를 지어다닌다.")
// }
}
 
cs

변경전의 군더더기 내용을 추상클래스를 통해 간결하게 만들었다는 것이 핵심이다.
또한 추상클래스라 하더라도 완전한 메서드 move()도 함께 존재할 수 있다.
abstract된 메서드는 반드시 자식 클래스에서 재정의, 오버라이드해야 한다.


2. 인터페이스

(1) 인터페이스 사용의 이유
추상클래스같은 경우 부모에 어떤 기능이 있고, 자식들은 똑같은 기능을 물려받아 그 내용을 확장한다.
그러나 인터페이스는 상속의 개념보다, 빈 껍데기를 구현한다는 의미에 가깝다.

(2) 인터페이스의 구현

1
2
3
4
5
6
7
public interface Remocon {
 
    public void chUp();
    public void chDown();
    public void internet(); 
 
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class TV implements Remocon {
 
    @Override
    public void chUp() {
        System.out.println("TV 채널업");
    } 
    public void chDown() {
        System.out.println("TV 채널다운");
    }
    public void internet() {
        System.out.println("TV는 인터넷이 된다.");
    }
 
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Radio implements Remocon {
 
    @Override
    public void chUp() {
        System.out.println("Radio 채널업");
    } 
    public void chDown() {
        System.out.println("Radio 채널다운");
    }
    public void internet() {
        System.out.println("Radio는 인터넷이 되지 않는다");
    }
 
}
cs

(3) 다중 상속

추상클래스는 다중 상속을 지원하지 않고,
인터페이스는 다중 상속이 가능하다는 차이가 있는데 이는 이런 그림으로 표현된다.
Animal은 부모이고, Dog는 자식이다.
동시에 Dog는 Pet인터페이스와 Robots인터페이스를 구현하는 다중 상속관계에 있다.

이를 코드로 표현하면

public class Dog extends Animal implements Pet, Robots{ }

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

공통점
1. 다형성(상위의 모습을 하위에서 기능을 구현)을 보장하기 위해 등장했다.
2. 객체를 생성할 수 없다.(new X)
3. 하위클래스에서 구현되어야하므로 재정의는 필수
4. upcasting으로 객체를 생성해야 한다.

차이점
[추상클래스]
1. extends, 부모-자식관계에서 확장의 개념
2. 서로 기능이 비슷한 클래스의 공통부분을 묶을 때 사용
3. 구현 메서드 / 추상 메서드를 함께 가질 수 있다.
4. 단일 상속만 가능하다.

[인터페이스]
1. implements, 껍데기를 구현한다는 개념
2. 서로 기능이 다른 클래스의 공통부분을 묶을 때 사용
3. 구현 메서드를 가질 수 없다.
4. 다중 상속 형태를 지원한다. => 여러 상위클래스의 기능을 물려받음
5. final static 멤버 변수를 가질 수 있다.

- 무슨 말인지는 어느 정도 알겠는데, 나에게 아직 개념이 모호하다.
  현업에서 과연 두 개의 효용을 정확히 알고 쓸 수 있을까