본문 바로가기

프로그래밍/JAVA

캡슐화


< Point 클래스 >

class Point{
int xPos, yPos;

public Point (int x, int y){
xPos=x;
yPos=y;
}

public void showPointInfo(){
System.out.println("[" + xPos+", "+yPos+"]");
}
}

  위 클래스를 활용해 원을 의미하는 Circle 클래스를 정의하자. Circle 클래스는 좌표상의 위치 정보(원의 중심좌표 x, y)와 반지름의 길이 정보를 저장할 수 있어야 한다.


  그리고 Circle 클래스를 기반으로 Ring 클래스를 정의하자. 링은 두 개의 원(바깥쪽 원, 안쪽 원)으로 표현해야 하며, Circle 인스턴스를 기반으로 정의가 가능하다. 참고로 안쪽 원과 바깥쪽 원의 중심좌표가 동일하다면 두께가 일정한 링을 표현하는 것이다. 이렇게 해서 클래스 정의가 완료되면 다음 main 메서드를 기반으로 실행을 하자.


<메인 메서드> 

public class PointTest {

public static void main(String[] args) {
// TODO Auto-generated method stub
Ring ring = new Ring(1, 1, 4, 2, 2, 9);
ring.showRingInfo();
}
}


위 메인 메서드는 건드리지 않는다.


 Ring 생성자를 통해서 전달된 1,1,4는 안쪽 원(x,y, 반지름)이며, 2,2,9는 바깥쪽 원(x,y,반지름)이다. 그리고 실행의 결과는 다음과 같거나 유사해야 한다.


Inner Circle Info...

radius : 4

[1, 1]

Outer Circle Info

radius : 9

[2, 2]


  참고로 하나의 클래스를 정의하더라도, 항상 캡슐화를 고민하기 바란다. 이 문제의 답안도 캡슐화에 대한 고민여부에 따라서 약간의 차이를 보일 수 있다.



<풀이과정>


class Point{
int xPos, yPos;

public Point (int x, int y){
xPos=x;
yPos=y;
}

public void showPointInfo(){
System.out.println("[" + xPos+", "+yPos+"]");
}
}


문제에서 Point 클래스를 활용해 Circle 클래스를 만들고, Circle클래스를 이용해 Ring 클래스를 만든 뒤

안쪽 원과 바깥쪽 원을 만들어야 한다고 했다. 먼저 "Point" 클래스를 이용해 Circle 클래스를 만들어 보자.

 코드를 만들면서 생각해야 할 첫번째 주안점은 '효율성'이다. 

  즉, 기존 코드를 재활용해 군더더기 없어야 한다. 


  가장 떠올리기 힘든 포인트는 Point point인듯 하다. 

  문제의 착안점은 Point의 x좌표와 y좌표를 이용해 Circle의 x좌표와 y좌표에 활용해야 한다. 

<지면 절약을 위해 핵심만 추려냄>


  Circle 생성자는 매개변수로 x, y, r을 전달받는다. 단, Point의 xPos와 yPos에 값을 저장해야 하므로

  Point타입의 인스턴스를 생성해줘야 Point 클래스에 접근이 가능하다.

  다음줄에서 x좌표값과 y좌표값을 저장하는 모습을 볼 수 있다.


  왼쪽 코드에는 point.xPos=x;, point.yPos=y;를 만들어줬지만 사실상 없어도 된다.

  이런 것이 효율성이다.

 

  Circle 클래스를 만들었으니 Ring 클래스를 만들어보자.



  메인메서드에서 인자가 6개 전달되니 Ring 클래스의 생성자도 6개의 매개변수를 전달받아야 한다.

  또한 이를 고려해서 코드를 작성해야 한다. 1, 1, 4까지가 안쪽 원 / 2, 2, 9까지가 바깥쪽 원이다.


class Ring{
Circle inner;
Circle outer;

public Ring(int inX, int inY, int inR, int outX, int outY, int outR){
inner=new Circle(inX, inY, inR);
outer=new Circle(outX, outY, outR);
}

public void showRingInfo(){
System.out.println("Inner Circle Info...");
inner.showCircleInfo();
System.out.println("Ouuter Circle Info");
outer.showCircleInfo();
}
}

 Circle 클래스가 만들어져있으니 이를 활용할 수 있다.