Java

[Java] Method 메서드 ( return / overloading / call by value / call by reference)

소댓 2023. 3. 10. 18:26

* 메서드(method)란?

- 자주 사용하는 코드에 이름을 주는 것

> static void 이름(자료형 변수명, 자료형 변수명, ...) {

   코드;

   }

 

- 증가하는 별, +, - 출력 / 구구단 2단 출력 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package day07;
 
public class MethodEx1 {
 
        // 자주 사용하는 코드에 이름을 주자 : method
        // static void 이름() {
        // 코드;
        // }
 
        // (지역변수 선언) cnt : 매개변수(parameter), 인자(argument)
        static void printStar(int cnt) {
            String str = "" ;
            System.out.println("전달된 cnt : " + cnt);
            for(int i = 0; i<cnt; i++) {
                str += "*";
                System.out.println(str);
            }
        }
        
        // 1. 구구단 2단 출력하기
        // 2. 이름 부여하기 printGuGuDan() <==
        static void printGuGuDan(int dan){
            for(int i=1; i<=9; i++) {
                System.out.println(dan+" * " + i + " = " + dan*i);
                }
            }
        
        static void printCode(String str) {
            String result = "";
            for(int i=0; i<=5; i++) {
                result += str;
                System.out.println(result);
            }
        }
        
        public static void main(String[] args) {
            // 이 메소드를 호출해
            // 괄호가 있으면 method, 없으면 변수
            printStar(3); // 3줄
            printStar(5); // 5줄
            printStar(9); // 9줄
            
            System.out.println("--------------------");
        
        // 3. main method에서 호출하기
        // 4. 매개변수를 사용해서 좀 더 쓸모있는 구구단 출력 메서드 만들기
            printGuGuDan(3);
            printGuGuDan(5);
            
            printCode("+");
            printCode("-");
    }
 
}
cs

 

 

 

* 메서드 return

- static 이 메서드를 수행하고 메인 메서드로 돌아갈 때 가지고 갈 값의 자료형
  static return 값의 자료형 메서드명 () {
  return 값; main method로 이 값을 돌려보내기
  }

 

* 메서드의 오버로딩(Overloading)

- 다중 정의
- 방법 : method 이름은 동일, 매개변수의 갯수, 순서, 자료형을 다르게 하면 된다.

 

 

- 메서드의 return / overloading

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package day07;
 
public class MethodEx2 {
 
        // static void 메서드명(자료형 변수명, 자료형 변수명, ...) {
        // }
    
        // static 이 메서드를 수행하고 메인 메서드로 돌아갈 때 가지고 갈 값의 자료형
        // static return 값의 자료형 메서드명 () {
        // return 값; main method로 이 값을 돌려보내기
        // }
 
    static int hap(int a, int b) {
        System.out.println("a : " ++", b : " + b);
        int c = a+b;
        return c; // c의 값을 메인 메서드에게 돌려주기 (return)
    }
    
    static int minus(int a, int b) {
        System.out.println("a : " + a + ", b : " + b);
        int c = a-b;
        System.out.println("c : "+c);
        return c;
    }
    
    static int max(int a, int b) {
        System.out.println("a : " + a + ", b : " + b); // a: 100, b: 200
        if (a >= b) 
            return a;
        else
            return b;
    }
    
    static float hap(int a, float b) {
        float c = a+b;
        return c;
    }
    
    static float minus(float a, int b) {
        float c = a-b;
        return c;
    }
    
    static int max(int a, float b) {
        if (a >= b) 
            return a;
        else
            return (int)b; 
    }
    
    static int sum(int a, int b, int c) {
        int result = a + b + c;
        return result;
    }
    
    static int sum(int a, float b) {
    
        float c = a + b;
        return (int)c;
    }
    
 
    public static void main(String[] args) {    
        // hap(100, 200); // 100, 200 값을 가지고 hap 메서드를 호출해라
        int result = hap(100200);
        System.out.println("result : "+result);
        System.out.println("---------------------------");
        
        int result2 = minus(300200);
        System.out.println("reslut2 : "+result2); // result2 : 100
        System.out.println("---------------------------");
        
        int result3 = max(100200);
        // 두 수 중 큰 값 반환하는 메서드 max
        System.out.println("result3 : "+result3); // result3 : 100
        System.out.println("---------------------------");
        
        // 메서드 호출 : 메서드명 (매개변수 개수, 자료형, 순서)로 구분
        // hap(int, int), hap(float, int), hap(int, float)
        float result4 = hap(100200.0f);
        System.out.println("result4 : "+result4);
        System.out.println("---------------------------"); 
        
        float result5 = minus(300.0f, 200);
        System.out.println("result5 : "+result5);
        System.out.println("---------------------------"); // result5 : 100.0f
        
        int result6 = max(100200.0f);
        System.out.println("result6 : "+result6); // result6 : 200
        System.out.println("---------------------------"); 
        
        int result7 = sum(100200300);
        System.out.println("result7 : " +result7); // result7 : 600
        System.out.println("---------------------------"); 
        
        int result8 = sum(100200.0f);
        System.out.println("result8 : "+result8); // result8 : 300
        
        // method overloading
        // 다중 정의
        // 방법 : method 이름은 동일, 매개변수의 갯수, 순서, 자료형을 다르게 하면
        
        // println() : overloading 되어 있다.
        
        System.out.println(); // println()를 호출해
        System.out.println("와 오늘은 금요일!!!");
        System.out.println(100);
        System.out.println(100.0f);
        System.out.println(100.0d);
        
}
}
cs

 

 

* 메서드로 배열의 최대값 / 최소값 / 최대값의 위치 구하기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package day07;
 
import java.util.Arrays;
 
public class MethodEx3 {
 
    public static void main(String[] args) {
 
        int[] m = {2353221166778829};
        
        System.out.println(m);
        
        // 배열의 모든 요소값을 옆으로 출력
        for(int i = 0; i<m.length;i++) {
            System.out.print(m[i]+"\t");
        }
        System.out.println();
        
        // 이 값을 [23, 53, 22, 11, 66, 77, 88, 29]
        System.out.print("[");
        for(int i = 0; i<m.length;i++) {
            System.out.print(m[i]);
            if(i !=m.length-1){
            System.out.print(", ");
            }
        }
        System.out.println("]");
        System.out.println();
        System.out.println("-----------------------");
        // 위처럼 해도 되지만! 이미 만들어진 아래 방식으로 하는 게 간단
        
        // ctrl+shift+O : auto import
        System.out.println(Arrays.toString(m));
        System.out.println("-----------------------");
        
        // 최대값 : 
        // 배열 요소에서 제일 큰 값 찾기
        int maxValue = getMaxValues(m);
        System.out.println("최대값 : "+maxValue);
        
        int minValue = getMinValues(m);
        System.out.println("최소값 : "+minValue);
        
        int position = getMaxValuePosition(m);
        System.out.println("배열의 최대값의 위치는 "+position);
        }
    
        static int getMaxValues(int[] m) {
            // getMaxValues 이 코드를 독립
 
        int max = 0// 현재 값 중에 이 값이 될 경우는 X
        
        for(int i = 0; i < m.length; i++) {
                if(m[i] > max){ // 현재 배열 요소의 값과 최대값과 배교해서 max보다 크면
                    max = m[i]; // 지금 값이 가장 큰 값
                }
        }
            // System.out.println(max);
        return max;
//        System.out.println(max);
        }
        
        static int getMinValues(int[] m) {
            int min = m[0];
 
            for(int i = 0; i<m.length; i++) {
                if(m[i] < min) {
                    min = m[i];
                }
            }
            return min;
        }
        
        static int getMaxValuePosition(int[] m) {
            int max = m[0];
            int position = 0;
            for(int i = 0; i<m.length;i++) {
                if(m[i] > max) {
                    max = m[i];
                    position = i;
                }
            }
            return position;
        }
        
    }
cs

 

 

* 메서드의 호출 방식

- call by value : 값에 의한 호출 ->  원본이 훼손되지 않음

- call by reference : 참조값에 의한 호출

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package day07;
 
public class MethodEx4 {
 
    static int sum(int a, int b) {
        a++// ==> 1이 해당 메소드 안에서 증가(메인 메소드 안에서는 안바뀜)
        // int c = a + b;
        return a+b;
    }
    
    static int sum(int[] m) {
        // 합계
        System.out.println("method 내부에 m : " + m);
        System.out.println("m[2] : "+m[2]);
 
        // 마스터키를 준 것과 같기 때문에, heap에 있는 변수값도 수정됨
        m[2= 100;
        return 0;
    }
    
    public static void main(String[] args) {
        int a = 100;
        int b = 200;
        
        int result = sum(a, b); // call by value : 값에 의한 호출 -> 원본이 훼손되지 않음
    
        System.out.println(result);
        System.out.println("main method ==> a : "+a+", b: "+b);
        System.out.println("-----------------------------");
        
        int[] m = {329};
        System.out.println("메인 메서드 m : "+ m);
        int result2 = sum(m); // call by reference : 참조값에 의한 호출
        
        System.out.println("메인메서드 m[2] : "+m[2]);
    }
    
}
cs

 

 


[ 응용 ]

 

 

1. 다음과 같은 코드가 실행될수 있도록 method overloading 을 구현하시오.

int result1 = plus(100,400);

float result2 = plus(100,200.0f, 300);

double result3 = plus(100,300.0, 200);

package day07;

public class MethodQ001 {

	public static void main(String[] args) {
		
	int result1 = plus(100, 400);
	System.out.println("result 1 : "+result1);
	
	int result2 = plus(100, 200.0f, 300);
	System.out.println("result 2 : "+result2);
	
	int result3 = plus(100, 300.0, 200);
	System.out.println("result 3 : "+result3);
	}
	
	static int plus (int a, int b) {
		int c = a + b;
		return c;
	}
	
	static int plus (int a, float b, int c) {
		float e = a + b+ c;
		return (int)e;
	}
	
	static int plus (int a, double b, int c) {
		double e = a + b + c;
		return (int)e;
	}
}
 

 

2. method Overloading 이란 무엇이며, 어떤 방법으로 하는 것인가?

: 메서드를 다중 정의하는 것

-> method 이름은 동일하게 지정하고, 매개변수의 갯수, 순서, 자료형을 다르게 하면 된다.

 

3. 2단 부터 6단까지 출력하는 메서드를 구현하시오.

printGuGuDan(2, 6) ;

package day07;

public class MethodQ003 {

	public static void main(String[] args) {
		
		printGuGuDan(2, 6);
	}

	static void printGuGuDan(int dan1, int dan2){
		for(int i=1; i<=9; i++) {
			System.out.println(dan1+" * " + i + " = " + dan1*i);
			}
		System.out.println("--------------------");
		for(int i=1; i<=9; i++) {
			System.out.println(dan2+" * " + i + " = " + dan2*i);
			}
		}
	
}
 

 

 

4. method 호출 방법에 따른 분류는?

- call by value : 값에 의한 호출 -> 원본이 훼손되지 않음

- call by reference : 참조값에 의한 호출

 

5. 다음 배열의 요소를 섞는 메소드를 구현하시오.

int[] m = { 1, 2, 3,4, 5, 6, 7, 8, 9 };

shuffle(m) ; // 랜덤하게 두 요소의 값을 교환하는 코드 (1000번)

package day07;

public class MethodQ005 {

	public static void main(String[] args) {
		
	int[] m = {1, 2, 3, 4, 5, 6, 7, 8, 9};

	for(int i=0; i<1000; i++) {
	}
	System.out.println(shuffle(m));
	}

	static int shuffle (int[] m) {
		int i = 1;
		int shuf = m[i];
		for(int j=0; j<m.length-1; j++) {
			int a = (int)(Math.random()*9);
			int b = (int)(Math.random()*9);
			
			int temp = -100; 
			temp = m[a]; 
			m[a] = m[b]; 
			m[b] = temp;
			System.out.print(m[j] + " ");
		}
		return shuf;
	}
	
	
}
 

 

 

6. 배열 요소중 가장 큰 값을 리턴하는 메서드를 구현하시오.

int[] m = { 21, 32, 31, 14, 51, 26, 37, 82, 19 };

int result = findMax(m) ;

System.out.println("result : " + result); // result : 82

package day07;

public class MethodQ006 {

	public static void main(String[] args) {

		int[] m = {21, 32, 31, 14, 51, 26, 37, 82, 19};
		int result = findMax(m);
		System.out.println("result : "+result);
	}

	
	static int findMax(int[] m) {

	int max = m[0];
	
	for(int i = 0; i < m.length; i++) {
			if(m[i] > max){ 
				max = m[i]; 
			}
	}
	return max;
	}
}
 

 

7. 배열 요소중 가장 작은 값을 리턴하는 메서드를 구현하시오.

int[] m = { 21, 32, 31, 14, 51, 26, 37, 82, 19 };

int result = findMin(m) ;

System.out.println("result : " + result); // result : 14

package day07;

public class MethodQ007 {

	public static void main(String[] args) {
		
		int[] m = {21, 32, 31, 14, 51, 26, 37, 82, 19};
		int result = findMin(m);
		System.out.println("result : "+result);
	}

	static int findMin(int[] m) {
		
		int min = m[0];
		
		for(int i=0; i<m.length; i++) {
			if(m[i] < min) {
				min = m[i];
			}
		}
		return min;
	}
}
 

 

 

8. minus method를 overloading 하시오.

System.out.println(minus(300,100)); // 200

System.out.println(minus(300.0f,100)); // 200.0f

System.out.println(minus(300,100.0d)); // 200.0d

System.out.println(minus(300.0f,100.0f)); // 200.0f

System.out.println(minus(300.0d,100.0f)); // 200.0d

 

package day07;

public class MethodQ008 {

	public static void main(String[] args) {
		
	int result = minus(300, 100);
	System.out.println("result : " + result);
	
	float result2 = minus(300.0f, 100);
	System.out.println("result2 : " + result2);
	
	double result3 = minus(300, 100.0d);
	System.out.println("result3 : " + result3);

	float result4 = minus(300.0f, 100.0f);
	System.out.println("result4 : " + result4);
	
	double result5 = minus(300.0d, 100.0f);
	System.out.println("result5 : " + result5);
	
	}
	
	static int minus (int a, int b) {
		int c = a-b;
		return c;
	}
	
	static float minus (float a, int b) {
		float c = a-b;
		return c;
	}

	static double minus (int a, double b) {
		double c = a-b;
		return c;
	}
	
	static float minus (float a, float b) {
		float c = a-b;
		return c;
	}
	
	static double minus (double a, float b) {
		double c = a-b;
		return c;
	}
	
}