Call by value (값에 의한 호출) 이라는 '깊은 복사' 방식은,
데이터를 복사해서 그 값을 사용하는 방식이고,
Call by reference(주소에 의한 호출)는 '얇은 복사' 방식은,
메모리 주소를 참조해서 거기에 들어 있는 값을 꺼내서 사용하는 방식이다.
주소에 의한, 참조에 의한 호출이 더 효율적이다.
cpu : processor
heap, stack
ㅁㅁㅁㅁㅁㅁㅁ... 주소 공간.
ㅁ주소 공간이 넘어서면 넘어간 공간의 주소값까지 사용한다. overflow
int a= 10; 값에 의한 호출, 값을 바로씀
ㅁ의 주소값에 10을 저장하여 가져오는 것, 참조에 의한 호출
주소에 의한 참조
public class ex1 { // Call by Reference
static void Test(int[] n) {
System.out.println(n); // num 의 주소 값과 같다. num이 들어와서 실행된거니까.
for(int i=0; i<n.length; i++) {
System.out.println(n[i]);
}
}
public static void main(String[] args) {
int[] num = {10,20,30,40,50};
System.out.println(num); // 배열의 시작 주소
Test(num);
} // Test(num[0], num[1], num[2], num[3], num[4]); Call by value
} // 위의 Test( ... ) 는 사용 불가. Test(int[] n) 함수에서 하나의 인자만 받는 것으로 되어있기 때문.
[I@1f32e575 배열의 시작주소
[I@1f32e575
10
20
30
40
50
public class ex1 {
static void Test(int[] n) {
System.out.println(n);
n[0]=100; // 주소에 의한 참조, 배열 첫번째 100을 넣음
for(int i=0; i<n.length; i++) {
System.out.println(n[i]);
}
}
public static void main(String[] args) {
int[] num = {10,20,30,40,50};
System.out.println(num);
Test(num);
}
}
[I@1f32e575
[I@1f32e575
100 num 값이 아닌, 초기화 한 값이 출력.
20
30
40
50
메서드 매개변수(Parameter, Argument)
메서드 매개변수는 메서드를 호출하면서 값을 전달할 때, 사용되는 값으로
void print(int a) {
System.out.println(a);
}
print(10); 형태에서 print() 메서드가 호출하면서 10을 건네주면,
이 10이 print() 의 int a값으로 대입되어 작업을 수행한다.
- 반환값
return으로 표시하는데, 메서드를 실행한 뒤 호출한 메서드로 프로세스가 되돌아간다.
이때, 함수 실행으로 리턴값이 없으면 return 을 생략할 수 있고,
return 값이 있으면 뒤에 값을 지정하는데 리턴값은 하나만 있을 수 있다.
메서드에서 선언된 리턴 타입과 return 되는 자료형은 반드시 같아야한다.
static
public class ex1 {
void hello() {
System.out.println("안녕하세요");
}
static void hell() { // static은 정적이라는 의미로 고정되어 있다는 의미
System.out.println("Hello");
}
public static void main(String[] args) {
ex1 e = new ex1();
e.hello();
hell();
// static이 붙은 클래스에서는 객체를 따로 생성하지 않아도 함수를 불러올 수 있다.
// static이 붙으면 프로그램 실행 시, 자동으로 메모리에 올라가서 실행되기 때문이다. (정적이다.고정)
}
}
class Return {
static int sum(int a) {
int result = 0;
for(int i=1; i<=a; i++) {
result += i;
}
return result; // result는 sum() 메서드를 호출한 곳으로 반환값을 전해줌
}
}
public class ex1 {
public static void main(String[] args) {
System.out.println(Return.sum(5));
}
}
static 함수로 생성하여, 객체를 따로 생성하지 않고, class_name.function_name() 으로 불러와 사용한다.
abs() 절대값
public class ex1 {
public static void main(String[] args) {
int a = -1;
System.out.println("a : " + a);
System.out.println("a 절대값 : " + abs(a));
System.out.println("a 절대값 : " + Math.abs(a));
}
private static int abs(int num) {
// return num >=0 ? num : -num;
if(num <0) {
return -num;
} else {
return num;
}
}
}
a : -1
a 절대값 : 1
a 절대값 : 1
보통은 함수를 처리할 때, 변수와 함수 선언을 main() 메서드 앞에서 먼저 하고
함수 몸체도 먼저 기술해 주는 것이 좋다.
하지만 함수 몸체는 main() 메서드 다음으로 넘겨도 된다.
| JAVA 생성자, 접근 제한자(접근제어자), 추상 클래스 추상 메서드 개념정리 (0) | 2022.07.28 |
|---|---|
| JAVA inherit 상속, private, super 생성자 (0) | 2022.07.28 |
| JAVA Overloading 오버로딩 Overriding 오버라이딩 (0) | 2022.07.26 |
| JAVA 가변 인수 (0) | 2022.07.26 |
| JAVA 개념 ( class, instance, parameter, argument, 상속, 캡슐화, 다형성, 인터페이스, 추상 클래스 ) (0) | 2022.07.26 |