코드 그라데이션

230331 3주차 수업 내용 복기 (1) 리턴값과 파라미터 본문

Java/Mega

230331 3주차 수업 내용 복기 (1) 리턴값과 파라미터

완벽한 장면 2023. 4. 2. 01:05

1.

리턴값은 다른 메서드가 main 메서드에게 주는 값이다

-> 좀 더 정확하게는 호출 당한 메서드가 호출한 메서드에게 주는 값이다.

public class _01 {

  static int addTwoNumbers(int a, int b) {

    return a+b;
  }

  public static void main(String[] args) {
    int sum = addTwoNumbers(100,200);
    System.out.println(addTwoNumbers(100,200));
  }

}

이런 경우는 main 에게 준다고 할 수 있지만,

public class _01 {

  static int addTwoNumbers(int a, int b) {

    return a+b;
  }

  static void hello() {
    addTwoNumbers(200, 300); //이 경우는 여기서 불린다.
    System.out.println(addTwoNumbers(200,300));
  }


  public static void main(String[] args) {
    int sum = addTwoNumbers(100,200);
//    System.out.println(addTwoNumbers(100,200));
    hello(); // 출력을 위해서 일부러 집어넣었다.
  }

}

 

---------

2.

리턴값과 파라미터 관련 제대로 이해하기

일단, 리턴값과 파라미터가 서로 연관되었다는 생각은 버리기

각각이다.

 

리턴이 있다는 건 말 그대로,

내가 어떤 메서드를 호출했는데, 메서드 안에서의 어떤 동작(결과)를 기대한다면, 있어야 하는 결과값(반환값).

 

ex) 내가 배열을 주고, 그 정수 배열의 모든 값의 합을 구해와라!

=> 명확히 요구하는 것이 있음.

=> 그 결과가 정수값이 나올 것이니까 그 때는 리턴값이 정수이다.

 

리턴의 필요 여부는

내가 이 함수에게 기대한 결과를 받아서 쓸 건지 안 쓸건지에 따라 판단하면 된다.

 

ex2) 키오스크에서 주문 결과를 출력하기

=> 콘솔에 출력만 하면 되지, 내가 그 결과를 받아서 뭘 할 필요는 없다.

 

매개변수의 필요 여부는

내가 이 함수에게 어떤 정보를 줘야 하냐 말아야 하냐에 따라 결정.

매개변수는 함수가 정보를 받을 수 있는 거의 유일한 창구이다.

 

함수가 정보를 받지 않았다는 말은, 변화에 대응할 수 없다는 뜻.

public class _01 {
  
  static void hello() {
    System.out.println("안녕하세요 John");
  }

  public static void main(String[] args) {
    hello();
  }

}

이러면 hello를 호출해서 출력하면, 다른 이름으로 출력하고 싶어도 계속 John만 출력되는데,

이름을 매개변수로 받고, 조금 고치면 이름을 뭘 넣느냐에 따라서 출력값을 계속 변화시킬 수 있게 된다.

public class _01 {

  static String hello(String name) {
    System.out.println("안녕하세요" + name);
    return name;
  }

  public static void main(String[] args) {
    hello("박지성");
    hello("손흥민")
  }

}

실행 결과

 

정리하자면, 

나는 함수(메서드) 니까 나는 행동만 할 거고,

이 행동에 어떤 값을 넣을 건지는 사용하는 사람이 결정해줬으면 좋겠어

이게 매개변수!

 

-------------

 

3.

리턴값을 받아 출력할 main문에서

보통 리턴값을 저장할 변수를 하나 만들고 나서 그것을 출력하는데,

표현식 그대로 출력하는 경우도 종종 본 것 같다.

 

package Day11;

public class MethodTest {
	//1. 주고 받고
	static String printHello(String name) {
		return "안녕하세요"+name+"님";
	}
	
	//2. 주고 안받고
	static int sum() {
		int a = 10;
		int b = 20;
		return a + b; // 이런 것!!
	}
	
	//3. 안주고 받고
	static void outputName(String name) {
		System.out.println("안녕하세요"+name+"님");
	}
	
	//4. 안주고 안받고
	static void printBye() {
		System.out.println("바이~~~~~");
	}
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str = printHello("홍길동");
		System.out.println(str);
		
		System.out.println(printHello("호랑이")); 
		
		int result = sum();
		System.out.println(result);
		
		outputName("강아지");
		
		printBye();
		
	}

}

 

기본적으로, 리턴 다음에 오는 것은

expression

이다.

식이 올 수도 있고, 결과값 변수도 올 수 있음.

 

순서는 먼저 오른쪽에 있는 expression을 계산(처리) 하고, 그 뒤에 결과값을 리턴하는 것.

static int sum() {
int a = 10;
int b = 20;
return a + b; 
}

일 때,

static int sum() {
int a = 10;
int b = 20;
return 30; // 이것과 똑같다는 것!!!
}

이게 만약 헷갈린다면

static int sum() {
int a = 10;
int b = 20;

int sum = a+b;
return sum // 이렇게 생각하면 된다.
}

 

변수를 만들어서 저장했으면, 다른 곳에서 활용을 해야하는데,

지금 저 메서드는 그냥 리턴하고 끝나잖아요.

그래서 그냥 수식 그대로 받아버려도 된다.

 

---------------

4.

가장 헷갈렸던 MethodTest1 에 나온 예제

(1)

public class MethodTest1 {

	static int a = 10; //전역변수
	
	static void abc() {
		int a = 30;
		a = 20;
		
	}
	
	static void kor() {
		System.out.println(a);
	}
	
	public static void main(String[] args) {
		
		int a = 20;
		abc(); 
		System.out.println(a);
		kor();
	}

}

이건 main에서 a를 새로 선언해줬으니, a를 찍으면 당연히 20이 된다.

kor() 메서드는 따로 매개변수나 초기화 값이 없으니 static 변수에 담긴 10을 사용하게 되고, 출력하면 10이 나온다.

 

 

(2)

public class MethodTest1 {

	static int a = 10; //전역변수
	
	static void abc() {
		int a = 30;
		a = 20;
		
	}
	
	static void kor() {
		System.out.println(a);
	}
	
	public static void main(String[] args) {
		
		a = 20;
		abc(); 
		System.out.println(a);
		kor();
	}

}

main 안에서 a를 만든 적이 없으니까, 가장 가까운 중괄호를 찾아가고(abc는 메서드가 끝나면 a도 소멸),

그 위를 더 올라가보니 아 이건 static 변수구나.

static a = 10; 이 main에서 20으로 바뀌게 되는 거고,

따라서 main에서도 20이 출력된다.

 

728x90
Comments