값에의한 호출
Call By Value/Reference
Call By Value: 값에 의한 호출
보통 숫자 계열 값을 메소드 호출시 메소드로 전송하는 경우가 해당이 됩니다.
메소드로 한 문자, 상수 문자열, 숫자를 전달하면 전부 값에의한 호출이라고 하고 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는 같습니다.
문자열을 변경할때 ("안녕" -> "안녕하세요") 메모리상에는 "안녕"이라는 객체와 "안녕하세요"라는객체가 둘다 존재합니다.변경되어지는 객체가 있을때마다 새로운 객체가 만들어집니다.
String 객체의 데이터 전달 유형
StringTest.java
public class StringTest {
public void changeString(String src){
src = "JSP";
}
public static void main(String[] args) {
//System.out.println("ABCD".toLowerCase());
//System.out.println("ABCD".hashCode());
String step = "JAVA";
StringTest st = new StringTest();
System.out.println(step);
st.changeString(step); //JSP로 변경하기 위해 할당
System.out.println(step);
}
}
Last updated