새소식

Java/제대로 파는 자바

[제대로 파는 자바 (Java)-by 얄코] 메소드 더 알아보기

  • -

해당 게시물은 [제대로 파는 자바 (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);
    }
}

 

 

 

꼬리 재귀 최적화

  • 재귀 코드를 내부적으로 루프 형태로 바꿔서 스택이 쌓이지 않도록 함
  • ⚠️ 자바에서는 현재 기본적으로 제공하지 않음 (보안 등 문제…)
  • 반복 횟수가 너무 많아지는 작업에는 사용하지 말 것!
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.