1. 추상화 (Abstract)


# 추상화란, 물체의 주된 부분만 부각시키는 것을 의미한다. 


  



1) 추상 메서드 

- 선언부만 있고, 구현부가 없는 메서드


2) 추상 클래스 

- 기능이 완전히 구현되지 않은 클래스 


(1) 선언된 메서드들 중에서도 기능이 완전히 구현된 것과 선언부만 존재하는 메소드가 혼재될 수 있다.

(2) 추상 클래스는 반드시 하나 이상의 추상 메소드를 가지고 있어야 한다. 

(3) 추상 클래스가 되는 종류 

- 추상 메서드를 포함하고 있기 때문에 추상화가 된 클래스 

- 클래스 앞에 abstract 키워드를 붙인 클래스 


3) 추상 클래스는 '미완성 도면' 이기 때문에 객체를 생성할 수 없다.

- 추상 클래스는 완전하지 않은 형태의 클래스이다. 때문에 객체 지향 프로그래밍의 다형성을 표현할 수 있다. 


4) 추상 클래스를 '상속' 받은 클래스는, 부모의 추상 메서드를 '반드시' 오버라이딩(재정의) 해야한다. 

- 강제성!



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package abstractex;
 
abstract class Tv {
    
    int channel;
    
    // abstract 메서드가 있다면 클래스도 추상화 해주어야 한다. 
    void channelDown() {}
    abstract void channelUp();
}
 
public class AbstractTest01 {
    public static void main(String[] args) {
 
        // 추상 클래스는 객체를 생성할 수 없다. 
        // Tv myTv = new Tv();
        
    }
}
cs




2. 선언 방법과 주의 사항 


(1) 추상 클래스에는 하나 이상의 추상 메소드가 존재해야 한다.

(2) abstract 제어자는 클래스 변수를 선언할 때 사용할 수 없다. 

(3) 추상 클래스는 추상 메소드를 선언하는 것 외에 일반 클래스에서 할 수 있는 모든 것을 지원한다.

(4) 추상 메소드는 실행부 없이 메소드 선언부만 선언하면 된다. 

단, 그 끝은 세미콜론(;)으로 종료한다. 

(5) 추상 클래스는 혼자서는 인스턴스화 해서 객체를 생성할 수 없다.

(6) 추상 클래스는 extends 키워드를 사용해서 상속 관계를 맺을 수 있다.

추상 클래스의 일반 메소드와 변수들은 그대로 자식 클래스가 상속받는다.

(7) 추상 클래스를 상속받은 자식 클래스는 추상 메소드를 반드시 오버라이딩 해야한다. 



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
32
33
34
package abstractex;
 
abstract class Video {
    
    abstract void display();
    void channelChange() {
        System.out.println("Video 비디오 채널 변경");
    }
}
 
class VideoTv extends Video {
 
    // 추상화 클래스를 상속받은 자식 클래스는 
    // 강제성을 띄어 부모 추상화 클래스의 추상 메서드를 오버라이딩 해야한다. 
    @Override
    void display() {
        System.out.println("VideoTv 비디오 채널 변경");
    }
    
    void parentChannelChange() {
        super.channelChange();
    }
}
 
public class AbstractTest02 {
    public static void main(String[] args) {
 
        // Video myVideo = new Video();
        VideoTv myVideoTv = new VideoTv();
        myVideoTv.display();                 // VideoTv 비디오 채널 변경 
        myVideoTv.parentChannelChange();    // Video 비디오 채널 변경
        
    }
}

cs