Benji3
개발 일지
Benji3
전체 방문자
오늘
어제
  • 전체 (50)
    • 세미나 (3)
    • 공부노트 (47)
      • 스프링 (10)
      • 머신러닝 (2)
      • 자바 (4)
      • 클라우드 (7)
      • 개발서적 (3)
      • 데이터베이스 (6)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • rubyonrails
  • 프로그래밍
  • 회고
  • 데이터베이스
  • 루비온레일즈
  • git
  • 컴퓨터
  • selenide
  • MySQL
  • jpa
  • 서버
  • 개발자
  • Ruby on Rails
  • 역사
  • Rails
  • java
  • WSL
  • db
  • ruby
  • 프론트엔드

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Benji3

개발 일지

Java는 Call By Reference가 없다. Object 참조만 있을 뿐.
공부노트/자바

Java는 Call By Reference가 없다. Object 참조만 있을 뿐.

2021. 11. 21. 13:44

SNS에서 지나가다 본 피드였는데, 면접 때 Java 에서 Call By Reference를 설명해보라고해서 JAVA 에서는 Call by value만 있다고 했다가 면접을 떨어졌다든 출처불명의 이야기를 들을 수 있었다.

 

옆사람에게 Java 에서는 Call By Value만 있는지 Java Code로 설명해보려다 Object 참조와 헷갈려서 제대로 설명을 못했다. 그러다 주말에 언뜻 생각나서 정리해보려고 메모리 구조를 그려보며 C언어 방식과 비교하니 다시 이해가 되었다.

 

Call By Refercne란 함수 호출 시, 매개변수에는 '메모리 주소'가 복사되어 할당된다. 이렇게 하면, 메모리 주소를 통해 메모리 저장소에 접근하여 값을 변경할 수 있다.

Call By Value란 함수 호출 시, 매개변수에는 '메모리에 저장된 값'이 복사되어 값이 할당된다. 이렇게 되면, 함수 내부에서 매개변수에 있는 값을 아무값으로 할당해도 함수 밖에 영향을 미칠 수 없다.

 

여기서 오해가 있는 것이, Java를 사용할 때 함수 매개변수로 Object를 전달하면 함수 안에서 Object내에 있는 값을 변경할 수 있다. 이것이 Call By Reference 라는 오해가 있다. 이것은 Java에서 있는 Object 에서 제공하는 Object 참조이지 Memory 참조가 아니다. Memory 참조를 할 수 있는 것이 Call By Reference이다.

 

 

다음은 메모리 상태를 그려보며 이해 해본 것이다. 메모리를 그리면서 처음에 이해한 것이라, 코드는 정확하지 않을 수 있다.

 

아래는 Call By Referenc를 예시이다. 0x001 에 처음에는 OBJ_01 이라는 값이 저장되어 있다가, 0x001 메모리 주소를 참조하여 OBJ_02 라는 값으로 변경하였다.

Call By Reference가 있는 C언어

// C

struct Dog{
  char name[20];
}

void main(){
  struct Dog dog1;
  strcpy(dog1.name, "happy");
  callByValue(dog1);
  callByReference(dog1);
 
}


void callByReference(Dog* dog){
  struct Dog dog2;
  strcpy(dog1.name, "john");
  *dog = *dog1;
}

void callByValue(Dog dog){
  struct Dog dog2;
  strcpy(dog1.name, "john");
  dog = dog1;
}

 

 

 

아래는 Call By Value 예시이다. 0x001 에 처음에 OBJ_01 하고, 추후에도 변함이 없다. 다만 change 함수 내에 0x020 메모리가 저장한 값이 OBJ_01 에서 OBJ_02로 변경된 것을 볼 수 있다.

Call By Value만 있는 Java

// java

public class Dog{
  private String name;
  
  public setName(String name){
    this.name = name;
  }
}

public class App{
  public static void main(String[] args){
    Dog dog1 = new Dog("happy");
    changeDog(dog1);
    changeDogName(dog1);
  }
  
  public static changeDog(Dog dog){
    dog = new Dog("john");
  }
  
  public static changeDogName(Dog dog){
    dog.setName("jane");
  }
}

 

참고한 블로그들 중에는 이 블로그가 가장 이해가 정확했고 쉬웠다. 제 글이 이해가 안된다면 해당 포스팅을 추천드립니다.

http://wonwoo.ml/index.php/post/1679

저작자표시 (새창열림)

'공부노트 > 자바' 카테고리의 다른 글

JVM 구조 및 메모리 구조  (0) 2023.09.17
OOP 설계 실습  (0) 2022.03.26
OOP(Object Oriented Programming)와 SOLID 원칙  (0) 2022.03.19
    '공부노트/자바' 카테고리의 다른 글
    • JVM 구조 및 메모리 구조
    • OOP 설계 실습
    • OOP(Object Oriented Programming)와 SOLID 원칙
    Benji3
    Benji3
    컴퓨터 프로그래밍과 관련된 포스팅을 합니다.

    티스토리툴바