오늘의 키워드
- 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도 어렵고 발표도 너무 어렵다
'TIL' 카테고리의 다른 글
내일배움캠프 5주차 Spring MVC 디자인 패턴, 정적페이지 (0) | 2024.05.14 |
---|---|
내일배움캠프 5주차 API, HTTP, 테스트 코드 ..... (0) | 2024.05.13 |
내일배움캠프 4주차 Java 연습1 (0) | 2024.05.08 |
내일배움캠프 4주차 객체지향 (0) | 2024.05.07 |
내일배움캠프 3주차 람다와 스트림 (0) | 2024.05.03 |