본문 바로가기
TIL

내일배움캠프 4주차 Call by Value, Call by Reference, ...

by 율량동박씨 2024. 5. 9.

오늘의 키워드

  • Call by Value
  • Call by Reference
  • 되부름 호출(재귀적 메서드 호출)

오늘의 내용

  • Call by Value
    • 메서드 내에서 인수로 전달되는 데이터형과 동일한 종류의 데이터형 변수를 만들어 값을 복사한 후 메서드 내의 변수만 가지고 수행하는 방식
    • 인수로 기본 데이터형을 사용하면 모두 Call by Value가 된다
    • 메서드 내의 처리 결과는 메서드 밖의 변수에는 영향을 미치지 않는다
    • Call by Value 예제
package num5.callbyvalue;

public class CallbyValueTest1 {
    public static void swap(int x, int y) {
        int temp = x;//x값을 보관
        x = y;
        y = temp;
    }

    public static void main(String[] args) {
        int a = 10;
        int b = 20;

        System.out.println("swap() 메서드 호출 전 : "+ a + "," + b);// 10,20출력
        swap(a, b);//x에는 a, y에는 b를 전달
        System.out.println("swap() 메서드 호출 후 : "+ a + "," + b);// 10,20출력
    }
    //main 메서드의 a와 b는 swap메서드 내의 x와 y에 각각 값이 복사되고 swap메서드에서는 x와 y만 다루기 때문에
    //swap 내에서 x와 y의 값을 서로 바꾸지만 main 메서드의 a와 b에는 아무런 영향을 미치지 않음
}

 

  • Call by Reference
    • 매개 변수의 원래 주소에 값을 저장하는 방식
    • 메서드 실행에 따라 인수로 전달한 변수의 값이 영향을 받는다
    • 클래스 객체를 인수로 전달한 경우에만 처리한다
    • 사이드 이펙트 : 다른 메서르에서 현재의 메서드 내의 변수 값을 바꾸는 현상
    • Call by Reference 예
package num5.callbyreference;

public class CallbyReferenceTest {
    public static void swap(Number z) {
        int temp = z.x;
        z.x = z.y;
        z.y = temp;
    }

    public static void main(String[] args) {
        Number n = new Number();
        n.x = 10;
        n.y = 20;

        System.out.println("메서드 호출 전 : " + n.x + "," + n.y);
        swap(n);
        System.out.println("메서드 호출 후 : " + n.x + "," + n.y);
    }
} // Number클래스의 객체를 생성해 값을 전달하게 되면 저장한 값이 주소 값이기 때문에 
  // swap메서드에서 객체에 저장한 결과가 main메서드로 돌려진다

class Number {
    int x;
    int y;
}
//main메서드에서 Number 클래스의 객체인 n을 만들어 인수로 전달해 swap 메서드 내에서
//Number 클래스 내의 x와 y값을 바꾼 결과가 출력

 

  • 되부름 호출(재귀적 메서드 호출)
    • 메서드 내에서 자기 자신을 호출하는 것
    • 반복문의 변형된 표현
    • 수학 함수를 보다 수학적인 의미에 가깝게 구현이 가능하다
    • 반복문에 비해 메모리 요구가 크고 오래 걸리는 단점이 있다
    • 끝나는 지점을 잘 못 판단하면 무한루프에 빠지기 쉽다
package num5.recursivecall;

public class RecursiveCallTest {

// 잘못된 재귀적 메서드 호출
//    int power(int x, int y) {
//        if(x<=0) {
//            return 1;
//        } else {
//            return x * power(x, y-1);//x를 y번 곱함
//        }
//    }
// x의 y승을 구하는 메서드인데 y가 아닌 x값과 0을 비교해 무한루프에 빠지게 된다

    public static int power(int x, int y) {
        if(y<=0) {
            return 1;
        } else {
            return x * power(x, y-1);//x를 y번 곱함
        }
    }

    public static void main(String[] args) {
        System.out.println("power(2,1) : " + power(2, 1));
        System.out.println("power(2,2) : " + power(2, 2));
        System.out.println("power(2,3) : " + power(2, 3));
        System.out.println("power(2,4) : " + power(2, 4));
        System.out.println("power(2,5) : " + power(2, 5));
    }
// 위에 잘못된 재귀적 메서드를 바르게 고친 예제
// 2의 1승 부터 5승까지를 정상 출력
}

오늘의 회고

  • 내일 팀프로젝트 발표날이라 마무리 작업을 하다보니 Java공부를 많이 하지 못했다
  • 발표담당이라 몇년만에 ppt를 작성하고 대본을 작성하는데 하루를 다 보내 실시간 강의도 듣지 못했다
  • 역시 Java도 어렵고 발표도 너무 어렵다