Abstract는 한국어로는 ‘추상’으로 번역할 수 있다.
객체지향 프로그래밍에서 주목해야 할 특징으로 abstract 키어드ㅡ로 지정된 메소드나 클래스는 직접적으로 사용할 수 없고 반드시 그것을 상속한 클래스를 만들고, 그렇게 상속한 클래스를 사용해야 한다는 것이다.
다시 말해 abstract는 클래스를 상속해서 사용하돍 강제하는 것이다.
package org.opentutorials.javatutorials.abstractclass.example1;
Abstract class A{
public abstract int b();
// 본체가 잇는 메소드는 abstract 키워드를 가질 수 없다.
// public abstract int c(){ System.out.println(“hello”); }
// 추상 클래스 내에는 추상 메소드가 아닌 메소드가 존재할 수 있다.
public void d(){
System.out.println(“world”);
}
}
Public class AbstractDemo {
public static void main(String [] args){
A obj = new A();
}
}
[출력 결과]
Exception in thread “main” java.lang.Eror: Unresolved compilation problem :
Cannot instantiate the type A
at org.opentutorials..javatutorials.abstractclass.examle1.AbstracDemo.main(AbstractDe-mo.java:7)
에러가 발생하는 이유는 A클래스가 추상클래스이기 때문이다.
추상 클래스는 반드시 그거슬 상속해서 사용해야 하는데, main 메소드에서 직접적으로 사용하려고 햇기 때문에 에러가 발생한 것이다.
package org.opentutorials.javatutorials.abstractclass.example2;
Abstract class A{
public abstract int b();
// 본체가 잇는 메소드는 abstract 키워드를 가질 수 없다.
// public abstract int c(){ System.out.println(“hello”); }
// 추상 클래스 내에는 추상 메소드가 아닌 메소드가 존재할 수 있다.
public void d(){
System.out.println(“world”);
}
}
class B extends A {
}
Public class AbstractDemo {
public static void main(String [] args){
B obj = new B();
}
}
위 예제를 보면 에러가 나는데 에러의 내용은 B 클래스는 A 클래스의 메소드 가운데 b() 메소드를 구현해야 한다는 것이다.
추상메소드의 특징은 본체가 없다는 점이다. 다른 일반 메솓는 중괄호로 시작해서 중괄호로 끝나는 메소드의 실질적인 로직이 들어가는 본체가 있지만 추상 메소드인 b() 메소드는
b();에서 끝난다. 즉, b() 메소드는 메소드의 구체적인 로직이 담긴 본체가 없고 메소드 서명만 가진 추상적인 모습임을 알 수 있다.
추상메소드를 상요하려면 메소드를 사용한ㄴ 쪽에서 반드시 이 메소드를 오버라이딩해서 b() 메소드의 구체적인 로직을 정의해야 한다. 따라서 에러를 제거하려면 b() 메소드를 하위 클래스에서 오버라이딩 해야 한다.
pubic int b(){
return 1;
}
위 내용을 B 클래스에 추가하면 에러가 사라진다.
abstract는 결국 상속을 강제한다는 것을 의미하고 동시에 추상 메소드나 추상 클래스라는 것은 구체적인 로직을 담고 있지 않고 그 로직을 사용하기 위한 형식에 해당하는 메소드 서명만 잇다는 것이다.
즉, 메소드에 대한 구체적인 구현 채임은 그것을 사용하는 쪽에게 넘기는 것이 abstract이다.
멤버 중 하나라도 abstract 키워드가 지정돼 있으면 해당 멤버를 담고 있는 클래스도 추상 클래스가 된다는 사실을 꼭 기억해야 한다.
그리고 A 클래스가 추상 클래스임에도 추상 클래스는 본체가 없는 b() 메소드 같은 추상메소드를 가지고 있을 수도 있지만 d() 메소드처럼 구체적인 로직을 가진 메소드도 정의할 수 있다는 것도 기억해야 한다.
[추상 메소드와 추상 클래스를 사용하는 이유]
프로그램의 규모가 크고 다양한 맥락에서 사용될 수 있는 기능이 있을 때 그 기능의 공통적인 부분이 있고, 그것을 사용한ㄴ 용도에 따라서 달라질 수 있는 기능이 있다면 그것을 추상 클래스로 만들어서 추상 클래스에는 공통적인 로직을 구현하고 추상 클래스를 상속한 하위 클래스에서는 용도에 따라서 달라지는 구현을 사용자가 직접하도록 유도하거나 규제하는 것이 바로 추상 클래스를 사용하는 목적이라고 할 수 있다.
'생활코딩 > JAVA' 카테고리의 다른 글
생활코딩 - JAVA (인터페이스) (0) | 2020.12.19 |
---|---|
생활코딩 - JAVA (final) (0) | 2020.12.19 |
생활코딩 - JAVA (접근 제어자) (0) | 2020.12.19 |
생활코딩 - JAVA (패키지) (0) | 2020.12.13 |
생활코딩 - JAVA (클래스패스) (0) | 2020.12.13 |