코딩항해기
[실습/JAVA] 모양을 상속받는 원과 사각형 (+풀이 0703) 본문
[요구사항대로 문제해결하기]
모양 Shape
String name 이름
double area 넓이
String color 색
void draw()
ㅁㅁ색 ㅁㅁ모양은 ㅁㅁ.ㅁㅁ만큼의 넓이
원 Circle
int radius 반지름
double PI 3.14 원주율
사각형 Rectangle
int x,y 가로,세로
요구사항
1. 이름이 없는 모양 객체는 없음
2. 어떤 모양의 색을 별도로 지정하지않으면 기본 색은 검정
3. 원의 경우, 반지름을 별도로 지정하지않으면 기본 1
4. new 사각형(10) == 정사각형
5. new 사각형(10,20) == 직사각형
[실습]
(추상메소드, 추상클래스 진도가 나가진 않았지만 적용함)
package class03;
//모양
abstract class Shape{
String name; //이름
double area; //넓이
String color; //색
Shape(String name){
this(name, "black");
}
Shape(String name, String color) {
this.name = name;
this.area = 0;
this.color = color;
}
void draw() {
// 00색 00모양은 00.00만큼의 넓이
System.out.printf("%s색 %s모양은 %.2f만큼의 넓이\n",this.color,this.name,this.area);
}
abstract double areaCalculate();
}
//원
class Circle extends Shape{
int radius; //반지름
static final double PI = 3.14; //원주율
Circle() {
this(1);
}
Circle(String color) {
this(color, 1);
}
Circle(int radius) {
super("원");
this.radius = radius;
this.area = areaCalculate();
}
Circle(String color, int radius) {
super("원",color);
this.radius = radius;
this.area = areaCalculate();
}
@Override
double areaCalculate() {
return this.radius*this.radius*PI;
}
}
//사각형
class Rectangle extends Shape{
int x, y; //가로, 세로
Rectangle(int x){
this(x,x);
}
Rectangle(String color, int x) {
this(color, x, x);
}
Rectangle(int x, int y){
super("사각형");
this.x=x;
this.y=y;
this.area = areaCalculate();
}
Rectangle(String color, int x, int y) {
super("사각형",color);
this.x=x;
this.y=y;
this.area = areaCalculate();
}
@Override
double areaCalculate() {
return this.x*this.y;
}
}
public class Test01 {
public static void main(String[] args) {
Circle c1 = new Circle();
c1.draw();
Circle c2 = new Circle(5);
c2.draw();
Circle c3 = new Circle("yellow");
c3.draw();
Circle c4 = new Circle("red", 6);
c4.draw();
System.out.println();
Rectangle r1 = new Rectangle(4);
r1.draw();
Rectangle r2 = new Rectangle(5,8);
r2.draw();
Rectangle r3 = new Rectangle("white",5);
r3.draw();
Rectangle r4 = new Rectangle("green",6,4);
r4.draw();
}
}
생성자 매개변수가 적은 순서로 정렬하기!
메소드명이랑 변수명이랑 다르게하기!
this() 잘 활용하기!
[풀이 후 보완할 점]
Shape의 this.area 초기화할 때 double 타입이니까 0.0으로 해주기.
Circle(){
this(1,"검정");
}
Circle(String color){
this(1,color);
}
Circle(int radius){
this(radius,"검정");
}
Circle(int radius,String color){
super("원",color);
this.radius=radius;
}
부모 생성자를 활용하려고 this()를 사용하지 않았는데 풀이 때는 따로 다시 검정을 지정해서 사용했다.
특이 케이스가 아니라면 해당 방식으로 진행 (정사각형, 직사각형을 분리하는 경우 같은)
지금은 생성자 코드가 짧지만 복잡해지면 이 방식이 더 나아서 그렇게 진행하는 것 같다.
(+
기존 풀이한 방식은 초기화 코드가 각 생성자에 분산되어 있어, 변경이 필요할 때 여러 곳을 수정해야하는 방면,
풀이해준 방식은 기본값 초기화가 한 곳에 모여있어 유지보수가 쉽고, 호출 순서가 한 눈에 보인다.
가독성도 더 좋다.
)
PI(static 변수)사용할 때 클래스명 잊지 말것
this.area=this.radius*this.radius*Circle.PI;
'problem solving > 과제&실습 코딩' 카테고리의 다른 글
[실습/JAVA] 포켓몬 프로그램에 추상화, 캡슐화 더하기 (2) | 2024.07.12 |
---|---|
[실습/JAVA] 동물의 숲 주민 만들기 (0) | 2024.07.04 |
[과제/JAVA] 학생부 프로그램에 객체 더하기 (+풀이 0703) (1) | 2024.07.02 |
[실습/JAVA] Car class로 오버로딩 연습 (+풀이 0702) (0) | 2024.07.02 |
[실습/JAVA] 학생으로 클래스 연습하기 (+풀이 0701) (0) | 2024.07.01 |