메서드 호출과 값 전달

2026. 2. 10. 15:23·김영한/자바 입문

 

자바를 공부하다 보면 어느 순간부터 코드가 이해되지 않기 시작하는 지점이 있다.
그 대부분의 원인은 메서드 호출 시 값이 어떻게 전달되는지를 정확히 이해하지 못했기 때문이다.

그래서 지금부터 자바에서 가장 중요한 대원칙 하나가 있다.

자바는 항상 변수의 값을 복사해서 대입한다.

 

 

 

변수와 값 복사

먼저 가장 단순한 예제부터 살펴보자.

int num1 = 5; 
int num2 = num1; 
num2 = 10;

이 코드의 실행 결과는 다음과 같다.

num1=5
num2=10

실행 흐름 정리

int num2 = num1; // num1의 값은 5이다
int num2 = 5;    // num1의 값을 읽어서 num2에 복사한다
num2 = 10;       // num2만 10으로 변경된다

여기서 중요한 점은 이것이다.

  • `num1`이라는 변수 자체가 전달되는 것이 아니다
  • `num1` 안에 들어있는 값 5가 복사되어 `num2`에 들어간다
  • 이후 `num2`를 변경해도 `num1`에는 아무 영향이 없다

이것이 바로 “값을 복사해서 대입한다”는 의미이다.

 

 

메서드 호출과 값 복사

이제 이 개념을 메서드 호출에 적용해보자.

public static void main(String[] args) {
    int num1 = 5;
    changeNumber(num1);
    System.out.println(num1);
}

public static void changeNumber(int num2) {
    num2 = num2 * 2;
}

 

결과를 10이라고 예상할수 있지만
하지만 실제 결과는 `5`이다.

처음에 설명했던 말이있다.

자바는 항상 변수의 값을 복사해서 대입한다.

 

 

 

메서드 호출 시 실제로 일어나는 일

changeNumber(num1);

이 코드는 다음과 같이 해석된다.

changeNumber(5); // num1의 값을 읽는다

그리고 메서드 내부에서는 다음이 실행된다.

void changeNumber(int num2 = 5) // 값이 복사되어 전달된다
num2 = num2 * 2;               // num2만 변경된다

핵심 정리

  • `num1`의 값 5가 복사되어 `num2`에 전달된다
  • `num2`는 changeNumber() 메서드 안에서만 존재하는 변수이다
  • `num2`를 아무리 바꿔도 `num1`에는 영향이 없다

 

 

변수 이름이 같아도 결과는 같다

이번에는 변수 이름을 똑같이 맞춰보자.

int number = 5;
changeNumber(number);

public static void changeNumber(int number) {
    number = number * 2;
}

이 경우에도 결과는 동일하다.

이유는 단순하다
  • `main() 메서드`의 `number`
  • `changeNumber() 메서드`의 `number`

이 둘은 이름만 같을 뿐, 완전히 다른 변수이다.
각 메서드는 자신만의 독립된 공간(스택 프레임)을 가진다.

즉,

  • main()의 number는 main()이 끝날 때까지 유지된다
  • changeNumber()의 number는 메서드가 끝나면 사라진다

이름이 같다고 해서 같은 변수가 아니다.

 

 

값을 변경하고 싶다면? 반환을 사용해야 한다

그렇다면 메서드를 통해 값을 변경하려면 어떻게 해야 할까?
답은 간단하다.

변경된 값을 반환받아서 다시 대입해야 한다.

int num1 = 5;
num1 = changeNumber(num1);

public static int changeNumber(int num2) {
    return num2 * 2;
}

실행 흐름

num1 = changeNumber(num1);
num1 = changeNumber(5);
num1 = 10;

이번에는 결과가 바뀐다.

 

이유는 명확하다.

  • 메서드 내부에서 계산한 결과를 반환한다
  • 반환된 값을 다시 num1에 대입한다
  • 따라서 num1의 값이 변경된다

 

 

정리

  • 자바는 항상 값을 복사해서 전달한다
  • 메서드 매개변수는 호출자의 변수를 절대 직접 바꾸지 못한다
  • 값 변경이 필요하면 반환값을 사용해야 한다
  • 변수 이름이 같아도 메서드가 다르면 완전히 다른 변수이다

'김영한 > 자바 입문' 카테고리의 다른 글

향상된 for문(for-each)  (0) 2026.02.10
배열의 선언과 생성  (0) 2026.02.09
Scanner  (0) 2026.02.09
형변환과 오버플로우  (0) 2026.02.09
스코프  (0) 2026.02.09
'김영한/자바 입문' 카테고리의 다른 글
  • 향상된 for문(for-each)
  • 배열의 선언과 생성
  • Scanner
  • 형변환과 오버플로우
sqaxe1
sqaxe1
woojoo-devlog 님의 블로그 입니다.
  • sqaxe1
    Woojoo's Devlog
    sqaxe1
  • 전체
    오늘
    어제
    • 분류 전체보기 (148)
      • Backend (9)
        • Servlet (7)
        • Spring (2)
      • Frontend (1)
      • CS (0)
      • Book (33)
        • 자바 웹 프로그래밍 Next Step (30)
        • 테스트 주도 개발: 고품질 쾌속개발을 위한 TDD.. (1)
        • 성공과 실패를 결정하는 1%의 네트워크 원리 (2)
      • Engineering (0)
        • Testing (0)
      • Infra (6)
        • AWS (6)
      • Java (4)
      • Network (1)
      • 김영한 (28)
        • 자바 입문 (8)
        • 실전 자바 - 기본편 (6)
        • 실전 자바 - 중급편 (10)
        • 실전 자바 - 고급편 (4)
      • Web (39)
        • Web Basics (39)
      • Project (24)
        • NeoSquare (0)
        • Memo Evolution (24)
      • 정보처리기사 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    aws
    java
    개발서적
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sqaxe1
메서드 호출과 값 전달
상단으로

티스토리툴바