Languages/Java

[Java] Call by Value & Call by Reference

2023. 7. 24. 07:16
목차
  1. Call By Value
  2. Call by Reference
  3. C/C++과 Java의 차이
  4. C/C++
  5. Java

Call By Value

값에 의한 호출이다. 이 방식에서는 메서드 호출 시 전달되는 값이 메서드 내부로 복사되어 전달된다. 즉, 메서드 내부에서 매개변수 값을 변경하더라도, 그 변경이 호출자에게 영향을 미치지 않는다.

void updateValue(int value) {
    value = 50;
}

public static void main(String[] args) {
    int value = 30;
    System.out.println("Before: " + value); // Output: Before: 30
    updateValue(value);
    System.out.println("After: " + value);  // Output: After: 30
}

위의 예제에서 'updateValue' 메서드는 매개변수로 받은 값을 변경하려고 시도한다. 그러나 이 변경은 'updateValue' 메서드 내에서만 유효하며, 'main' 메서드 내의 'value' 변수에는 아무런 영향을 미치지 않는다.

 

Call by Reference

참조에 의한 호출이다. Java는 사실상 참조에 의한 호출을 지원하지 않는다. 그러나 객체를 매개변수로 전달할 때, 그 객체의 "참조 값"이 복사되어 전달되므로 이를 "참조에 의한 호출"로 잘못 이해하는 경우가 있다.

class Test {
    int value;
}

public static void updateValue(Test t) {
    t.value = 50;
}

public static void main(String[] args) {
    Test test = new Test();
    test.value = 30;
    System.out.println("Before: " + test.value); // Output: Before: 30
    updateValue(test);
    System.out.println("After: " + test.value);  // Output: After: 50
}

이 경우, 'updateValue' 메서드는 객체의 참조를 매개변수로 받아 객체 내부의 필드 값을 변경한다. 이때 변경이 호출자에게 영향을 미치는데 참조가 가리키는 실제 객체의 값을 변경했기 때문이다. 그러나 이 것은 "참조 값의 복사"에 의한 것이므로, 순수한 Call by Reference라고 부르기는 어렵다. 왜냐하면, 메서드 내에서 전달받은 참조 자체를 변경하더라도, 그 변경이 호출자에게 영향을 미치지 않기 때문이다.

 

참조 자체를 변경하는 예시 코드:

class Test {
    int value;
}

public static void updateValue(Test t) {
    t = new Test();
    t.value = 50;
}

public static void main(String[] args) {
    Test test = new Test();
    test.value = 30;
    System.out.println("Before: " + test.value); // Output: Before: 30
    updateValue(test);
    System.out.println("After: " + test.value);  // Output: After: 30
}

따라서 Java는 기본적으로 "Call by Value"를 사용하되, 객체를 전달할 때는 "참조 값의 복사"를 이용한다.

 

C/C++과 Java의 차이

C/C++

C/C++는 매개변수를 전달하는 두 가지 방식, 즉 Call by Value와 Call by Reference를 모두 지원한다.

Call by Value: 이 방식은 매개변수를 함수에 전달할 때, 실제 값이 복사되어 전달된다. 따라서 함수 내에서 매개변수 값을 변경하더라도 호출자에게 영향을 주지 않는다.

Call by Reference: 이 방식은 매개변수를 함수에 전달할 때, 실제 변수의 주소값을 전달한다. 따라서 함수 내에서 매개변수 값을 변경하면, 그 변경이 호출자에게도 반영된다. 이 방식은 '&' 연산자 또는 포인터를 이용해 구현할 수 있다.

 

Java

Java는 기본적으로 Call by Value만 지원한다.

저작자표시 (새창열림)

'Languages > Java' 카테고리의 다른 글

[Java] Casting  (0) 2023.08.10
[Java] 문자열 클래스 & 오브젝트 클래스  (0) 2023.08.10
[Java] 직렬화 (Serialization)  (0) 2023.07.31
[Java] 오토 박싱(Autoboxing) & 오토 언박싱(Unboxing)  (0) 2023.07.31
[Java] Primitive Type & Reference Type  (0) 2023.07.31
  1. Call By Value
  2. Call by Reference
  3. C/C++과 Java의 차이
  4. C/C++
  5. Java
'Languages/Java' 카테고리의 다른 글
  • [Java] 문자열 클래스 & 오브젝트 클래스
  • [Java] 직렬화 (Serialization)
  • [Java] 오토 박싱(Autoboxing) & 오토 언박싱(Unboxing)
  • [Java] Primitive Type & Reference Type
dbssk
dbssk
dbssk
K.Back-end
dbssk
  • 분류 전체보기 (220)
    • 끄적 (0)
    • TIL (8)
      • Trouble Shooting (1)
    • Programmers (94)
      • Lv.0 (29)
      • Lv.1 (40)
      • Lv.2 (25)
    • 백준 (15)
    • 구름 (0)
    • Computer Science (79)
      • 컴퓨터 구조 (3)
      • Operating System (18)
      • 알고리즘 (9)
      • 자료구조 (11)
      • Database (10)
      • Network (8)
      • Web (12)
      • Design Pattern (8)
    • Spring (2)
    • Languages (13)
      • Java (13)
    • 북 스터디 (9)
      • 스프링 부트 핵심 가이드 (9)
      • 자바 코딩 인터뷰 완벽 가이드 (0)
    • 프론트엔드 (0)

인기 글

최근 글

태그

  • 개발자이력서
  • LV.1
  • LV.2
  • Lv.0
  • 백엔드스쿨
  • 프로그래머스
  • 개발자취준
  • 백준
  • 배열
  • 스택
  • 개발자취업
  • 해시
  • 개발자포트폴리오
  • hash
  • 백엔드공부
  • 코딩테스트
  • stack
  • java
  • 자료구조
  • spring
hELLO · Designed By 정상우.
dbssk
[Java] Call by Value & Call by Reference
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.