코딩항해기

[실습/JAVA] 모양을 상속받는 원과 사각형 (+풀이 0703) 본문

problem solving/과제&실습 코딩

[실습/JAVA] 모양을 상속받는 원과 사각형 (+풀이 0703)

miniBcake 2024. 7. 3. 12:06

 

[요구사항대로 문제해결하기]
모양 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;