Java - 메소드

민찬홍·2023년 9월 8일

Java

목록 보기
18/31
post-thumbnail

🧩 메소드

  • 타 언어의 함수 function과 같은 개념
  • 자바는 모든 것이 클래스의 요소이므로 메소드 method라 부름

메소드의 의미 1. 반복을 최소화

  • 한 번 이상 실행될 수 있는 일련의 작업들을 묶어두는 것
		double x = 3, y = 4;

        System.out.printf("%f + %f = %f%n", x, y, x + y);
        System.out.printf("%f - %f = %f%n", x, y, x - y);
        System.out.printf("%f * %f = %f%n", x, y, x * y);
        System.out.printf("%f / %f = %f%n", x, y, x / y);

        x = 10; y = 2;

        System.out.printf("%f + %f = %f%n", x, y, x + y);
        System.out.printf("%f - %f = %f%n", x, y, x - y);
        System.out.printf("%f * %f = %f%n", x, y, x * y);
        System.out.printf("%f / %f = %f%n", x, y, x / y);

        x = 7; y = 5;

        System.out.printf("%f + %f = %f%n", x, y, x + y);
        System.out.printf("%f - %f = %f%n", x, y, x - y);
        System.out.printf("%f * %f = %f%n", x, y, x * y);
        System.out.printf("%f / %f = %f%n", x, y, x / y);

위의 코드를 보면 변수의 값만 바뀔 뿐 코드들이 반복되는 것을 볼 수 있다.

	//  ⭐️ 메인 메소드 외부에 선언할 것
    static void addSubtMultDiv (double a, double b) {
        System.out.printf("%f + %f = %f%n", a, b, a + b);
        System.out.printf("%f - %f = %f%n", a, b, a - b);
        System.out.printf("%f * %f = %f%n", a, b, a * b);
        System.out.printf("%f / %f = %f%n", a, b, a / b);
    }

이런식으로 메소드를 만들어 반복되는 코드를 줄일 수 있다.


	// 메인 메소드 내에서 외부에 선언한 메소드를 호출
		double xx = 3, yy = 4;
        addSubtMultDiv(xx, yy);

        xx = 10; yy = 2;
        addSubtMultDiv(xx, yy);

		xx = 7; yy = 5;
        addSubtMultDiv(xx, yy);

메소드의 의미 2. 값을 받고 연산하여 결과를 반환 - 함수

		static int add (int num1, int num2) {
        return num1 + num2;
    }
		//  ⭐️ 반환한다는 것: 바꿔 쓸 수 있다는 것
		//  메서드 실행문을 메서드의 반환값으로 치환
        int int1 = add(2, 3);
        System.out.println(int1);

        System.out.println(add(4, 5));

        int int2 = add(add(6, 7), add(8, 9));
        System.out.println(int2);

결과적으로 위의 두 코드를 합치면

public class Ex02 { 
	public static void main(String[] args) {
    
    	int int1 = add(2,3);
        System.out.println(int1);
        
        int int2 = add(add(6,7), add(8,9));
        System.out.println(int2);
	}
    
    static int add(int num1, int num2) {
    
    return num1 + num2;
    }
}

이런식으로 메소드가 쓰이는 것을 알 수 있다.

		static boolean checkIfContain (String text, String token) {
        return text.toLowerCase().contains(token.toLowerCase());
    }

		// 메인메소드에서 호출
		System.out.println("\n- - - - -\n");

		if (
            checkIfContain(
                "Hello World",
                "hello"
            )
        ) {
            System.out.println("포함됨");
        } else {
            System.out.println("포함 안 됨");
				}

위의 코드를 아래처럼 삼항연산자로 조금 더 간단하게 표현할 수 있다.

			System.out.println(
            checkIfContain(
                "Hello World",
                "hello"
            ) ? "포함됨" : "포함 안 됨"
        );

  • static : 정적 메소드(클래스 메소드)에서 호출하려면(main등) 붙어야 함

    • 정적이 아닌 메소드(인스턴스 메소드)는 객체지향 섹션에서 배울 것
  • 매개변수 parameter: 각각 자료형 변수명을 적음. 없을 시 빈 괄호

    • 호출할 때 넣는 값(add(3,4)의 3과 4)을 인자 argument라고 함
    • 강의에서는 자주 인자라고 통일하여 부를 것
  • return : 반환하는 값이 있을 때, 맨 마지막에 붙임

  • 메소드의 이름은 최대한 메소드의 역할대로, 직관적으로 붙이면 좋음


🧩 다양한 용례

  • 매개변수도 반환값도 없는 메소드
	//  매개변수도, 반환값도 없는 메소드
    static void sayHello () {
        System.out.println("안녕하세요!");
    }
		sayHello();
  • 매개변수 없이 값만 반환하는 메소드
	static int count = 0;
    
    //  매개변수 없이 값만 반환하는 메소드
    //  외부 변수 값을 변화시킴 (static이므로 static 변수만 가능)
    static int getCount () {
        System.out.println("카운트 증가");
        return ++count;
    }
		int count1 = getCount();
        int count2 = getCount();
        int count3 = getCount();
        int count4 = getCount();
  • return을 println 윗줄로 옮겨 볼 것
    • return 은 블록을 종료하므로 이후의 코드 무효화 - 컴파일 에러 발생
  • 반환값의 자료형을 바꿔 볼 것(short, long 기타...)
    • 반환값이나 인자의 자료형에 어긋날 경우 컴파일 에러 발생
  • ⚠️ 외부의 변수 값을 바꾸는 것은 좋은 메소드가 아님

인자로 배열을 넘겨주는 경우도 보자.

public class Ex04 {
	public static void main(String[] args){
    
    	double avg = getAverage(new int[] {3,5,4,13,7} );
        // avg : 6.4
    }
    
    static double getAverage (int[] nums) {
    
    	double sum = 0;
        
        for(int num: nums) {
        	sum +=num;
        }
        
        return sum / nums.length;
    }
}
  • 자바의 메소드는 하나의 값만 반환 가능
  • 여러 값을 반환하려면 배열 또는 이후 배울 객체를 활용
	//  자바의 메소드는 하나의 값만 반환 가능
    //  여러 값을 반환하려면 배열 또는 이후 배울 객체를 활용
    static int[] getMaxAndMin (int[] nums) {

        int max = nums[0];
        int min = nums[0];
        for (int num : nums) {
            max = max > num ? max : num;
            min = min < num ? min : num;
        }

        return new int[] {max, min};
	}
		int[] numbers = {3, 5, 9, 2, 8, 1, 4};

		//  변수에 담아 보다 효율적으로 바꿔볼 것
        int maxOfNumbers = getMaxAndMin(numbers)[0];
        int minOfNumbers = getMaxAndMin(numbers)[1];

디버그시 기존에 step over를 사용하게 되면 메소드 안에서 변수의 값이 변하는 것을 보지 못하는 경우가 있다. 따라서 step intostep out 을 사용해 디버그를 꼭 해보자. step into 는 진행상황에서 메소드가 존재하면 해당 메소드 안으로 들어갈 수 있다. 따라서 그 메소드의 과정에서 변수의 값이 어떻게 변하는지 알 수 있다. 그러다가 step out 을 누르면 다시 원래 step into 를 눌렀던 코드로 돌아오게 된다.

  • 🌟 디버그시 스텝인투와 스텝아웃 사용해보기

🧩 매개변수의 개수가 정해지지 않은 메소드

public claa Ex05 {
	public static void main(String[] args) {
    	double avg = getAverage(3,91,14,27,4); // avg: 27.8
        
    }
    
    
    //  💡 ... 연산자 : 해당 위치 뒤로 오는 연산자들을 배열로 묶음
    //  int[] (배열 자체를 받음)과는 다름!
    static double getAverage(int... nums) {  //nums:[3,91,14,27,4]
        double result = 0.0;
        for (int num : nums) {
            result += num;
        }
        return result / nums.length;
    }
}    

아래처럼 배열을 넣으면 자동으로 펼쳐져 인식된다.

		//  💡 배열을 넣으면 자동으로 펼쳐져 인식됨
        int[] numbers = {3, 91, 14, 27, 4};
        double avgOfArr = getAverage(numbers);

아래와 같이 제약조건도 존재한다. 다른 인자들과 사용 시 맨 마지막에 넣어야한다.

	//  ⭐️ 다른(정해진) 인자들과 사용시 맨 마지막에 놓을 것
    static String descClass (int classNo, String teacher, String... kids) {
        return "%d반의 담임은 %s 선생님, 원생들은 %s 입니다."
                .formatted(classNo, teacher, String.join(", ", kids));
    }
		String class3Desc = descClass(3, "목아진", "짱구", "철수", "훈이");

		String[] kids = {"짱구", "철수", "훈이"};
        String class3DescByArr = descClass(3, "목아진", kids);
profile
백엔드 개발자를 꿈꿉니다

0개의 댓글