[Java] Call by Value, Call by Reference
by 무작정 개발이번에는 Call by Value(값에 의한 호출) & Call by Reference(참조에 의한 호출)에 대해 정리할 것이다.
매우 유용한 글을 보아서 그 글을 참고하여 정리하였습니다.
Java를 보다 깊게 이해하기 위해 다시 한번 복습하면서 글을 작성 중입니다.
기초적인 내용은 다루지 않을 예정입니다.
Call by Value
Call by Value 란 함수 호출 시 넘기는 인자의 값이 매개 변수에 복사되어 함수 내에서 매개 변수에 직접적인 데이터 조작을 가해도
인자에 영향을 주지 않는 것을 말한다. 여기서의 값은 주소 값이 아닌 그 자체로 유의미한 데이터를 뜻한다.
Call by Reference
Call by Reference 또한 인자의 값이 매개 변수에 복사된다는 점은 Call by Value와 동일하다.
하지만 복사되는 값이 주소 값이라는 큰 차이점이 있다.
-> 위의 정의를 쉽게 정의하자면
Call by value : 자료형과 같은 값으로 끝나는 것들(8가지 자료형)
Call by Reference : 자료형 외 모든 것, 값으로 끝나지 않고 포인터(pointer)가 달려있다. Java는 모든 것이 pointer이다.
이제 예제를 통해 알아보자.
- 아래는 String이라는 문자형이다. (자료형 X)
public class JavaEx {
public static void main(String[] args) {
// String(문자열) : 사이즈를 알 수 없다.
String st = "안녕하세요";
}
}
String 형 st는 문자열이기 때문에 사이즈를 알 수 없다.
자료형의 경우는 int, double, long, boolean 각자의 사이즈가 정해져 있지만 문자열은 아니다.
이때 사용되는 개념이 바로 포인터(Pointer)이다.
엄청 큰 물건(데이터) 인 "안녕하세요"는 자료형이 아니다.
자료형이 아니라는 의미는 데이터 공간을 정해둘 수 없다는 것이다. 하지만 "안녕하세요"라는 데이터는 크더라도 꼭 가지고 있어야 한다.
창고를 예시로 들자면 창고(Stack)에 "안녕하세요"가 안 들어가지니 외부에서 엄청 큰 창고(Heap)를 빌리고 엄청 큰 창고(Heap)에 놓고 올 수 있다.
외부 큰 창고에 놓게 된다면 이미 그 창고에 들어와 있던 큰 물건들 옆에 차곡차곡 쌓으면 데이터는 쌓기 시작해야 하는 순서에
*(포인터)를 사용하여 숫자를 부여한다.
그리고 외부의 큰 창고를 작은 열쇠 (*2)로 간직하면 언제든 외부의 큰 창고를 열 수 있으니 작은 열쇠는 스택(Stack)에 둔다.
그리고 이때 스택(Stack)의 크기를 4Byte로 고정해 주는데 4Byte는 약 45억 개 정도 주소를 표시할 수 있어 충분하다.
결론
Java가 이렇게 작동하는 이유는 메모리 공간을 효율적으로 쓰기 위해서이다.
사용할 필요가 없는 정보를 삭제하면서 메모리 공간을 유지해준다. 이렇게 버려진 정보, 동적 소멸한 정보를 정리해 주는 것을
"garbage collection" 혹은 "GC"라고 부른다.
GC에 대해 더 자세한 내용은 하단에 있는 이전 글 참고.
Reference
'Language > Java' 카테고리의 다른 글
[Java] 자료형(묵시적 형변환, 명시적 형변환) (2) | 2022.10.30 |
---|---|
[Java] main 함수 (1) | 2022.10.24 |
[Java] Stack, Heap (2) | 2022.10.11 |
[Java] Java는 compile 언어? interpreter 언어? (0) | 2022.10.10 |
[Java] JVM와 바이트 코드 (0) | 2022.10.04 |
블로그의 정보
무작정 개발
무작정 개발