일반클래스와 추상클래스 차이
일반클래스는 클래스 앞에 abstract 명령어가 붙지 않는 반면
추상클래스는 클래스 앞에 abstract 명령어가 붙는 클래스를 의미합니다.
일반클래스 내에서 함수에 abstract 를 붙일 수 없는 반면
추상클래스 내에서는 함수에 abstract 를 붙일 수도 붙이지 않을 수도 있습니다.
일반클래스는 부모클래스라고 하더라도 객체 생성이 가능한 반면
추상클래스는 객체생성이 불가능 합니다.
자식클래스는 일반클래스 혹은 추상클래스를 상속을 통해 부모클래스로 둘 수 있습니다. ( 한 개만 가능 )
일반 클래스
1
2
3
4
5
6
7
8
|
class A {
public A () { } // 생성자 메소드
abstract public void f_a() { } // 이렇게 추상메소드는 추상클래스에서 사용할 수 없음 > 에러발생
public void f_b() { // 일반 메소드로 사용 가능
System.out.println("class A f_a");
}
}
|
cs |
추상 클래스
추상메소드는 몸체가 없습니다.
이러한 이유는 자식클래스에서 무조건 구현해야 하기 때문에 부모(추상)클래스의 메소드에서 구현이 불필요하기 때문입니다.
참고로 일반클래스처럼 추상클래스를 추상클래스가 상속받을수도 있습니다.
1
2
3
4
5
6
7
8
|
abstract class B {
public B () { } // 생성자 메소드
abstract void f_a(); // 추상메소드 사용 가능 > 자식클래스에서 무조건 구현해 주어야 함
public void f_b() { // 일반 메소드로 사용 가능
System.out.println("abstract class B f_b");
}
}
|
cs |
자식클래스에서의 구현
자식클래스에서는 아래 방식으로 동일하게 기능을 구현할 수 있습니다.
1. 추상클래스를 상속받아 추상메소드를 구현하거나
2. 일반클래스를 상속받아 함수를 오버라이딩 하거나
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
35
36
37
38
39
|
public class Test {
@SuppressWarnings("unused")
public static void main(String[] args) {
A_child ac = new A_child();
ac.f_a();
B_child bc = new B_child();
bc.f_a();
}
}
class A {
public A () { } // 생성자 메소드
public void f_a() { } // 이렇게 추상메소드는 추상클래스에서 사용할 수 없음 > 에러발생
public void f_b() { // 일반 메소드로 사용 가능
System.out.println("class A f_a");
}
}
class A_child extends A {
public void f_a() {
System.out.println("This is A_Child Class f_a");
}
}
abstract class B {
public B () { } // 생성자 메소드
abstract void f_a(); // 추상메소드 사용 가능 > 자식클래스에서 무조건 구현해 주어야 함
public void f_b() { // 일반 메소드로 사용 가능
System.out.println("abstract class B f_b");
}
}
class B_child extends B {
public void f_a() {
System.out.println("This is B_Child Class f_a");
}
}
|
cs |
그러면 한가지 궁금한 부분이 떠오를 수 있습니다.
아니 자식클래스에서 동일하게 구현하면 되잖아?
네 어느정도는 맞습니다. 자식클래스에서 부모클래스의 기능을 똑같이 구현할 수 있습니다.
그럼 왜 추상클래스가 필요한 걸까요?
추상클래스가 필요한 이유
자식클래스에서 상속받은 추상클래스의 추상메소드를 무조건 구현해 주어야 합니다.
구현하지 않으면 오류가 발생합니다.
즉, 이 메소드는 자식클래스에서 무조건 정의를 해야만해! 라는 메소드가 있다고 판단된다면
추상클래스를 사용하여 메소드 구현을 강제하도록 하는게 좋다는 의미입니다.
사실 추상클래스를 사용하지 않아도, 프로그램을 개발하는데 문제는 없습니다.
자바에서 제공하는 또다른 기능들도 마찬가지 이구요.
말씀드리고 싶은 것은 적재적소에 잘 사용하여 좋은 프로그램을 만드셨으면 좋겠습니다.
'Computer Language > JAVA' 카테고리의 다른 글
[JAVA] 자바와 SQL Server JDBC 연동방법 (0) | 2021.04.13 |
---|---|
[JAVA] 자바 인터페이스와 추상클래스 차이 (0) | 2021.04.01 |
[Java] 이클립스 The selection cannot be launched, and there are no recent launches 오류 (2) | 2021.03.31 |
[JAVA] 자바 public static void main (String[] args) 의미 (8) | 2021.03.28 |
[JAVA] 자바 스레드 synchronized 동기화 방법 (0) | 2021.03.26 |