IT/자바, 스프링

Java 변수를 참조호출 처럼 동작시키기

thesse 2025. 7. 30. 23:29
300x250
반응형

Leetcode 543을 풀다가

https://leetcode.com/problems/diameter-of-binary-tree/description/

 

 

처음 나의 풀이는 아래와 같았다.

class Solution {
    int max = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        if(root==null) return 0;
        int dpt = diameter(root);
        return max;
    }

    int diameter(TreeNode root){
        if(root==null) return 0-1;
        
        int left = diameter(root.left)+1;
        int right = diameter(root.right)+1;

        max = Math.max(max, left+right);
        return Math.max(left, right);
    }
}

 

int max를 필드에 둬서 diameter에서 업데이트를 시켰는데

다른 사람 풀이를 보니 특이하게 어레이를 쓰고 있었다.

 

 

그사람 풀이를 참조해서 내 코드를 변형하면 아래와 같은데

class Solution {
    public int diameterOfBinaryTree(TreeNode root) {
        if(root==null) return 0;
        int[] max = new int[1];
        int dpt = diameter(root, max);
        return max[0];
    }

    int diameter(TreeNode root, int[] max){
        if(root==null) return 0-1;
        
        int left = diameter(root.left, max)+1;
        int right = diameter(root.right, max)+1;

        max[0] = Math.max(max[0], left+right);
        return Math.max(left, right);
    }
}

 

int가 아닌 int[1] 을 diameterofBinaryTree 안에서 정의하여 사용하고 있다.

저렇게 전달해주면 값이 업데이트가 되나? 해서 찾아봄

 

 

자바와 call by value

- Java에서는 모든 매개변수 전달이 사실상 call by value임

- 어레이를 사용한 것은 call by value처럼 동작하게 하려는 치팅

 

타입별 차이

- 기본 자료형 변수를 전달하면 값만 복사해서 전달하고 끝남

- 참조형 변수를 전달하면 참조값이 복사되어 넘어가므로 변경이 가능함.

- 크기가 1인 어레이를 생성해서 참조형 변수로 사용한 것

 

나의 의문

- 그럼 기본 자료형 int 대신 참조형인 Integer를 쓰면 안되나?

- Integer는 불변객체이기 때문에 값이 업데이트되는 게 아니라 새로운 Integer 객체를 생성해버리기 때문에 안됨

 

 

 

300x250
반응형