도형의 넓이를 구하는 코드를 작성해보자.
아래는 그냥 저번시간에 공부했던 오버라이드(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)
}
}