본문 바로가기
It Study/프로그래밍 공부

상속과 다형성을 활용한 java 도형 예제

by prlkt5200 2024. 9. 11.
반응형

클래스가 나눠져있으니 알맞게 나눠서 작성해보시면 좋을듯 합니다.

또한 제가 공부하면서 코드리뷰도 달았으니, 참고 하실 분들은 참고하시면 됩니다.

 

 

좌표 클래스

package package2;


//포인트 객체를 만들고 이를 좌표값을 활용하려는 것이다.
public class Point {

	public int x;
	public int y;

	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

}

 

 

 

도형 클래스

package package2;

//도형의 형질을 물려줄 클래스이다.
public abstract class Shape {
	
	//외부에서 접근 못하게 막아둔 객체이기에 get set이 필요하다.
	private String brushColor;
	private String penColor;

	
	//생성자를 통해서 필드 값을 한번 초기화 해줄 수 있다.
	Shape(String brushColor, String penColor) {
		this.brushColor = brushColor;
		this.penColor = penColor;
	}

	//이거는 자식 객체에서 재정의 해서 쓸 메소드이다.
	abstract void drawing();

	//도형 형질에 저장되는 외부객체를 차단한 컬러 속성을 가져오는 것이다. 
	public String getBrushColor() {
		return brushColor;
	}

	public String getPenColor() {
		return penColor;
	}

}

 

 

사각형 클래스

package package2;

public class Square extends Shape {
	
	//좌표 값을 의미하는 포인트 객체를 가져올 변수이다.
	private Point leftTop;
	private Point rightBottom;

	
	//생성자를 통해서 부모 클래스의 형질과 이 클래스의 좌표 객체 변수와 좌표 객체를 이어준다.
	public Square(String brushColor, String penColor, Point leftTop, Point rightBottom) {
		super(brushColor, penColor);
		this.leftTop = leftTop;
		this.rightBottom = rightBottom;

	}

	Point getLeftTop() {
		return leftTop;
	}

	Point getRightBottom() {
		return rightBottom;
	}

	
	//부모클래스의 드로잉 메소드를 오버라이드 하는 것인데, super 키워드를 통해서 부모클래스에 존재하는 get 메소드 다시 말해 객체 생성 시점에서는 부모클래스 로부터
	//상속받은 메소드로 색상을 정하고, 생성자를 통해 받아온 좌표 객체의 값을 가져와 좌표를 찍어준다.
	@Override
	void drawing() {
		System.out.println("면색: " + super.getBrushColor() + "선 색: " + super.getPenColor() + "의 도형이 그려집니다.");
		System.out.println("(왼쪽 위 좌표: " + this.leftTop.x + ", " + this.leftTop.y  + " 오른쪽 아래 좌표: "
				+ this.rightBottom.x+ ", " + this.rightBottom.y + ")의 사각형을 그립니다.");
	}

}

 

 

 

 

삼각형 클래스

package package2;

public class Triangle extends Shape {

	//포인트 객체와 이어줄 변수이다.
	private Point top;
	private Point left;
	private Point right;

	//사각형 객체저럼 생성자를 통해서 이 클래스의 좌표 변수와 매개변수로 받은 좌표객체를 이어주고, 덩달아 부모 클래스의 색상 값을 변경시켜준다.
	public Triangle(String brushColor, String penColor, Point top, Point left, Point right) {
		super(brushColor, penColor);
		this.top = top;
		this.left = left;
		this.right = right;
	}

	//사각형 객체와 동일하다.
	@Override
	void drawing() {
		System.out.println("면색: " + super.getBrushColor() + "선 색: " + super.getPenColor() + "의 도형이 그려집니다.");
		System.out.println(
				"(위 좌표: " + this.top.x + ", " + "왼쪽 좌표" + this.left.x + ", " + " 오른쪽 좌표: " + this.right.x + ")의 삼각형을 그립니다.");
	}

	public Point getTop() {
		return top;
	}

	public Point getLeft() {
		return left;
	}

	public Point getRight() {
		return right;
	}

}

 

 

원 클래스

package package2;

public class Circle extends Shape {

	private Point centerPoint;

	public Point getCenterPoint() {
		return centerPoint;
	}

	public Circle(String brushColor, String penColor, Point centerPoint) {
		super(brushColor, penColor);
		this.centerPoint = centerPoint;
	}

	@Override
	void drawing() {
		System.out.println("면색: " + super.getBrushColor() + "선 색: " + super.getPenColor() + "의 도형이 그려집니다.");
		System.out.println("(가운데 좌표는: "+ this.centerPoint.x+", "+ this.centerPoint.y+") 입니다.");
		

	}

}

 

 

 

실행 

package package2;

import java.util.Scanner;

public class ShpapeExample {

	public static void main(String[] args) {
		
		//도형을 선택할 번호를 입력할 스캐너 객체와 문구 그리고 변수이다.
		Scanner sc = new Scanner(System.in);
		System.out.println("그릴 도형을 선택하세요 (삼각형: 1, 사각형: 2, 원: 3)");
		int select = sc.nextInt();
		
		
		//if 문으로 분기를 정해줬다.
		if (select == 1) {
			//아래와 동일하게 도형객체를 생성하는 데 이때 생성자의 매개변수에 알맞은 값을 넣어준다.
			//여기서는 색상값, 좌표객체이다.
			//그리고 static 변수인 ShpapeExample.shapeDrawing()를 불러오고 매개 변수에 도형 객체의 변수를 지정해준다.;

			Triangle tri = new Triangle("노란색", "파란색", new Point(50, 10), new Point(10, 50), new Point(50, 50));
			ShpapeExample.shapeDrawing(tri);

		} else if (select == 2) {
			Square rect = new Square("빨강색", "보라색", new Point(10, 10), new Point(50, 50));
			ShpapeExample.shapeDrawing(rect);
		} else if (select == 3) {
			Circle circle = new Circle("초록색","베이지색",new Point(30,20));
			ShpapeExample.shapeDrawing(circle);
		}

	}

	//부모타입의 변수를 통해서 자식객체를 여러가지 받아올 수 있는 메소드이다.
	//부모클래스의 메소드, 다시 말해 부모클래스로부터 상속받는 메소드를 불러오고 따라서 자식 객체의 메소드가 호출되는 구조이다.
	public static void shapeDrawing(Shape shape) {
		shape.drawing();
	}

}
반응형