✅ 답안과 비교하여 스스로 코드 개선점 짚어보기 완료(2022.01.09)
BASIC1. 사각형과 원의 면적, 둘레 구하기(클래스) ✅
Rectangle 면적 : 1473.15
Rectangle 둘레 : 154.4
Circle 면적 : 754.7676350249478
Circle 둘레 : 97.38937226128358
Application.class
객체 생성한 뒤 메소드 호출하는 방법보다 new 연산자 사용해 호출하는 것이 간단할 수 있다. 특히 이 경우는 한 번뿐인 호출이기 때문에 그렇다.
package com.greedy.level01.basic.polymorphism;
public class Application {
public static void main(String[] args) {
// ShapeManager shapeManager = new ShapeManager();
// shapeManager.calcShape();
new ShapeManager().calcShape();
}
}
Circle.class
package com.greedy.level01.basic.polymorphism;
public class Circle extends Shape {
public static double PI = Math.PI;
private double radius; //반지름
/* 기본 생성자 */
public Circle() {}
/* 매개변수 있는 생성자 */
public Circle(double radius) {
this.radius = radius;
}
public static double getPI() {
return PI;
}
public static void setPI(double pI) {
PI = pI;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
/* 추상메소드 오버라이딩 */
/* 원의 면적과 둘레 계산 */
@Override
public double area() {
return PI * radius * radius;
}
@Override
public double perimeter() {
return 2 * radius * PI;
}
}
Rectangle.class
package com.greedy.level01.basic.polymorphism;
public class Rectangle extends Shape {
private double width;
private double height;
/* 기본 생성자 */
public Rectangle() {}
/* 매개변수 있는 생성자 */
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
/* 추상메소드 오버라이딩 */
/* 사각형의 면적과 둘레 계산 */
@Override
public double area() {
return width * height;
}
@Override
public double perimeter() {
return (width + height) * 2;
}
}
Shape.class *abstract*
추상클래스와 추상메소드 선언 시에 클래스명 앞에도 abstract 키워드를 기억하자.
package com.greedy.level01.basic.polymorphism;
public abstract class Shape {
/* 추상클래스와 추상메소드 선언 */
public abstract double area();
public abstract double perimeter();
}
ShapeManager.class
객체배열 크기는 문제상에 주어지지 않았다. 때문에 초기화를 바로 진행하는 것이 적합하다.
대상이 Rectangle과 Circle 둘 뿐이므로 삼항연산자를 사용할 수 있겠다.
String shapeType = s instance of Rectangle ? Rectangle : Circle;
package com.greedy.level01.basic.polymorphism;
public class ShapeManager {
public void calcShape() {
/* Shape 객체 배열 */
Shape[] shape = {new Rectangle(34.5, 42.7), new Circle(15.5)};
/* 면적과 둘레 출력 */
for(Shape s : shape) {
if(s instanceof Rectangle) {
System.out.println("Rectangle 면적 : " + s.area());
System.out.println("Rectangle 둘레 : " + s.perimeter());
} else if(s instanceof Circle) {
System.out.println("Circle 면적 : " + s.area());
System.out.println("Circle 둘레 : " + s.perimeter());
}
}
}
}
NORMAL1-1. 사각형과 원의 면적, 둘레 구하기(인터페이스) ✅
Rectangle 면적 : 1473.15
Rectangle 둘레 : 154.4
Circle 면적 : 754.7676350249478
Circle 둘레 : 97.38937226128358
NORMAL1-2. 다운캐스팅 적용하여 삼각형 빗변 구하기 ✅
Circle - 면적 : 475.2915525615999, 둘레 : 77.28317927830892
Rectangle - 면적 : 1486.5600000000002, 둘레 : 156.4
Rectangle - 면적 : 568.56, 둘레 : 98.6
Triangle 면적 : 321.63, 둘레 : 82.39724906848504, 빗변 : 30.897249068485042
Triangle 면적 : 1608.32, 둘레 : 215.49977777750343, 빗변 : 89.99977777750343
Application.class
여기서도 객체 선언하지 않고 바로 new ShapeManager().calcShapeArray();로 쓸 수 있겠다.
package com.reminder.polymorphism_practice.interfaceimplements;
public class Application {
public static void main(String[] args) {
ShapeManager shapeManager = new ShapeManager();
/* Part 1. Interface */
shapeManager.calcShape();
/* Part 2. Down-casting */
shapeManager.calcShapeArray();
}
}
IShape.interface
package com.reminder.polymorphism_practice.interfaceimplements;
public interface IShape {
public abstract double area();
public abstract double perimeter();
}
Circle.class
package com.reminder.polymorphism_practice.interfaceimplements;
public class Circle implements IShape {
public static double PI = Math.PI;
private double radius;
public Circle() {}
public Circle(double radius) {
this.radius = radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
@Override
public double area() {
return PI * radius * radius;
}
@Override
public double perimeter() {
return 2 * radius * PI;
}
}
Rectangle.class
package com.reminder.polymorphism_practice.interfaceimplements;
public class Rectangle implements IShape {
private double width;
private double height;
public Rectangle() {}
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
public void setWidth(double width) {
this.width = width;
}
public void setHeight(double height) {
this.height = height;
}
public double getWidth() {
return width;
}
public double getHeight() {
return height;
}
@Override
public double area() {
return width * height;
}
@Override
public double perimeter() {
return (width + height) * 2;
}
}
ShapeManager.class
package com.reminder.polymorphism_practice.interfaceimplements;
public class ShapeManager {
public void calcShape() {
IShape[] iShape = {new Rectangle(34.5, 42.7), new Circle(15.5)};
// Rectangle rect = new Rectangle();
// Circle circ = new Circle();
for(IShape s : iShape) {
if(s instanceof Rectangle) {
System.out.println("Rectangle 면적 : " + s.area());
System.out.println("Rectangle 둘레 : " + s.perimeter());
} else if(s instanceof Circle) {
System.out.println("Circle 면적 : " + s.area());
System.out.println("Circle 둘레 : " + s.perimeter());
}
}
}
public void calcShapeArray() {
IShape[] iarr = new IShape[5];
iarr[0] = new Circle(12.3);
iarr[1] = new Rectangle(32.6, 45.6);
iarr[2] = new Rectangle(18.4, 30.9);
iarr[3] = new Triangle(30.2, 21.3);
iarr[4] = new Triangle(89.6, 35.9);
for(IShape p : iarr) {
if(p instanceof Rectangle) {
System.out.println("Rectangle - 면적 : " + p.area() + ", 둘레 : " + p.perimeter());
} else if(p instanceof Circle) {
System.out.println("Circle - 면적 : " + p.area() + ", 둘레 : " + p.perimeter());
} else if(p instanceof Triangle) {
System.out.println("Triangle 면적 : " + p.area() + ", 둘레 : " + p.perimeter() + ", 빗변 : " + ((Triangle)p).hypotenuse());
}
}
}
}
Triangle.class
package com.reminder.polymorphism_practice.interfaceimplements;
public class Triangle implements IShape {
private double base;
private double height;
public Triangle() {}
public Triangle(double base, double height) {
this.base = base;
this.height = height;
}
public void setBase(double base) {
this.base = base;
}
public void setHeight(double height) {
this.height = height;
}
public double getBase() {
return base;
}
public double getHeight() {
return height;
}
@Override
public double area() {
return (base * height) / 2;
}
@Override
public double perimeter() {
return base + height + hypotenuse();
}
public double hypotenuse() {
return Math.sqrt(base * base + height + height);
}
}
'Java' 카테고리의 다른 글
[JAVA] 10-2. Wrapper | 파싱(parsing) | Date | Calendar (0) | 2022.01.07 |
---|---|
[JAVA] 10-1. API | Object | String | StringBuilder (0) | 2022.01.06 |
[JAVA/수업 과제 practice] 상속 Lv. 1~2 (0) | 2022.01.06 |
[JAVA] 9. 다형성 | 추상클래스 | 인터페이스 (1) | 2022.01.05 |
[JAVA] 8. 상속 | super | 오버라이딩 (0) | 2022.01.04 |