[TIL] CallByValue,CallByReference / 변수 값

이해찬·2023년 7월 3일
0

TIL

목록 보기
2/20
post-thumbnail

23.07.04 - D+34, 기본형 값과 참조형 값의 차이

기록양식 (TIL)
1. 사용 개념
2. 의문점 or 문제
3. 시도해 본 것들(+응용) or 삽질
4. 해결
5. 알게 된 점(회고)

변수의 값

  • Call by Value : 이 방식에서는 변수의 원래 값이 함수에 복사되어 전달됩니다. 이 말은 함수 내에서 변수 값을 변경해도 원래 변수의 값에는 영향을 미치지 않는다는 것입니다.
  • Call by Reference : 이 방식에서는 변수의 참조(주소)가 함수에 전달됩니다. 이 말은 함수 내에서 참조를 통해 변수의 실제 값을 변경할 수 있다는 것입니다. 자바에서는 기본 데이터 유형(원시 데이터 유형)에 대해서는 Call by Value만 지원하지만, 객체에 대해서는 Call by Reference를 사용할 수 있습니다.

Call by value -> Call by reference

📟입력

public static void sum(int a){
	a+= 400;
    System.out.println(a);
}

public static void main(String[] args){
	int a= 100;
    sum(a);
    System.out.println(a);
}

💻 출력
1. sum(a); -> 인자값을 받는 메서드를 호출한다.
2. 메서드 내에서 인자값을 받은 결과가 처리된다.
3. a의 인자값을 받은 a+=400은 500이 된다.
4. System.out.println(a);의 출력값은 500.
이 값은 callbyvalue로 복사된 값이기 때문에 기존 a의 값에 영향을 미치지 않는다.
5. sum 함수가 종료되고, 제어가 다시 main 함수로 돌아간다. 이 때의
System.out.println(a);은 여전히 인자값 100이다. sum의 변경사항이 반영되지 않기 때문에

객체 생성, 참조형

📟풀이

public class TestNumber{
	int num;
	public TestNumber(int num){
		this.num = num;
	}
}

public class Java100{
	public static void sum(int a){
		a+= 400;
		System.out.println(a);
	}
	
	public static void main(String[] args){
		TestNumber a = new Testnumber(100);
		sum(a);
		System.out.println(a);
	}
}

문제점
1. 파일당 하나의 public 클래스 허용되기 때문에 👉 저장된 이름 외에 클래스의 public삭제
2. public static void sum(int a) 👉 public static void sum(TestNumber a) 클래스 타입을 삽입
3. a+= 400; 👉 객체 자체에 더하는 것이 아닌, 객체의 속성 중 int로 되어있는 num에 더해야 한다.
4. sum(a),sout(a) 👉 num의 값이 아닌 집의 주소값만을 호출 중
5. new Testnumber 👉 new TestNumber 대소문자 주의

해결

알게된 점

CallByValue : 기본형, 값에 의한 호출 > 값 자체를 복사해서 붙여준다.
CallByReference : 참조형, 주소에 의한 호출 > 주소 값 자체, 본체를 공유한다.

객체 자체에 어떠한 행위를 하는 것이 아닌, 객체가 가지고 있는 속성과 일치하게끔 이름을 불러주어야 한다.

profile
디자인에서 개발자로

0개의 댓글