국비지원수업

Java/자바 [14일차] (1)-추상 클래스,추상 메서드

둥구는 지굴다 2022. 11. 8. 21:34
글을 읽기 전 필자는 아직 코딩을 배우는 단계이므로 글의 내용이 부정확할 수 있습니다.

여러 가지 글과 책, 수업을 바탕으로 정리한 내용이니 알맞지 않은 내용이 있다면 댓글 남겨주시면 수정하겠습니다.

추상 클래스

추상 클래스를 설명하기 전 객체를 직접 생성할 수 있는 클래스는 실체 클래스라고 합니다.

이 실체 클래스에서 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 합니다.

공통적인 특성에서 특성이란 필드, 메서드를 뜻합니다.

추상 클래스와 실체 클래스는 상속 관계를 갖고 있으며

추상 클래스가 부모 클래스, 실체 클래스가 자식으로 구현되어서

실체 클래스는 추상 클래스의 모든 필드와 메서드를 가져올 수 있습니다.

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

  • 추상 클래스에서 필드와 메서드의 이름을 정해줌으로써 클래스 별로 메서드의 이름을 통일할 수 있습니다.
  • 실체 클래스를 작성할 때 시간을 절약할 수 있습니다.

추상 클래스의 선언 방법

추상 클래스의 선언은 클래스를 선언할 때 class 키워드 앞에 abstract 키워드를 넣어주면 추상 클래스를 선언할 수 있습니다.

abstract 키워드를 붙이게 되면 new 연산자를 이용해서 직접적으로 객체를 만들지 못하며,

상속을 통하여 자식 클래스로만 객체를 생성할 수 있습니다.

puiblic abstract class 클래스이름 {
//필드
//생성자
//메서드
}

추상 클래스는 new연산자로 직접 객체를 생성할 수 없지만

자식 객체가 생성될 때 super( )을 호출하여

추상 클래스 객체를 생성하므로 추상클래스도 생성자는 반드시 필요합니다.

추상 메서드

추상 메서드는 추상 클래스와 마찬가지로 abstract 키워드와 함께 메서드의 선언부만 있고

메서드 실행 내용이 없는 메서드를 말합니다.

추상 메서드는 추상 클래스 내에서만 사용이 가능하며 추상 메서드를 정의해 두었다면

자식 클래스에서 추상 메서드를 필히 구현해야합니다.

만일 상속받은 자식이 추상 메서드를 구현하지 않았다면

컴파일 오류가 발생합니다.

public abstract 리턴타입 메서드이름(매개변수);

추상 클래스, 추상 메서드 사용해보기

도형의 넓이를 구하는 클래스를 만들었습니다.

하지만 도형에 따라 넓이를 구하는 공식이 다르기에

넓이를 구하는 메서드인 getArea( ) 추상 메서드를 선언한 뒤

자식 클래스의 도형에 맞게 메서드를 재정의 해주어야 합니다.

[부모 클래스 AShape 추상 클래스 정의]

public abstract class Ashape {
	protected String name;
	protected int width;
	protected int height;
	
	public Ashape(){}
	
	public Ashape(int width, int height) {
		this.width=width;
		this.height=height;
	}
	//추상 메서드 반드시 자식 클래스에서 재정의 필요
	public abstract double getArea();
	
	//인스턴스 메서드
	public  String shape() {return "도형의 이름: "+name+"가로:"+width+"세로: "+height+"넓이: "+getArea();}

}

[자식 클래스 Triangle / AShape상속]

class ATriangle extends Ashape{
	protected int angle;
	
	//추상클래스 오버라이드
	@Override
	public double getArea() {return width*height/2;}
}

[자식 클래스 Circle / AShape상속]

class ACircle extends Ashape {
	private int radius;
	private static  final double PI  =3.14;
	
	public ACircle(String name,int width,int height,int radius) {
		super(width,height);
		this.name=name;
		this.radius=radius;
	}
	
//추상 클래스 오버라이드
	@Override
	public double getArea() {return radius*radius*PI;}
	
	public int getRadius() {return radius;}
}

메인 메서드

public static void main(String[] args) {
		
		//Ashape A = new Ashape(); 오류!! 추상 클래스는 직접 객체 생성 불가.
		ACircle cir1= new ACircle("원",12,13,11);
		System.out.println("원의 넓이 :"+cir1.getArea());
		
		ATriangle tri = new ATriangle();
		tri.width=10; tri.height=24;
		System.out.println("삼각형 넓이 :"+tri.getArea());
	}

출력 결과