09009

[Java] 추상클래스 본문

Back-End/JAVA
[Java] 추상클래스
09009

추상클래스

• 클래스 = 설계도         추상 클래스 = 미완성 설계도

• 실체 클래스들의 공통되는 필드와 메소드 정의한 클래스

• 추상 클래스는 실체 클래스의 부모 클래스 역할 (단독 객체 X)

• 클래스 앞에 'abstract'를 붙여 선언

abstract class 클래스이름 {
		...
}

 

 

• 메서드 중에 하나라도 추상메서드가 있으면 추상클래스이다. =  하나 이상의 추상 메서드 포함

• 추상 메서드는 선언부는 있지만 구현부는 없다.

• 추상클래스는 객체를 생성할 수 없다.  추상 클래스는 상속을 통해서 자손 클래스에 의해서만 객체 생성 가능

추상클래스를 상속받은 클래스는 부모에 있는 추상메서드를 반드시 재정의해야 한다.

• 추상메서드를 포함하고 있지 않는 클래스에도 'abstract'를 붙여서 추상클래스 지정 가능  →  인스턴스 생성 불가 

 

!! 만일 추상클래스로부터 상속받은 자손클래스가 조상으로부터 상속받은 추상메서드 중 하나라도 구현하지 않을 경우,

자손클래스도 역시 추상클래스로 지정해주어야 에러가 발생하지 않는다. !!

 

추상클래스를 상속받는 자손 클래스는 오버라이딩을 통해 부모에 있는 추상메서드를 모두 구현해야 한다.

 

위의 소스코드를 확인해보면, Bus 클래스는 추상클래스인 Car를 상속받아 Car 클래스에 있는 추상메서드 run과 stop을

모두 구현해주었다는 것을 확인할 수 있다.

하지만, Taxi 클래스의 경우 추상클래스 Car를 상속받아 Car 클래스에 있는 추상메서드 run만 구현하고 stop은 구현하지 않았다.

그러므로 위의 소스코드에 에러가 발생한 것이다.  추상클래스를 상속받을 경우,

추상클래스에 있는 추상메서드를 모두 구현했어야 하는데 그러지 않았기 때문이다.

 

위의 에러를 해결하는 방법은  

1)  Taxi 클래스에서 나머지 stop 메서드까지 구현하거나 

2)  Taxi 클래스 앞에 abstract를 작성하여 추상클래스로 지정해주면 된다.


예제 소스코드

 Shape2.java

//메서드 중에 하나라도 추상메서드가 있으면 추상클래스
//추상클래스는 객체를 생성할 수 없다. 추상 클래스를 만들어서 사용
public abstract class Shape2 {
	void disp() { // 선언부
		System.out.println("안녕하세요"); // 구현부
	}
//	메서드 앞에 abstract를 붙이면 추상메서드이다. 추상메서드가 존재하므로 Shape2 클래스는 추상클래스이다. -> abstract 붙이기
	abstract void drive();  // 추상클래스는 선언부는 있지만 구현부가 없다.
}

class Rectangle2 extends Shape2 {
	void drive() { // !!! 추상클래스인 부모(Shape2)를 상속받았으므로 부모의 추상메서드를 재정의하여야 한다. !!!
		System.out.println("사각형을 그린다");
	}
}

class Circle2 extends Shape2 {
	void drive() {
		System.out.println("원을 그린다");
	}
}

//추상클래스를 상속받은 클래스는 부모에 있는 추상메서드를 반드시 재정의해야 한다.
class Triangle2 extends Shape2 {
	void drive() {
		System.out.println("삼각형을 그린다");
	}
}

 Shape2Ex.java

public class Shape2Ex {
	public static void main(String[] args) {
		Shape2[] sh = {new Rectangle2(), new Triangle2(), new Circle2()};
		
		for(Shape2 s : sh) {
			s.disp();
			s.drive();
		}
	}
}

💻 출력 결과

안녕하세요
사각형을 그린다
안녕하세요
삼각형을 그린다
안녕하세요
원을 그린다

 

 

 

/

5/7

'Back-End > JAVA' 카테고리의 다른 글

[Java] StringTokenizer  (0) 2023.04.06
[Java] 예외처리  (0) 2023.04.06
[Java] 인터페이스  (0) 2023.04.06
[Java] StringBuilder의 간단한 개념  (0) 2023.04.05
[Java] length, length(), size()  (0) 2023.04.05