728x90
반응형
[Java] 값에 의한 호출
아래는 BubbleSort를 구현하는 코드이다.
다만, 결과를 출력해보면 입력값과 똑같은 결과를 얻게 된다. 이유가 무엇일까?
bubbleSort메서드 내에서 arr[j]와 arr[j+1]의 값을 변경하기 위해서 swap이라는 함수를 호출했을때,
data[j]와 data[j+1]의 값은 각각 a와 b에 복사된다. 즉, data[j]와 a는 완전히 별개의 변수이다.
따라서, a와 b의 값을 변경하여도 data[j]와 data[j+1]의 값에는 변화가 없다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=scan.nextInt();
}
scan.close();
arr=bubbleSort(arr);
System.out.println("Sorted data:");
for(int i=0;i<n;i++){
System.out.println(arr[i]);
}
}
private static int[] bubbleSort(int[] arr) {
for(int i=arr.length-1;i>0;i--){
for(int j=0;j<i;j++){
if(arr[j]>arr[j+1]){
/*int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;*/
swap(arr[j],arr[j+1]);
}
}
}
return arr;
}
private static void swap(int a, int b) {
int tmp=a;
a=b;
b=tmp;
}
}
참고
Primitive 타입 (byte, short, int, long, float, double, char, boolean)
-> 호출된 메서드에서 값을 변경하더라도 호출한 쪽에 영향을 주지 못한다. (값에 의한 호출)
Non-Primitive 타입 (String, Array 등)
-> 호출된 메서드에서 변경하면 호출한 쪽에서도 변경된다.
이유
Non-Primitive Type의 변수는 생성된 객체의 주소값을 가지고, Primitive Type의 변수는 실제 값을 가지기 때문.
값에 의한 호출의 반대 개념은 참조의 의한 호출이다.
참조의 의한 호출을 사용하게 되면 파라미터에 복사된 값이 들어가는 것이 아닌 &a와 같이 호출하는 값이
바로 호출 되어 올바른 결과가 출력된다.
C나 java는 참조의 의한 호출을 지원하지 않으며 C++에서 참조의 의한 호출이 사용가능하다.
728x90
반응형
'Programing > Java' 카테고리의 다른 글
[Java] static과 non-static && 접근 제어 (0) | 2020.12.19 |
---|---|
[Java] String 클래스 기본 메서드 (0) | 2020.12.10 |
[Java] Tree 구현 (0) | 2020.12.08 |
[Java] Bubble sort (버블정렬) (0) | 2020.12.07 |
[Java] 연속된 정수들의 최대값 구하기 (0) | 2020.12.07 |