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 |