[Java] 3_4_1_상속 예제

나영원·2020년 8월 30일
0

Java_basic2

목록 보기
22/37
import java.util.Arrays;

/**
 * 아래 테스트 코드가 정상 동작하도록 클래스들을 완성하시오.
 *
 * getArea(): 사각형의 넓이를 반환한다.
 * getCenterOfMass(): 사각형의 질량중심을 반환한다.
 * GetAllPoints(): 사각형의 네 점을 배열로 반환한다.
 * rot90(): Pivot을 기준으로 사각형을 90도 회전시킨다.
 */


class Vector2D {
    public float x, y;

    public Vector2D(float x, float y) {
        this.x = x;
        this.y = y;
    }

    public String toString() {

        return this.x +","+this.y;
    }
}

class RectCore {
    protected Vector2D pos;
    protected float w, h;


    public RectCore(float x, float y, float w, float h) {
        this.pos = new Vector2D(x, y);
        this.w = w;
        this.h = h;
    }

    public String toString() {

        return "RECTCORE("+this.pos+","+w+","+h+")";
    }
}


public class Rect extends RectCore {
    String rotRec;

    public Rect(float x, float y, float w, float h) {
        super(x, y, w, h);
        rotRec = "";
    }
    // 위에 객체가져오기위해서 super()해야했음

    public float getArea() {

        return this.w * this.h;
    }

    public Vector2D getCenterOfMass() {

        return new Vector2D(pos.x + (w /2.0f), pos.y +(h /2.0f));
    }

    public Vector2D [] getAllPoints() {

        return new Vector2D[]{ pos,
                               new Vector2D(pos.x,(pos.y+h)),
                               new Vector2D((pos.x+w),pos.y),
                               new Vector2D((pos.x+w),(pos.y+h))};
    }


    public void rot90(Vector2D pivot) {
        Vector2D[] oldPoints = getAllPoints();
        Vector2D[] newPoints = new Vector2D[4];
        for (int i = 0; i < oldPoints.length; i++) {
            newPoints[i] = new Vector2D(
                    -(oldPoints[i].y - pivot.y) + pivot.x,
                    (oldPoints[i].x - pivot.x) + pivot.y);
        }

        float min_x = newPoints[0].x;
        float min_y = newPoints[0].y;
        float max_x = newPoints[0].x;
        float max_y = newPoints[0].y;

        for (Vector2D twoD : newPoints) {
            min_x = Math.min(min_x, twoD.x);
            min_y = Math.min(min_y, twoD.y);
            max_x = Math.max(max_x, twoD.x);
            max_y = Math.max(max_y, twoD.y);
        }
        pos = new Vector2D(min_x, min_y);
        w = max_x - min_x;
        h = max_y - min_y;
    }

        @Override
        public String toString () {
            String s = super.toString();
            s += "\n Area: "+getArea();
            s += "\n CoM: "+getCenterOfMass();
            s += "\n";
            return s;
        }


    }


class RectTest {
    public static void main(String[] args) {
        Rect rect = new Rect(0.5f, 0.7f, 1.5f, 2.3f);
        System.out.println("Area: " + rect.getArea());
        System.out.println("CoM: " + rect.getCenterOfMass());
        System.out.println("All Points: " + Arrays.toString(rect.getAllPoints()));

        rect.rot90(new Vector2D(0.4f, 0.2f));
        System.out.println("Rotated rect: " + rect);
        // toString 메서드자체가 오버라이드 되면 객체명을 썼을 때 그 출력문을 출력하게 되어있데

    }
}
  • 수학적 개념이 어려웠던 예제인데 실무에 가면 수학적 개념을 통한 문제해결 많이 하게 될테니 나올때마다 익숙해져야한다

  • 메서드에서 로컬변수 만들지 않고 return 값에 바로 출력될 수 있게 하는것 연습하자

  • 해당 상황에서만 할 수 있는 해답이 아닌 하나의 원리를 발견해서 여러상황에서 사용할 수 있는 코드를 만들자

  • 자바 키워드 암기 뿐 만아니라 이런 문제를 해결할 수 있는 능력을 키우는데 중점 두자

profile
배우는 개발 일기

0개의 댓글