Wanna be Brilliant Full-Stack Developer

2/18 Java 메서드의 리턴이란 무엇인가? 본문

Some Memos/Java

2/18 Java 메서드의 리턴이란 무엇인가?

Flashpacker 2022. 2. 19. 01:43


메서드는? 어떤 클래스의 행위이다. 

자동차 클래스가 있다. 이 자동차 클래스는 여러가지 행위를 가지고 있을 수 있다.

첫번쨰는 1) 전진 , 2) 후진 , 3) 멈춤 이 세개가 다 행위이다. 

자 그러면 앞서 배운것처럼 메서드는 이 행위들이 일어날떄 이 각각 메서드의 Stack 공간이 만들어진다. ( 생명주기가 가장 짧은 메모리공간은 stack이다) 

 

계산기라는 클래스가 있는데 행위를 또 가지고있다.

1) 더하기 , 2) 뺴기 라는 행위를 가지고있는데 

void 더하기() {

 int sum = 5 + 6 ; 

} sum 의 값은 11이 될것이다. 더하기라는것을 호출하면  저 내부가 열리는데 오픈이 되고 저 메서드가 종료 될떄 sum값은 없어진다. 왜냐하면 stack이라는 공간은 이 메서드가 호출되서 잠깐 실행중일떄만 메모리에 뜨기 떄문이다. 애가 종료되고 소멸되면 이 sum값은 찾을수 없다. 이 떄 필요한것이 메서드의 리턴이라는것이다!

sum은 main에서 접근할 수없다. 

그래서 어떤 행위가 일어났을떄 행위의 어떤 결과를 main에서 돌려 받을수 있기 위해서는 sum이 메모리에서 사라지니까 돌려받을수가 없는데 

void는 리턴(돌려주지)하지 않겠다  void대신 int를 넣으면 이런 오류가 나오는데 

이 메서드는 반드시 결과를 리턴해야하는데 결과의 타입이 int이여야만 한다 

package ch02;

public class MethodEx02 {

	// void는 리턴하지 않겠다 
	static int add() { // 호출이 되면 중괄호 내부가 실행된다. 이떄 Stack 공간이 메모리에 만들어진다. 
		int sum = 5 + 6;
		//System.out.println(sum);
		return sum;
	}
	
	public static void main(String[] args) {
		 int result = add(); // add()  메서드 호출 
		 System.out.println(result);
		
	}

}

return sum;이라고 적으면서 그러면 sum이 add라는 메서드가 종료됬을떄
이 sum은 사라지지만 return을 하게되면 

main 메서드에서 int result = add(); 를하면 add 메서드의 sum의 값이 사라지지 않고
result변수에 저장이 되고 
호출할수 있게 되어진다. 

 

과정 : 

제일 처음에 static 공간에 add와 main이 올라온다. 
자바는 메인을 실행하게 되는데 main 의 큐가 열리고  그 옆에 stack이 열린다.
제일 밑에 main stack 저장공간이 생긴다. 

그러면 main 큐에 13번과 14번이 들어온다. 들어오는 부터가 처리 되니 13번 처리되고
main의 스택영역은 아무것도 없다. 

13번이 add를 호출할때 add도 메서드니까 add라는 큐가 생긴다. 

그다음에 7번 8번 9 번이 실행된다. stack 영역에 add stack 저장공간이 또 생긴다. 

13번 라인이 실행될떄 실행의 순서는 왼쪽이 아니라 오른쪽이 먼저 실행된다.
add(); 가 먼저 실행되니  

7번 라인이 실행되고 5+ 6은 11이니 int sum은 지역변수니 add stack 저장공간에 들어온다.

8번 라인은 주석 무시! 

9번 라인에 return sum; 을 보고 9번라인에서 sum을 돌려주는데 어디로 돌려주냐면
나를 호출한곳으로 
13번으로 돌려준다. return sum이 될떄 13번 라인은

int result = 11; 으로 바뀐다.  result에 그래서 11이 들어간다. 

 

9번 라인이 실행될떄 return이 되니까 나를 호출한 쪽 13번으로 11을 return 해준다. 

그러면 add의 큐가 다 실행됬으니까 add의 큐는 더이상 할일이 없기 떄문에 종료되고 사라진다. 

그리고 stack에 int sum =11 ; 도 사라진다. 하지만 상관없다 왜냐하면 

13번 라인에 11이 리턴해줬으니까 

 

리턴을 해서 13번 라인으로 들어와서 result에 11이 들어온다.

그러면 main stack에 int result = 11 이 들어온다 . 13번 라인이 끝나고나서

14번 라인에 모니터에 result를 출력한다 ! 

그러면 모니터에 당연히 11이 출력된다! 

 

만약에 return을 하지 않는다면? add stack이 날라갔기 떄문에 sum값을 찾을수 있는 방법이 없다.

하지만 return을 했기 떄문에 11을 main이라는 공간에서 사용할수 있다는것이다. 

메서드에 리턴이 필요한 이유는 무엇인가? 

int sum = 5 + 6이 저장되는 stack 공간의 생명주기가 짧기 떄문에
( a 메서드가 끝날떄 메모리에서 사라짐) 

return을 통해 돌려 줄수 있다.  아니면 찾을 수 있는 방법이 없다.

 

	// void는 리턴하지 않겠다 
	static int add() { // 호출이 되면 중괄호 내부가 실행된다. 이떄 Stack 공간이 메모리에 만들어진다. 
		int sum = 5 + 6;
		//System.out.println(sum);
		return sum;
	}

만약에 static void add()로 했으면 return을 할수가 없다. 

package ch02;

public class MethodEx02 {

	// void는 리턴하지 않겠다 
	static void add() { // 호출이 되면 중괄호 내부가 실행된다. 이떄 Stack 공간이 메모리에 만들어진다. 
		int sum = 5 + 6;
		//System.out.println(sum);
	}

만약에 double을 적으면 어떻게 되는것인가? double은 실수형이기떄문에 sum은 int라서 타입이 맞지 않아서 안된다. 

저 타입은 리턴되는 값과 타입이 같아야한다! 

 

정리: 어떤 커피머신이 있는데 이 커피머신도 행위를 가지고 있다. 1) 커피 만들기 

이 행위가 커피를 만들기만 하면 다른쪽에서 사용할수 없다. 커피를 만들고 return해서 돌려줘야한다!

그래서 모든 메서드라는건 블랙박스와 같다. 박스가 있으면 여기에다가 멀좀 줄래? 하면 

블랙박스가 먼가를 돌려주는것을 return하는것이다. 

 

어떤 행위가 있을때 return이 될수도 있고 안될수도 있는게 자판기는 내가 멀 달라하면 물건을 return을 줘야하는데

TV같은거는 TV를 키라고 하면 TV를 키기만하면되지 무언가를 리턴해야하는것은 아니다. 

그래서 모든게 return이 필요하지는 않다. return이 있는게 잇고 없는게 있기 때문에 구분이 있는것이다.

return을 하지 않을꺼면 void 리턴을 할꺼면 그 리턴할 타입을 적어주면 된다!