-
[Java] 반환타입, 메서드 오버로딩언어/Java 2024. 10. 30. 10:24
단축키 Tip
Shift + F6
한번에 바꾸기
반환타입
- 반드시 반환 타입이 있는 경우 return 을 해줘야 한다.
- return 문을 만나면 그 즉시 종료한다.
public class Meno { public static void main(String[] args) { int result = add(1, 2); System.out.println(result); } public static int add(int a, int b) { int sum = a + b; return sum; } }
메서드 호출과 값 전달 1
- 자바는 항상 변수의 값을 복사해서 대입한다 (아주 중요, 대원칙)
package method; public class MethodValue0 { public static void main(String[] args) { int num1 = 5; int num2 = num1; num2 = 10; System.out.println("num1=" + num1); System.out.println("num2=" + num2); } }
- num1 에 있는 값 5를 복사해서 num2 에 넣는 것이다.
- 복사한다고 표현한 이유는 num1의 값을 읽어도 num1에 있는 기존 값이 유지되고, 새로운 값 num2 에 들어가기 때문이다. 마치 num1 의 값이 num2에 복사된 것 같다.
- num1 이라는 변수 자체가 num2 에 들어가는 것이 아니다. num1 에 들어 있는 값을 읽고 복사해서 num2에 넣는 것이다.
package method; public class MethodValue1 { public static void main(String[] args) { int num1 = 5; System.out.println("1. changeNumber 호출 전, num1: " + num1); changeNumber(num1); System.out.println("4. changeNumber 호출 후, num1: " + num1); } public static void changeNumber(int num2) { System.out.println("2. changeNumber 변경 전, num2: " + num2); num2 = num2 * 2; System.out.println("3. changeNumber 변경 후, num2: " + num2); } }
- 결과적으로 매개변수 num2 의 값만 10으로 변경되고 num1의 값은 변경되지 않고 기존 값인 5로 유지된다. 자바는 항상 값을 복사해서 전달하기 때문에 num2의 값을 바꾸더라도 num1에 영향을 주지 않는다.
package method; public class MethodValue2 { public static void main(String[] args) { int number = 5; System.out.println("1. changeNumber 호출 전, number: " + number); //5 changeNumber(number); System.out.println("4. changeNumber 호출 후, number: " + number); //5 } public static void changeNumber(int number) { System.out.println("2. changeNumber 변경 전, number: " + number); //5 number = number * 2; System.out.println("3. changeNumber 변경 후, number: " + number); //10 } }
- main()도 메서드이다.
- 각각의 메서드 안에서 사용하는 변수는 서로 완전히 분리된 다른 변수이다.
- 따라서 main()의 number 와 changeNumber()의 number 는 서로 다른 변수이다.
package method; public class MethodValue3 { public static void main(String[] args) { int num1 = 5; System.out.println("changeNumber 호출 전, num1: " + num1); num1 = changeNumber(num1); System.out.println("changeNumber 호출 후, num1: " + num1); } public static int changeNumber(int num2) { num2 = num2 * 2; return num2; } }
- 그러면 값을 바꾸고 싶을 때는 반환 타입을 void로 하지 않고 int나 등으로 넣어줘 값을 반환해주고 main에서는 변수를 담자.
메서드 오버로딩
다음과 같은 메서드를 만들고 싶다.
- 두 수를 더하는 메서드A
- 세 수를 더하는 메서드B
이 경우 A와 B 둘다 더하는 메서드이기 때문에 가급적 같은 이름인 add 를 사용하고 싶다. 자바는 메ㅐ서드의 이름 뿐만 아니라 매개변수 정보를 함께 사용해서 메서드를 구분한다. 이를 메서드 시그니처라고 한다.
메서드 시그니처 = 메서드 이름(add) + 매개변수 타입( int a. double b)
add(int a, int b); add(double a, double b);
- 이렇게 이름이 같고 매개변수가 다른 메서드를 여러 개 정의하는 것을 메서드 오버로딩(Overloading) 이라 한다.
오버로딩 규칙
메서드의 이름이 같아도 매개변수의 타입 및 순서가 다르면 오버로딩 할 수 있다.
// 반환 타입은 인정하지 않음. 오버로딩 실패 int add(int a, int b); double add(int a, int b); // 매개변수의 타입이 다르면 인정. 오버로딩 성공 int add(int a, int b); double add(int a, double b);
메서드 리팩토링
- 리팩토링 결과로 main은 세세한 코드가 아니라 전체 구조(=비즈니스 요구사항을)를 한 눈에 볼 수 있다. 쉽게 이야기해서 main에서 목차를 나열하고, 목차(메서드들)를 자세히 보면 코드가 나와 있는 것이다.
main() { add(1, 2); }
- 아주 쉽게 생략해서 위 main 메서드를 보자.
- add ? 더하겠구나, 1과 2를 .
- 직관적으로 비즈니스 요구사항을 알 수 있게 된다.
add(int a, int b){ return a + b; }
- 목차를 자세히 들여다 보면 세세한 코드가 나와 있다.
섹션 10 문제와 풀이2
package method.ex; import java.util.Scanner; public class ByMySelf { public static void main(String[] args) { Scanner input = new Scanner(System.in); while (true) { System.out.println("---------------------------------------"); System.out.println("1. 입금 | 2. 출금 | 3. 잔액 확인 | 4. 종료"); System.out.println("---------------------------------------"); System.out.print("선택:"); int menu = input.nextInt(); // 현재 잔고는 0원 부터 시작한다. int balance = 0; // menu 선택 if (menu == 1) { System.out.print("입금액을 입력하세요: "); int depositAmount = input.nextInt(); balance = deposit(balance, depositAmount); } else if (menu == 2) { System.out.print("출금액을 입력하세요: "); int withdrawAmount = input.nextInt(); balance = withdraw(balance, withdrawAmount); } else if (menu == 3) { System.out.println("현재 잔액: " + balance); } else if (menu == 4) { System.out.println("시스템을 종료합니다."); break; } } } public static int deposit(int balnace, int amount) { balnace += amount; System.out.println(amount + "원을 입금하였습니다. 현재 잔액: " + balnace + "원"); return balnace; } public static int withdraw(int balance, int amount) { // balance -= amount; if (balance >= amount) { balance -= amount; System.out.println(amount + "원을 출금하였습니다. 현재 잔액: " + balance + "원"); } else { System.out.println(amount + "원을 출금하려 했으니 잔액이 부족합니다. "); } return balance; } }
- 실수 1 : 변수 초기화
- while 문 안에 현재 잔고를 초기화해서 매번 메뉴를 선택할 때마다 현재 잔고가 업데이트 되지 않고, 0으로만 반복적으로 초기화 되었다.
- 해결 1 :
- while 문 밖에 현재 잔고를 초기화해두어 실수를 해결하였다.
'언어 > Java' 카테고리의 다른 글
[Java] 기본형 vs 참조형 (0) 2024.11.05 [Java] 클래스, 객체(인스턴스) (5) 2024.11.04 [Java] 메서드 (feat. 인수 != 매개변수) (2) 2024.10.29 [Java] 배열, 향상된 for문 (0) 2024.10.28 [Java] 형 변환, 계산과 형 변환, 스캐너 (0) 2024.10.26