본문 바로가기

자바/자바 개념

[Java] 추상 클래스 / 2021.11.10

추상 클래스는 상속에서 슈퍼 클래스로 사용된다.

1. 추상 메소드

추상 메소드란 선언은 되어 있으나 코드가 구현되어 있지 않은, 즉 껍데기만 있는 메소드이다. 추상 메소드를 작성하려면 abstract 키워드와 함께 원형만 선언하고 코드는 작성하지 않는다.

 

// 추상 메소드 선언 예
public abstract String getName();
public abstract void setName(String s);

 

2. 추상 클래스 

추상 클래스가 되는 경우는 다음 2가지로서, 모두 abstract 키워드로 선언해야 한다.

 

// (1) 추상 메소드를 포함하는 클래스
abstract class Shape{  // 추상 클래스 선언
    public Shape() { }
    public void paint() { draw(); }
    abstract public void draw(); // 추상메소드 선언
}

// (2) 추상 메소드가 없지만 abstract로 선언한 클래스
abstract class MyComponent { // 추상 클래스 선언
    String name;
    public void load(String name){
    	this.name = name;
    }
}

 

위 두개의 클래스는 모두 추상 클래스이다. Shape는 추상 메소드를 가진 추상 클래스이며, MyComponent는 추상 메소드가 없는 추상 클래스이다.

* 추상 메소드를 가지고 있다면 반드시 추상 클래스로 선언되어야 한다.

 

* 추상 클래스는 객체를 생성할 수 없다? : 추상 클래스는 객체를 생성할 수 없다. 추상 클래스는 원래 객체를 생성할 목적으로 만드는 클래스가 아니다. 

 

3. 추상 클래스의 상속

추상 클래스를 단순히 상속받는 서브 클래스는 추상 클래스가 된다. 따라서 서브 클래스에 abstract를 붙어 추상 클래스임을 명시해야 컴파일 오류가 발생하지 않는다. 

 

abstract class Shape{ // 추상 클래스
    public Shape() { }
    public void paint() { draw(); }
    abstract public void draw();  // 추상 메소드
}

abstract class Line extends Shape{  // 추상 클래스, draw()를 상속받기 때문
    public String toString() { return "Line"; }
}

 

4, 추상 클래스의 구현과 목적

추상 클래스의 구현이란, 슈퍼 클래스에 선언된 모든 추상 메소드를 서브 클래스에서 오버라이딩하여 실행 가능한 코드로 구현하는 것을 말한다. 

추상 클래스는 추상 메소드를 통해 서브 클래스가 구현할 메소드를 명료하게 알려주는 인터페이스 역할을 하고, 서브 클래스는 추상 메소드를 목적에 맞게 구현하는 다형성을 실현할 수도 있다. 

 

5. 추상 클래스 구현 연습

 

package Chapter5;

abstract class Calculator{
	public abstract int add(int a, int b);
	public abstract int substract(int a, int b);
	public abstract double average(int [] a);
}

public class GoodClac extends Calculator{
	public int add(int a, int b) {
		return a + b;
	}
	public int substract(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) {
		GoodClac c = new GoodClac();
		System.out.println(c.add(2, 3));
		System.out.println(c.substract(2, 3));
		System.out.println(c.average(new int [] {2,3,4}));
	}
}