코드 그라데이션
230331 3주차 수업 내용 복기 (1) 리턴값과 파라미터 본문
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이 출력된다.
'Java > Mega' 카테고리의 다른 글
Day12 Quiz 03 랜덤수 채우기 보충 학습 (0) | 2023.04.02 |
---|---|
Day12 Quiz02 계산기 만들기 예제 추가적인 내용 부연 (0) | 2023.04.02 |
Day11. 달팽이 배열 문제 혼동 개념 복기 (0) | 2023.04.02 |
Day09 선택정렬 예제 경우의 수 따지기 (0) | 2023.04.01 |
Day13. Call by Value와 Call by Reference (0) | 2023.03.31 |