// 메인함수
public class CircleTest {
public static void main(String[] args) {
Point p1 = new Point();
Point p2 = new Point(2,3);
Circle c1 = new Circle();
c1.setRadius(20);
System.out.println(p1);
System.out.println(p2);
System.out.println(c1);
c1.setCenter(p2);
System.out.println(c1);
p2.setX(12);
p2.setY(17);
System.out.println(c1);
}
}
public class Circle {
private int radius;
private Point center;
public Circle(){
radius = 0;
center = new Point();
}
public Circle(int radius, Point center){
this.radius = radius;
this.center = center;
}
public int getRadius() {
return radius;
}
public void setRadius(int radius) {
this.radius = radius;
}
public Point getCenter() {
return center;
}
public void setCenter(Point center) {
this.center = center;
}
@Override
public String toString() {
return "Circle [radius=" + radius + ", center=" + center + "]";
}
}
//Point 클래스 객체 만들기
public class Point {
private int x;
private int y;
//첫번쨰 생성자 만들기
public Point(){
x = y = 0;
}
//두번쨰 생성자 만들기
public Point(int x, int y) {
this.x = x;
this.y = y;
}
//toString함수 만들어서 결과값 return
@Override
public String toString() {
return "(" + x + " , " + y + ")";
}
//getter/setter만들기
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
[프로그램 출력결과]
(0 , 0)
(2 , 3)
Circle [radius=20, center=(0 , 0)]
Circle [radius=20, center=(2 , 3)]
Circle [radius=20, center=(12 , 17)]
메모리 할당 구조 설명 그림
1. point 클래스 p1,p2 생성
2. Circle 클래스 c1을 생성
3. c1.setRadius(20); -> c1에 반지름(radius) 20을 입력
4. c1 생성시 point 클래스 생성되고 그 값을 중심값(center)의 참조위치 설정( point 클래스의 위치를 기억 )
5. c1.setCenter(p2); -> c1의 중심값(center)의 참조위치를 p2로 설정
6. p2의 값을 12, 17로 바꾸면 c1의 중심값(center)값도 바뀜 -> 값 자체를 기억하지 않고 위치(참조위치)를 기억하기 때문
그런데, 위의 그림의 경우
public void setCenter(Point center)
{
this.center = center;
}
의 코드에 따라
p2 의 값을 바꾸면 c1의 중심값(center)도 바뀌게 된다.
이를 방지하기 위해서
this.center = center;
▼
this.center.setX(center.getX());
this.center.setY(center.getY());
로 변경해준다.
그결과에 따른 메모리 구조는 다음 그림과 같다.
a. p2의 x,y 값을 c1의 중심값(center)에 set 해준다.
b. 이 상태에서는 p2의 값을 변경하더라도 c1의 중심값에는 영향이 없다.
[ 코드 변경 후 실행결과]
(0 , 0)
(2 , 3)
Circle [radius=20, center=(0 , 0)]
Circle [radius=20, center=(2 , 3)]
Circle [radius=20, center=(2 , 3)]
'프로그래밍 > JAVA' 카테고리의 다른 글
상속 개념파악하기! (0) | 2016.03.30 |
---|---|
정적 변수 (static variable) (0) | 2016.03.29 |
변수의 종류 와 사용영역 (0) | 2016.03.29 |
[Matrix] 행렬곱 프로그래밍 (0) | 2016.03.25 |
선택정렬 (0) | 2016.03.23 |