해당 게시물은 [제대로 파는 자바 (Java) - by 얄코]를 수강한 내용을 바탕으로 작성하였습니다.
메소드 오버로딩
같은 메소드 이름, 다른 매개변수
다른 자료형의 값들로 같은 성질의 작업을 정의할 때
⚠️매개변수와 그 자료형이 같은데 반환 자료형이 다른 것은 오버로딩 불가 - 다른 함수명 사용
public class Ex01 {
public static void main(String[] args) {
int res1 = add(1, 2); // 🔴 스텝인투로 들어가 볼 것
int res2 = add(3, 4, 5);
double res3 = add(1.2, 3.4);
String res4 = add("로보트 태권", 'V');
String res5 = add('X', "Men");
}
static int add(int a, int b) { return a + b; }
// ⚠️ 매개변수와 그 자료형이 같은데 반환 자료형이 다른 것은 오버로딩 안 됨 - 다른 함수명 사용
// static double add(int a, int b) { return (double) (a + b); }
// 매개변수의 개수가 다름
static int add(int a, int b, int c) { return a + b + c; }
// 매개변수의 자료형이 다름
static double add(double a, double b) { return a + b; }
// 매개변수의 자료형 순서가 다름
static String add(String a, char b) { return a + b; }
static String add(char a, String b) { return a + b; }
}
원시형 매개변수 vs 참조형 매개변수
⭐️ 원시값은 '복사해서' 가져옴 → 메소드 내부에서 값을 변경해도 원본에 영향 끼치지 않음
⭐️ 참조값은 주소값이므로 원본 그 자체를 가리킴
실행 후 값들 디버깅으로 확인할 것
⭐ 참조형 변수를 인자로 사용할 때는 이 점을 유의할 것!
public class Ex02 {
public static void main(String[] args) {
int intNum = 3;
modifyIntArg(intNum);
int[] intNums = {1, 2, 3};
// 배열은 참조형이지만 그 안의 값들은 원시형
modifyIntArg(intNums[0]);
//수행 후에도 intNums[0]은 3 유지
// 참조형인 배열 자체를 인자로 사용
modifyAryElem(intNums);
//수행 후 intNums[1]이 2에서 3으로 변경됨
}
// ⭐️ 원시값은 '복사해서' 가져옴
// 메소드 내부에서 값을 변경해도 원본에 영향 끼치지 않음
static void modifyIntArg (int num) { //원본의 복사본
System.out.printf("수정 전: %d%n", num++);
System.out.printf("수정 후: %d%n", num);
}
// ⭐️ 참조값은 주소값이므로 원본 그 자체를 가리킴
static void modifyAryElem (int[] ary) { //원본 그자체
System.out.printf("수정 전: %d%n", ary[1]++);
System.out.printf("수정 후: %d%n", ary[1]);
}
}
재귀 메소드
스스로를 호출하는 메소드
호출시마다 메모리에 스택이 축적 - 초과시 스택오버플로우 stack overflow 에러
public class Ex03 {
public static void main(String[] args) {
upTo5(0);
upTo5(2);
upTo5(4);
}
static void upTo5 (int start) {
System.out.println(start);
if (start < 5) {
upTo5(++start);
} else {
System.out.println("-- 종료 --");
}
}
}
다른 메소드를 호출한 메소드는 호출된 메소드가 종료될 때까지 메모리에 남아 있음
호출이 반복될수록 위와 같이 메소드들이 쌓이게 됨
public class Ex03 {
public static void main(String[] args) {
int fact1 = factorial(1);
int fact2 = factorial(2);
int fact3 = factorial(3);
int fact4 = factorial(4);
int fact5 = factorial(5);
}
static int factorial (int num) {
return num == 0 ? 1 : num * factorial(--num);
}
}