1+ package week03 .basic ;
2+
3+ import java .util .ArrayList ;
4+ import java .util .List ;
5+
6+ public class AbstractShapeArea {
7+
8+ public static void main (String [] args ) {
9+ System .out .println ("<추상 골격 제공 + 구현 클래스>" );
10+ // B-3) 추상 골격 제공 + 구현 클래스
11+ // 문제: `abstract class Shape { abstract double area(); }`를 만들고,
12+ // `Rectangle(w,h)`와 `Circle(r)`이 `area()`를 구현하도록 하라. 리스트에 담아 총 넓이를 구해보라.
13+ // 문제설명: 추상 클래스는 공통 인터페이스(시그니처)를 강제하고, 하위 클래스가 구현 세부를 제공한다.
14+ // 클라이언트는 상위 타입 `Shape`로 묶어 다룰 수 있고, 런타임에는 실제 타입의 `area()`가 호출된다(동적 바인딩).
15+ // 힌트: `abstract class`, `abstract method`, `implements` 아님(클래스 상속), 리스트,
16+ // 향상된 for, 다형성.
17+ Shape r1 = new Rectangle (8 ,7 );
18+ Shape r2 = new Rectangle (5 ,2 );
19+ Shape r3 = new Rectangle (9 ,3 );
20+
21+ Shape c1 = new Circle (4 );
22+ Shape c2 = new Circle (6 );
23+
24+ List <Shape > list = new ArrayList <>();
25+ list .add (r1 );
26+ list .add (r2 );
27+ list .add (r3 );
28+ list .add (c1 );
29+ list .add (c2 );
30+
31+ double sum = 0.0 ;
32+ for (Shape s : list ) {
33+ sum += s .area ();
34+ }
35+ System .out .println ("총 넓이: " + sum );
36+
37+ }
38+
39+ }
40+
41+ abstract class Shape { // 추상 클래스(추상 메서드가 있으면 그 구현을 하위 클래스에 강제한다)
42+ abstract double area ();
43+ }
44+
45+ class Rectangle extends Shape {
46+ private double width ;
47+ private double height ;
48+
49+ Rectangle (double width , double height ) { //생성자
50+ this .width = width ;
51+ this .height = height ;
52+ }
53+
54+ @ Override
55+ double area () { // 추상 메서드
56+ return width * height ;
57+ }
58+
59+ }
60+
61+ class Circle extends Shape {
62+ private double r ;
63+
64+ Circle (double r ) { //생성자
65+ this .r = r ;
66+ }
67+
68+ @ Override
69+ double area () { // 추상 메서드
70+ return r * r * Math .PI ;
71+ }
72+
73+ }
0 commit comments