일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- kotiln functional interface
- Spring ipfs
- 백준 1504 java
- java 파티
- 백준 2252 줄세우기
- ipfs singletone
- ipfs bean
- java 팩토리얼 개수
- java 백준 1509
- kotiln const val
- rabbitmq 싱글톤
- Java Call By Refernce
- javav 1676
- java 1509
- mongodb lookup
- spring mongodb
- 전략 패턴이란
- spring mongoTemplate switch
- 자바 1676
- 백준 특정한 최단 경로
- java 1238
- spring mongodb switch
- nodejs rabbitmq
- go
- 자바 백준 팩토리얼 개수
- 백준 연결요소 자바
- 익명 객체 @transactional
- kotiln const
- 안정해시
- spring mongoTemplate
Archives
- Today
- Total
공부 흔적남기기
Java Call by Value ? Call by Reference? 본문
728x90
반응형
먼저 Call by Value가 됐든 Refernce가 됐든 여기서 말하는 Call 이란 무엇일까?
여기서 Call 의 의미는 메소드를 호출해서 인수를 넣을 때를 말하는 것이다.
Call by Value
call By Value는 인수가 메소드 블럭으로 넘어갈 때 새로운 변수 (스택에 생성)에 이전 블럭에서 사용하던 변수의 값 자체를 넣어주는 것이다.
Call by Reference
call By Reference 는 인수가 메소드 블럭으로 넘어갈 때 새로운 변수 (스택에 생성)에 이전 블럭에서 사용하던 변수의 값 자체가 아닌 참조를 넣어줌으로서 새로운 변수와 이전 블럭에서 선언한 변수가 같은 주소를 가리키게 하는 것이다. C에서 흔히 포인터를 통해 Call By Reference를 사용할 수 있다.
Java에서는? Call By Value가 적용되어 있다.
가끔 어? 나는 객체를 메소드의 인자로 보내서 사용하니 Call By Reference 처럼 잘 사용되던데? 라고 생각할 수 있지만 Java 의 변수안에 객체의 주소값이 들어가 있기 때문에 메소드의 새로운 변수로 해당 값을 지니게 되어 call By Refernce 처럼 보이는 것이다. 예를 들어 해당 변수에 new를 통해 새로운 객체를 할당하면 이전 블럭의 코드에는 전혀 영향을 미치지 못하는것을 확인 할 수 있다.
cf). primitive type은 값 자체가 들어가 있다.
public class Call {
public static void main(String[] args) {
//출력을 예상해 보자
int primitiveNumber = 1;
int[] numbers = {1, 2, 3, 4, 5};
NumberSet ns = new NumberSet();
change(primitiveNumber, numbers, ns);
System.out.println(primitiveNumber);
System.out.println(numbers[0]);
System.out.println(ns.primitiveNumber);
System.out.println(ns.numbers[0]);
change(ns.primitiveNumber, ns.numbers, null);
System.out.println(ns.primitiveNumber);
System.out.println(ns.numbers[0]);
}
public static class NumberSet {
int primitiveNumber = 1;
Integer wrapperNumber = 2;
int[] numbers = {1, 2, 3, 4, 5};
}
public static void change(int primitiveNumber, int[] numbers, NumberSet ns) {
primitiveNumber = primitiveNumber + 1;
numbers[0] = numbers[0] + 1;
if (ns != null) {
ns.primitiveNumber = ns.primitiveNumber + 1;
ns.numbers[0] = ns.numbers[0] + 1;
}
}
}
헷갈릴 수도 있는데 잘 봐보시길 ...
728x90
반응형
'프로그래밍 언어 > Java' 카테고리의 다른 글
JAVA 자바 ThreadLocal 쓰레드 로컬이란 (0) | 2023.05.16 |
---|---|
JAVA 자바 프로세스와 쓰레드 (0) | 2023.05.16 |
JAVA 자바 기본적인 배경지식 (0) | 2023.05.09 |
java string 문자열 뒤집기 reverse하기 (0) | 2022.01.15 |
java ArrayList.contains 헷갈리는 부분 (0) | 2022.01.15 |