프로그래밍/JAVA

클래스의 메모리 구조 및 참조관계

코딩딩 2016. 3. 28. 11:26

Point 클래스와 Circle 클래스를 이용하여 원의 반지름(Radius), 중심값(Center)을 입력, 출력하는 프로그램

// 메인함수

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