상세 컨텐츠

본문 제목

JAVA 메서드 호출 방식(값 호출, 주소 호출) static, abs() 절대값

BackEnd/JAVA

by H_Develop 2022. 7. 26. 16:41

본문

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() 메서드 다음으로 넘겨도 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

관련글 더보기