15. 추상클래스 (Abstract Class) [ JAVA ]

duck-ach·2022년 8월 2일
1

JAVA

목록 보기
15/27
post-custom-banner

추상 메소드(Abstract Method)와 추상 클래스(Abstract Class)

도형의 넓이를 구하는 코드를 작성해보자.
아래는 그냥 저번시간에 공부했던 오버라이드(Override)를 이용한 방법으로 구현을 했다.

Shape 클래스에서 getArea()메소드의 return값을 0로 설정해준 이유는 Main에서 호출해서 쓸 수 있게 하기 위함이다.

public class Main {

	public static void main(String[] args) {
		
		// s1는 진짜 도형이아니다. 모양도모르고, 넓이도모른다.
		// Shape 클래스타입의 객체는 존재할 수 없는 객체이다.
		// 생성을 막아주는 것이 좋다. (abstract 처리)
		Shape s1 = new Shape("도형");
		System.out.println(s1.getType());
		System.out.println(s1.getArea());
		
		Shape s2 = new Circle("원", 1);
		System.out.println(s2.getType());
		System.out.println(s2.getArea());

	}

}
public class Shape {
	
	// field
	private String type;

	// constructor
	public Shape(String type) {
		super();
		this.type = type;
	}
	
	// method

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}
	
	// 모든 도형의 넓이를 구하는 것은 getArea()로 합시다 선언.
	// 어떤도형이 올 지 모르니 return값 0(zero)
	public double getArea(); {
		 return 0;
	}
	
	
}

public class Circle extends Shape {
	private double radius;

	public Circle(String type, double radius) {
		super(type);
		this.radius = radius;
	}
	
	@Override 
	public double getArea() { 	// Shape를 상속 받는 객체들이 호출할 때 사용하는 메소드
								// 사용되지는 않는다. -> 추상메소드로 바꿔준다. (본문이 없는 메소드)
		return Math.PI * Math.pow(radius, 2); // πr(2)
	}

}

하지만 추상클래스를 이용하면 return 0를 하지않아도 된다.

추상메소드

  • 본문이 없는 메소드
  • 호출용으로 사용되는 메소드
  • 중괄호{} 자체를 없애고 세미콜론(;)을 추가한다.
  • public abstract(추천) 또는 abstract public을 붙여서 사용하면 된다.

추상클래스

  • 추상메소드가 1개 이상 존재하는 클래스
  • public abstract class
  • 추상 메소드가 1개라도 있다면 클래스도 함께 abstract로 선언해주어야 한다.
  • 본문이 없는 메소드를 포함하기 때문에 객체 생성이 불허된다.

위와 똑같은 예제를 추상메소드를 이용하여 바꿔보겠다.

public class Main {

	public static void main(String[] args) {
		
		// s1는 진짜 도형이아니다. 모양도모르고, 넓이도모른다.
		// Shape 클래스타입의 객체는 존재할 수 없는 객체이다.
		// 생성을 막아주는 것이 좋다. (abstract 처리)
		
		// 추상클래스 객체는 못만든다.
//		Shape s1 = new Shape("도형");
//		System.out.println(s1.getType());
//		System.out.println(s1.getArea());
		
		Shape s2 = new Circle("원", 1);
		System.out.println(s2.getType());
		System.out.println(s2.getArea());

	}

}

public abstract class Shape {
	
	// field
	private String type;

	// constructor
	public Shape(String type) {
		super();
		this.type = type;
	}
	
	// method

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}
	
	// 모든 도형의 넓이를 구하는 것은 getArea()로 합시다 선언.
	// 어떤도형이 올 지 모르니 return값 0(zero)
	public abstract double getArea(); {
		 
	}
	
	
}
public class Circle extends Shape {
	private double radius;

	public Circle(String type, double radius) {
		super(type);
		this.radius = radius;
	}
	
	// Shape 클래스는 추상 클래스이므로, 반드시 double getArea() 메소드를 오버라이드 해야한다.
	@Override 
	public double getArea() { 	// Shape를 상속 받는 객체들이 호출할 때 사용하는 메소드
								// 사용되지는 않는다. -> 추상메소드로 바꿔준다. (본문이 없는 메소드)
		return Math.PI * Math.pow(radius, 2); // πr(2)
	}

}
profile
자몽 허니 블랙티와 아메리카노 사이 그 어딘가
post-custom-banner

0개의 댓글