맞다. 이는 공부하면서 구현 및 설명을 달아놓은 코드이다 주석 및 코드를 보면 이해가 될 것이라 믿는다.
package test;
public class CbvCbr2 {
/**
* @param args
*/
public static void main(String[] args) {
Person mh = new Person("강아지",33,"Galaxy",22);
Person cl = new Person("고양이",27,"IPhone",20);
System.out.println(mh);
changePerson(mh,cl);
System.out.println("changePerson() : "+mh);
changeAge(mh,cl.getAge());
System.out.println("changeAge() : "+mh);
changePhoneByPerson(mh,cl);
System.out.println("changePhoneByPerson() : "+mh);
changePhoneDirect(mh.phone,cl.phone);
System.out.println("changePhoneDirect() : "+mh);
}
public static class Person{
public String name;
public int age;
public Phone phone;
public Person(String name, int age, String PName, int PVer){
this.name = name;
this.age = age;
this.phone = new Phone(PName,PVer);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setPhone(Phone phone){
this.phone = phone;
}
public Phone getPhone(){
return this.phone;
}
public String toString(){
return name+" : "+age+phone;
}
}
public static class Phone{
String PName;
int PVer;
public Phone(String PName, int PVer){
this.PName = PName;
this.PVer = PVer;
}
public String getPName() {
return PName;
}
public void setPName(String pName) {
this.PName = pName;
}
public int getPver() {
return PVer;
}
public void setPver(int PVer) {
this.PVer = PVer;
}
public String toString(){
return " has phone : "+PName+", version : "+PVer;
}
}
public static void changePerson(Person p1, Person p2){
/*
* p1은 mh와 같은 객체를 나타내는것 같지만
* java는 call by value를 이용한다. 이 말은 매개변수로 넘어온 것이 reference가 아니라 value 라는 것이고
* 이는 p1과 mh는 같은 값을 가진 Person객체이지만 같은 객체는 아니다.
* 복사된 값이 전달된 것이다.
*
* 그래서 p1을 변경하여도 mh는 바뀌지 않는다.
*/
p1 = p2;
}
public static void changeAge(Person p1, int age){
/*
* p1은 동일하게 mh의 값이 복사된 객체로. mh와 다르다.
* 하지만 Heap 메모리상의 같은 Person 객체를 참조하고 있다.
* 그렇기때문에 Heap 메모리상의 값을 변화시키면
* mh도 같은 Heap 메모리의 값을 참조하기때문에 같이 변경되게 된다.
*/
p1.setAge(age);
}
public static void changePhoneByPerson(Person p1, Person p2){
/*
* 위의 chageAge() 와 동일하다. 같은 heap 메모리 값을 참조하는 phone를 변경했기때문에 적용된다.
*/
p1.setPhone(p2.phone);
}
public static void changePhoneDirect(Phone p1, Phone p2){
/*
* changePerson() 와 동일하다. 복사된 값에 값을 초기화해주었기때문에 실제값에 영향을 주지 않는다.
*/
p1 = p2;
}
}
'JAVA' 카테고리의 다른 글
자바FX 권유하지 않습니다.. (2) | 2023.12.08 |
---|---|
javaFX, java, jar 를 exe로 만들기 관련 (1) | 2023.12.07 |
변수, 기본형, 참조형 선언 with 메모리 (1) | 2022.12.26 |
==연산자와 .equals() 그리고 hashCode (0) | 2022.01.27 |
정렬 알고리즘(2) - 기본적인 정렬 알고리즘 (0) | 2021.04.16 |