우주코딩
가변 파라미터와 배열 파라미터, 로컬변수와 파라미터, call by value, call by reference 본문
가변 파라미터
[리턴타입] 메서드명 (타입 ... 변수){...}
0개 이상의 값을 받을 때 선언하는 방식
메서드 내부에서 배열처럼 사용한다.
static void hello(String... names){
for (int i =0; i <names.length; i++) {
Sysout("%s님 반갑습니다.\n");
}
}
hello("홍길동", "임꺽정", "방우주")
이 경우 세개의 문자열이 저장되어 print 된다.
가변 파라미터 자리에 배열을 직접 넣어도 된다.
String[] arr = {"홍길동", "임꺽정", "방우주"};
다른 데이터 타입을 입력할 수 없다.
가변 파라미터는 변수 선언 맨 끝에 와야한다.
배열 파라미터
static void hello2(String[] names) {
for (int i = 0; i < names.length; i++) {
System.out.printf("%s님 반갑습니다.\n", names[i]);
}
}
배열 파라미터의 메서드를 호출할 때는
=> 가변 파라미터와 달리 낱개의 값을 여러 개 줄 수 없다!
오직 배열에 담아서 전달해야 한다.
String[] arr2 = {"김구", "안중근", "윤봉길", "유관순"};
hello2(arr2);
가변 파라미터는
하나의 파라미터에 여러 배열을 선언할 수 없다.
배열 파라미터는
하나의 파라미터에 여러 배열을 선언할 수 있다.
로컬변수, 파라미터
로컬변수 - 메서드가 호출될 때 생성되는 변수 (JVM Stack에 저장됨) 호출 끝나면 사라짐
파라미터 - 메서드가 호출될 때 값을 넘겨받는 변수
파라미터 ⊂ 로컬변수
primitive data type 변수와 reference
int a;
float b;
boolean c; // 1 또는 0
char d; //유니코드 값
int[] arr; // arr는 배열의 주소
주소를 저장하는 변수를 "레퍼런스(reference)" 라고 한다.
C언어에서는 "포인터(pointer)"라고 한다.
primitive 변수는 '값' 을 저장하고 그 외 reference 는 '주소'를 저장한다
call by value
public static void main(String[] args) {
int a = 100;
int b = 200;
swap(a, b);
swap() 메서드 호출할 때 main() 안의 a 변수의 값과 b 변수의 값을 넘긴다.
비록 swap()에서 a와 b라는 이름의 변수가 있지만,
이 변수는 main()에 있는 변수와 다른 변수이다.
call by value
아규먼트가 primitive data type인 경우,
메서드를 호출할 때 값을 넘긴다.
자바에서는 primitive data type에 대해서
메모리(변수) 주소를 넘기는 방법이 없다.
call by reference
call by value 와 다르게 변수의 값이 아닌 주소를 파라미터에 넘긴다.
예를 들어
static void main(String[] args) {
int[] arr = new int[] {100, 200}
swap(arr); // call by reference
static void swap(int[] arr){
int temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
}
이라면 Method Area 에서 main() 이 실행될 때 Heap에 arr 주소 값이 형성된다.
그 주소값을 swap 메서드로 호출을 하면 Heap에 담긴 arr 값을 넘긴다. (call by reference)
swap() 메서드에서 배열의 값 변환이 이루어지고 나서 그대로 실행을 종료하면
변환된 배열 값이 그대로 arr 주소에 남아있고
main() 메서드에서 arr 주소를 출력하는 명령을 실행하면 swap에서 변환된 값이 그대로 출력된다.
Heap에 생성된 메모리는 JVM이 종료될 때 까지 남아있다.
'자바 본 강의' 카테고리의 다른 글
스태틱 변수, 인스턴스 변수, 스태틱 메서드, 인스턴스 메서드 (0) | 2021.07.20 |
---|---|
레퍼런스 리턴하기, 재귀 호출, 메인 메서드와 아규먼트 (0) | 2021.07.16 |
비트 이동 연산자, 조건문, 반복문 (0) | 2021.07.12 |
연산자, 논리 연산자, 비트 연산자, 조건 연산자 (0) | 2021.07.09 |
배열, offset 주소, 레퍼런스와 인스턴스, 자바의 변수 종류, 파라미터 (2) | 2021.07.09 |