메소드로 한 문자, 상수 문자열, 숫자를 전달하면 전부 값에의한 호출이라고 하고 Call By Value 라고 합니다.
Pay1.java
package classtest;
class Pay1{
String name=""; //직원 이름
int pay=0; //급여
int comm=0; //보너스
int tax=0; //세금
public Pay1(){ }
public void name(String name){
[this.name](http://this.name/) = name;
}
public void tax(float f){
tax = (int)(pay * f);
}
public void pay(int pay){
this.pay= pay;
}
public void comm(int comm){
this.comm = comm;
}
public int earn(){
int total = (pay + comm)-tax;
return total;
}
}
Employee_arg.java
public class Employee_arg {
public static void main(String[] args) {
String name="아로미"; //성명
int pay=1500000; //급여
int comm=200000; //보너스
Pay1 p = new Pay1();
p.pay(pay);
p.name(name);
p.tax(0.05f);
p.comm(comm);
System.out.println("이름:"+p.name);
System.out.println("실수령액:"+p.earn());
}
}
Call By Reference: 참조값에 의한 호출(Hash Code)
메소드로 참조type을 전송할 수 있습니다.
메소드로 클래스의 객체를 전달하면 메모리가 전달되는 것이 아니라 객체를 가르키고있는 Hash Code가 전달됨으로 Call By Reference 라고 합니다.
Call By Reference의 경우 참조값(Hash Code)을 전달한 객체는 자신의 참조값이 전달됨으로 값의 변화가 발생할 수 있고 heap memoey를 공유하게 됩니다.
Call By Value/Reference 예제
Pay.java
class Pay{
int ppp;
public void payRefer(Pay p){
p.ppp = p.ppp + 2000;
}
public void payValue(int i){
i = i + 2000;
}
}
PayTest.java
public class PayTest {
public static void main(String[] args) {
Pay p = new Pay();
p.ppp = 10;
int i = 10;
p.payRefer(p); //call by reference로 전달
p.payValue(i); //call by value로 전달
System.out.println(p.ppp); //객체가 변경되서 2010
System.out.println(i);//10
}
}
Ref.java, 데이터 클래스
public class Ref {
public String area = ""; // 지역
public int oil = 0; // 평군 기름값
public String sobi = ""; // 전년 동월대비 소비량
}
RefMgr.java, 데이터 조작 클래스
public class RefMgr {
/**
* 객체를 받아 출력합니다.
* @param ref 출력할 객체
*/
public void print(Ref ref){
System.out.println("지역: " + ref.area);
System.out.println("평균 기름값: " + ref.oil);
System.out.println("전년 동월 대비 소비량: " + ref.sobi);
}
public void calc(Ref ref){
int add = (int)(ref.oil * 0.2); // 20% 기름값 인상
int tax = 20;
ref.oil = ref.oil + add + tax; // 원 가격 + 인상분 + 세금
}
}
RefUse.java 콤포넌트 이용 클래스
public class RefUse {
public static void main(String[] args){
RefMgr m = new RefMgr();
Ref ref = new Ref();
ref.area = "서울";
ref.oil = 2050;
ref.sobi = "70%";
// Call By Reference
// 메소드로 숫자, 문자뿐만 아니라 클래스의 객체도
// 넘겨 줄 수 있습니다.
m.print(ref); // 2050
// 기름 평균 값 인상 처리 사용
m.calc(ref);
System.out.println("1차 변경된 기름값: " + ref.oil);
m.calc(ref);
System.out.println("2차 변경된 기름값: " + ref.oil);
}
}
String객체의 특징
한번생성된 객체는 불변이다.("안녕" ->(X) "안녕하세요")
클래스를 객체화할때 new를 사용하지만 String은 사용하지 않아도 된다.(String name = "홍길동";)
메모리상에서 같은 문자열은 공유합니다. String name = "홍길동"; String str = "홍길동"; name hashcode와 str hashcode는 같습니다.