▶ 추상클래스란?
추상 메소드를 한 개 이상 가진 클래스로서 단 한개의 추상메소드를 가져도 추상클래스가 된다.
그리고 필드 변수를 선언하는 것도 가능하다.
▶ 추상메소드란?
메소드의 상세 동작이 정의되지 않은 메소드이다.
선언되어 있으나 구현되어 있지 않은 메소드, 중괄호가 없으며 선언만 되고 실체가 없다.
메소드의 상세 내용은 이 메소드를 활용하는 서브클래스에서 오버랑이딩으로 정의된다.
▶ 추상클래스의 목적
추상클래스는 서브클래스에서 필요로하는 기능을 선언만하여 두고
서브클래스가 상속받아 서브 클래스에서 오버라이딩하여 서브클래스에서 구현하도록 한다.
서브클래스에서 필요한 부분만 재정의함으로서 다형성, 재생산성을 가진다.
▶ 추상클래스 선언
추상클래스, 추상메소드는 abstract 로 선언한다.
ex) abstract class Calculater{}
ex) public abstract String getName();
▶ abstract 추상클래스 예제
abstract class Ex10Calculator { //추상클래스 abstract를 사용하여 정의
//추상메소드란? 메소드의 상세 동작이 정의되지 않은 클래스
//메소드의 상세 내용은 활용하는 부분에서 오버라이딩으로 정의됨
public abstract int add(int a, int b);
public abstract int subtract(int a, int b);
public abstract double average(int[] a);
public void aaa(int a, int b) {} //이 메소드는 중괄호가 있어서 추상 메소드가 아님
//추상메소드는 중괄호를 갖지 않는다.
//마지막 줄은 abstract가 적혀 있지 않은 일반 메소드이기 때문에 중괄호가 없으면 에러가 뜸.
//중괄호가 없으면 abstract를 적어 추상메소드로 만들거나
//아니면 중괄호를 달아서 일반 메소드로 만들어줘야함.
}
먼저 Ex10Calculator라는 추상클래스를 만들어주었다.
추상메소드 선언을 위해 abstract 키워드를 사용하였으며
메소드의 상세내용은 정의 되어있지 않고 선언만 해주었다.
이 때 선언만 된 추상메소드는 {} 중괄호를 갖지 않는다.
추상메소드가 아닌 일반 메소드에만 {} 중괄호를 쓰며 {} 중괄호로 에러가 날 수 있으니 주의해야한다.
public class Ex10 extends Ex10Calculator { //추상클래스 상속받음
//@Override : 오버라이딩 되는 메소드임을 표시하는 어노테이션
@Override
//여기 Ex10Calculator의 추상클래스의 추상메소드들이 상세하게 표현됨
public int add(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a - b;
}
public double average(int[] a) {
double sum = 0;
for(int i = 0; i < a.length; i++)
sum += a[i];
return sum / a.length;
}
public static void main(String[] args) {
// 추상클래스의 객체를 생성할 수 없으므로 메인 클래스의 객체를 생성했다(업캐스팅)
Ex10Calculator c = new Ex10();
//추상 메소드 연산 결과가 표시됨
System.out.println(c.add(2, 3));
System.out.println(c.subtract(2,3));
System.out.println(c.average(new int[] {2, 3, 4}));
}
}
이처럼 추상클래스를 상속받은 서브클래스에서
필요한 추상메소드들을 오버라이딩하여 상세 기능을 구현하였다.
또한 추상클래스는 객체생성이 불가능하므로 서브클래스객체를 생성,
즉 업캐스팅하여 추상메소드를 활용할 수 있다.
'JAVA' 카테고리의 다른 글
java 래퍼클래스(Wrapper class)란? (0) | 2022.03.24 |
---|---|
java 인터페이스 interface (+추상클래스 차이점&유사점) (0) | 2022.03.20 |
[JAVA] StringTokenizer 문자열 분리하기 (+hasMoreTokens 로 출력) (0) | 2022.03.17 |
JAVA 업캐스팅과 다운캐스팅 (+동적바인딩, 정적바인딩) (0) | 2022.03.16 |
java 객체 지향의 상속이란? 특징/사용법/예제 (0) | 2022.03.15 |
댓글