Language/JAVA

[JAVA 기초 이론] 추상클래스 abstract

오류나면꽥꽥 2023. 5. 19. 11:35

추상 클래스

 

abstract class 클래스명{
}

 

객체화 하는 것이 목표가 아니라 "설계를 하는 것이 목표였던 클래스들"

=> 클래스들의 기준이 되는 것이 목표

 

  1. 일반 클래스처럼 독립적으로 생성자를 호출해 객체를 생성할 수 없습니다.
  2. 자식 클래스의 생성자에서 super()를 통해 추상 클래스의 생성자를 호출하여
    부모 객체를 생성한 후 자식 객체를 생성 합니다.

추상 클래스는 직접 객체를 생성할 수 없습니다!

▲ 자식 클래스의 객체를 생성하고, 자식 클래스를 통해 추상 클래스의 메서드 호출이 가능합니다!

 

 

 

 

✋ 추상클래스를 사용하는 이유

  1. 자식 클래스들이 공통적으로 가져야 하는 메서드를 가져야 할 때
  2. 부모 클래스의 객체를 생성할 일이 없을 때

 

 

 

ex)

추상클래스 기본예제

package test01;

abstract class Receipt{ // 추상클래스(부모클래스)
	String chef;
	Receipt(String chef){
		this.chef=chef;
	}
	void info() {
		System.out.println("이 레시피는 "+chef+" 셰프님의 레시피입니다.");
	}
}

class PastReceipt extends Receipt{ // 부모클래스(Receip)를 상속받는 자식클래스(PastReceip)
	PastReceipt(String chef){
		super(chef); // 추상클래스(부모클래스) 생성자 호출
	}
	void makeSource() {
		System.out.println("파스타 소스를 직접 만듭니다.");
	}
}

public class Test01 {
	public static void main(String[] args) {
		
		// Receipt re = new Receipt(); ---> 사용X
		// ▲ 추상 클래스는 직접 객체를 생성할 수 없습니다!
		
		PastReceipt pr = new PastReceipt("홍길동"); // 자식 클래스를 객체 생성
		pr.info(); // 자식 객체를 통해 추상 클래스의 메서드 호출 가능O
	}
}

 

출력)

더보기

pr.info()를 통해 콘솔창에 출력

이 레시피는 홍길동 셰프님의 레시피입니다.

 

 

 

 

 

✅ 추상 메서드 오버라이딩 및 재정의

 

=> 오버라이딩

abstract class 클래스명{
   abstract void 메서드명();
}

부모클래스 상속 받은 자식클래스{
   @Override
   void 메서드명(){
               구현할 코드
   }
}

 

ex) abstract void draw();

 

추상 클래스를 상속받은 모든 자식 클래스는 반드시 추상 메서드를 오버라이딩 및 재정의하여 구현해야힙니다.

=> 그렇지 않으면 컴파일 에러가 발생!

 

 

 

✋ 추상메서드를 사용하는 이유

  1. 자식클래스 간의 공통적인 필드와 메서드 이름을 통일하고,
  2. 반드시 구현해야 하는 메서드를 선언함으로써 자식클래스에게 공통 규격을 제공한다!

 

package class01;

abstract class Shape{ // 추상클래스(부모클래스)
	String name;
	double area;
	abstract void draw(); // 추상메서드
}
class Rect extends Shape{ // 부모클래스 상속 받은 자식클래스
	@Override // 오버라이딩
	void draw() { // 부모클래스에서 만든 추상 메서드
		System.out.println("네모 그리기"); // 재정의(구현)
	}
}
class Circle extends Shape{
	@Override
	void draw() {
		System.out.println("원 그리기");
	}
}
class Tri extends Shape{
	@Override
	void draw() {
		System.out.println("세모 그리기");
	}
}
public class Test02 {
	public static void main(String[] args) {
	Circle c=new Circle();
	c.draw();
	}
}

 

출력)

더보기

원 그리기

 

 

 

 

 

 

🔑 keyPoint.

 

1. 객체화 불가능

생성자를 가질 수 있음에 유의!

new 연산자와 함께 사용 x

객체화 하는 것이 목표가 아니라 "설계를 하는 것이 목표였던 클래스들"

=> 클래스들의 기준이 되는 것이 목표

 

2. 추상메서드를 소유할 수 있음

=> 오버라이딩을 "강제"

=> 메서드 바디{}를 가질 수 없음

abstract void draw(); // 추상메서드

 

 

1. 생성자 컨트롤 / 자식의 생성자를 잘 만들어 낼 수 있는가?
2. 추상메서드 / 오버라이딩을 할 수 있는가?
3. 인자로 객체 / 해당 객체를 사용할 수 있는가?

 

 

 

 

 

 

[JAVA/JAVA] - [JAVA 기초 이론] 인터페이스 / 추상 클래스 / 상속 비교 정리

 

[JAVA 기초 이론] 인터페이스 / 추상 클래스 / 상속 비교 정리

인터페이스 (Interface) 인터페이스는 클래스에 대한 약속을 정의합니다. 클래스가 해당 인터페이스를 구현하면 인터페이스에 정의된 모든 메서드를 반드시 구현해야 합니다. // 인터페이스 정의 i

coding-bird.tistory.com