본문 바로가기
java/개념

추상 클래스

by unhyepnhj 2024. 5. 23.

추상 메소드(abstract method)

- 선언은 되어 있으나 코드가 구현되지 않은 메소드

- abstract로 선언

public abstract String getName();
public abstract void setName(String s);

public abstract String fail(return "Good Bye";}		//컴파일 오류, 코드가 작성됨

추상 클래스(abstract class)
- 서브 클래스에서 오버라이딩하여 구현해야 함

- abstract로 선언

- 추상 클래스가 되는 경우는 2가지

 

1. 추상 메소드를 하나라도 포함하는 클래스

- 추상 클래스를 가지고 있으면 반드시 추상 클래스로 선언(abstract로 선언)

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;
    	}
}

추상 클래스는 객체 생성 불가

- 응용 프로그램은 추상 클래스의 객체(인스턴스) 생성 불가

- 추상 클래스는 객체를 생성할 목적으로 만드는 클래스가 아님

- 실행 코드가 없는 미완성 상태의 추상 메소드가 있을 수 있음

- 추상 클래스의 객체를 생성하는 코드에는 컴파일 오류 발생

abstract class Shape{ ... }
public class AbstractError{
	public static void main(String[] args){
    		Shape shape;		//레퍼런스 변수 선언은 오류 아님
        	shape = new Shape();	//컴파일 오류, 추상 클래스 Shape의 객체 생성 불가
   	 }
}

추상 클래스의 상속

- 2가지 경우

 

1. 추상 클래스의 단순 상속

- 추상 클래스를 상속(추상 클래스의 추상 메소드를 그대로 상속받으므로)

서브 클래스도 추상 클래스이므로 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"; }
}

- Shape를 상속받는 Line 클래스에서 추상 메소드인 draw()를 오버라이딩하지 않으면 자동으로 추상 클래스가 됨

- Line은 abstract 키워드를 사용하여 추상 클래스임을 명시

 

2. 추상 클래스 구현 상속

- 추상 클래스 구현: 슈퍼 클래스에 선언된 모든 추상 메소드를 서브 클래스에서 오버라이딩하여 실행 가능한 코드로 구현

- 서브 클래스는 추상 클래스 아님 

- 추상 클래스는 추상 메소드를 통해 서브 클래스가 구현할 메소드를 명료하게 알려주는 인터페이스의 역할

- 서브 클래스는 추상 메소드를 목적에 맞게 구현하는 다형성 실현


추상 클래스의 용도

 

설계와 구현 분리

- 슈퍼 클래스에서는 개념 정의: 서브 클래스마다 다른 구현이 필요한 메소드는 추상 메소드로 선언 

- 각 서브 클래스에서 구체적 행위 구현: 서브 클래스마다 목적에 맞게 추상 메소드 다르게 구현

 

계층적 상속 관계를 맺는 클래스 구조를 만들 때 


예제 5-7 다음 추상 클래스 Calculator를 상속받은 GoodCalc 클래스를 구현

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);
}

 

'java > 개념' 카테고리의 다른 글

패키지(package)  (0) 2024.05.23
인터페이스(interface)  (0) 2024.05.23
메소드 오버라이딩(+동적 바인딩)  (0) 2024.05.22
업캐스팅과 다운캐스팅(+instanceof 연산자)  (0) 2024.05.22
상속과 생성자  (0) 2024.05.21