JAVA

메서드 (method) — 형태에 따른 정의 & 호출

태로미 2023. 2. 22. 21:13

 

 

 

 

 

 

 

 

 

 

▶▶   메서드(method)

–  동작(작업)의 최소 단위,  작업을 수행하는 코드들의 모음.
    ex )  '밥먹다'의 기능을 메서드로 표현 (밥을 떠서 입에 넣고 씹기 등)
–  메서드는 반드시 호출되어야만 실행할 수 있음.
    →  호출하는 메서드 = caller   /   호출 당하는 메서드 = worker
–  메서드 호출 시 메서드에 전달하는 값 전달인자(Argument=args)라고 하며,
    이 전달 인자를 전달받아 저장하는 변수를 매개변수(Parameter)라고 함.
–  메서드가 호출되면 작업을 수행한 후에 반드시 호출한 위치로 돌아감.
    →  이 때, 호출한 곳으로 전달하는 값을 리턴값(Return Value)이라 함.
–  리턴타입을 명시한 메서드는 반드시 return문을 사용하여 데이터를 리턴해야 함.
    →  단, 리턴타입이 void인 메서드는 return문을 생략해도 되고, 리턴값 없이 return문만 기술할 수 있음.
    →  메서드 내에서 return문을 만나면 즉시 메서드를 종료하고 돌아감.
    →  if문 등의 조건식을 사용하여 return문을 실행할 경우, 
         반드시 어떤 경우에도 return문이 실행되도록 조건식을 작성해야 함.
–  main() 메서드는 자바에서 유일하게 호출하지 않아도 프로그램 실행 시점에서 자동으로 호출되는 메서드.
    →  main() 메서드를 자바 프로그램의 시작점(Starting Point)이라고 함.
–  메서드 호출 시 매개변수와 일치하는 타입 및 갯수의 데이터 전달 필수,  메서드 호출 형태로 정의 형태가 일치해야 함.

 

 

 

 

 

 

 

 

 

 

▶   메서드 정의 문법


[접근 제한자] 리턴타입 메서드명 ( [매개변수선언...] )  {
                          메서드 호출 시 수행할 코드들;
                          [return [리턴값];]
}

 –  [ ] 대괄호(브라켓)안에 들어가는건 있어도 되고 없어도 되는 것. (생략 가능)

 

 

 

 

 

 

 

 

 

 

▶   메서드 호출 문법

–  리턴값이 있는지 없는지에 따라 문법이 달라짐.
–  메서드를 호출할 때는 리턴값이 있는지 없는지 체크하기. 

 

 

 

1.   리턴값이 없는 경우


메서드명( ); 

–  파라미터가 있다면 괄호 안에 적어주면 됨.

 

 

2.   리턴값이 있는 경우

1 )  리턴되는 데이터를 변수에 저장할 경우


데이터타입 변수명 = 메서드명( );


2 )  리턴되는 데이터를 출력하거나 직접 연산에 사용하는 경우  


System.out.println( 메서드명( ) );


       

 

 

 

 

 

 

 

▶   메서드 형태   —  5가지

1.   파라미터도 없고,  리턴값도 없는 메서드
2.   파라미터는 없고,  리턴값만 있는 메서드
3.   파라미터만 있고,  리턴값은 없는 메서드
4.   파라미터도 있고,  리턴값도 있는 메서드
5.   파라미터가 2개 이상인 메서드

 

 

 

 

 

▸   메서드 형태에 따른 (worker 메서드) 호출 방법

–  main 메서드 밖에 메서드를 정의하고,  호출할 때는 main 메서드 안에서 함.

 

 

 

1.  파라미터도 없고,  리턴값도 없는 메서드 

–  파라미터(인자값(argument)을 받는 변수)도 없고, 리턴값(돌려받을 값)도 없는 메서드
–  메서드 파라미터가 없으므로 선언부 소괄호() 안에 아무것도 명시하지 않음.
–  리턴값이 없으므로 리턴타입 부분에 특수한 데이터타입인 void 타입을 명시.
    (void = 리턴값이 없다는 의미)

 


EX1   )

 

—   sister_1 메서드 정의

public static void sister_1() {
	System.out.println("동생 : 오빠가 불 끄라고 해서 불을 껐다!");
}

→   메서드가 종료되면 메서드를 호출한 곳으로 흐름이 이동 (되돌아감)

→   블럭부분까지 실행을 다 하고 나서 다시 위의 sister_1()로 돌아감.

 

—   sister_1 메서드 호출

System.out.println("동생아 불 좀 끄고 가라!");
sister_1();		// 메서드 호출
System.out.println("동생이 불을 끄고 갔다.");

// System.out.println(sister_1());

→   매개변수 파라미터가 없으므로 소괄호에 전달할 데이터도 없음.

→   주의!  리턴값이 없는 메서드는 출력문에서 호출하거나 변수에 대입 불가능! 주석처리함.

   실행 결과

더보기

동생아 불 좀 끄고 가라!
동생 : 오빠가 불 끄라고 해서 불을 껐다!
동생이 불을 끄고 갔다.

 

 

 

 

 

 

 

2.   파라미터는 없고, 리턴값만 있는 메서드

–  메서드 파라미터가 없으므로 선언부 소괄호()안에 아무것도 명시하지 않음.
–  리턴값이 있으므로 리턴할 데이터와 일치하는 데이터타입을 리턴타입 부분에 명시


EX2   )

 

—   sister_2 메서드 정의

public static String sister_2() {
	System.out.println("동생 : 오빠가 물을 떠오라고 시켜서 물을 떠다줬다");
		
//	return "물";		// 1) 리터럴을 직접 리턴하는 방법
		
	String item = "물";	// 2) 변수에 저장하여 리턴하는 방법
	return item;	
}

→   return type이 String이므로 블록안에 return이 있어야 하며, 이는 String type이여야 함!
→   return값은 리터럴을 직접 리턴하는 방법이 있고,  리턴값을 변수에 저장한 후 변수를 직접 리턴하는 방법이 있음.

 

—   sister_2 메서드 호출

System.out.println("동생아! 물 좀 떠와라!");

String result = sister_2();
System.out.println("동생이 가져다 준 것 : " + result);		// 방법1 ) 변수에 저장 후 출력

// System.out.println("동생이 가져다 준 것 : " + sister_2());	// 방법2 ) 리턴값 직접 사용

→   메서드가 실행되며 리턴값('물')을 가져왔는데 리턴값을 어떻게 하란 말이 없음. 그럼 걍 버림.
→   리턴값이 있는 메서드 호출 후, 변수에 저장하거나 출력문에 사용 가능.
      방법1 )    sister_2() 메서드 호출 후, 리턴값('물')을 전달 받아 String타입 변수result에 저장 후 출력함.
      방법2 )    리턴값을 변수에 저장하지 않고 메서드 호출과 동시에 리턴값을 바로 출력함.

   실행 결과

더보기

동생아! 물 좀 떠와라!
동생 : 오빠가 물을 떠오라고 시켜서 물을 떠다줬다
동생이 가져다 준 것 : 물

 

 


 

 

Q1   )    구구단 2단~9단까지 출력하는 gugudan() 메서드를 정의하고 호출하시오.

A1   )

public static void gugudan() {
		
	for(int i=2; i<10; i++) {
		System.out.printf(" < %d단 > \n", i);
			
		for(int j=1; j<10; j++) {
			System.out.printf("%d * %d = %d \n", i, j, i*j);
		}
		System.out.println();
	}
}

gugudan();

→   파라미터가 없으므로 메서드 선언부 소괄호()안에 아무것도 명시하지 않음.
→   리턴값이 없으므로 리턴타입에 void타입 명시.

  실행 결과

더보기

 < 2단 > 
2 * 1 = 2 
2 * 2 = 4 
2 * 3 = 6 
2 * 4 = 8 
2 * 5 = 10 
2 * 6 = 12 
2 * 7 = 14 
2 * 8 = 16 
2 * 9 = 18 

 < 3단 > 
3 * 1 = 3 
3 * 2 = 6 
3 * 3 = 9 
3 * 4 = 12 
3 * 5 = 15 
3 * 6 = 18 
3 * 7 = 21 
3 * 8 = 24 
3 * 9 = 27 

 < 4단 > 
4 * 1 = 4 
4 * 2 = 8 
4 * 3 = 12 
4 * 4 = 16 
4 * 5 = 20 
4 * 6 = 24 
4 * 7 = 28 
4 * 8 = 32 
4 * 9 = 36 

 < 5단 > 
5 * 1 = 5 
5 * 2 = 10 
5 * 3 = 15 
5 * 4 = 20 
5 * 5 = 25 
5 * 6 = 30 
5 * 7 = 35 
5 * 8 = 40 
5 * 9 = 45 

 < 6단 > 
6 * 1 = 6 
6 * 2 = 12 
6 * 3 = 18 
6 * 4 = 24 
6 * 5 = 30 
6 * 6 = 36 
6 * 7 = 42 
6 * 8 = 48 
6 * 9 = 54 

 < 7단 > 
7 * 1 = 7 
7 * 2 = 14 
7 * 3 = 21 
7 * 4 = 28 
7 * 5 = 35 
7 * 6 = 42 
7 * 7 = 49 
7 * 8 = 56 
7 * 9 = 63 

 < 8단 > 
8 * 1 = 8 
8 * 2 = 16 
8 * 3 = 24 
8 * 4 = 32 
8 * 5 = 40 
8 * 6 = 48 
8 * 7 = 56 
8 * 8 = 64 
8 * 9 = 72 

 < 9단 > 
9 * 1 = 9 
9 * 2 = 18 
9 * 3 = 27 
9 * 4 = 36 
9 * 5 = 45 
9 * 6 = 54 
9 * 7 = 63 
9 * 8 = 72 
9 * 9 = 81 

 

 


 

 

Q2   )   1~10까지 정수의 합(55)을 계산하여 리턴하는 sum()메서드를 정의하고 호출하시오.

A2   )

public static int sum() {
		
		int total = 0;
		for(int i=1; i<=10; i++) {
			total += i;
		}
		
		return total;
	}


int total = sum();
System.out.println("1~10까지 정수의 합 = "+ total);

→   리턴값이 있으므로 리턴할 데이터와 일치하는 'int' 리턴타입 부분에 명시함.
→   메서드 호출과 동시에 리턴값을 변수 total에 저장하고 출력문을 통해 출력함.

   실행 결과

더보기

1~10까지 정수의 합 = 55

 

 


 

 

Q3   )    오늘의 날씨 getWeather() 호출했을 때 '흐림'이 출력되도록 작성하시오.

A3   )

public static String getWeather() {

// 방법1
// return "흐림";

// 방법2
	String today = "흐림";
	return today;
}


// 방법1
// System.out.println("오늘의 날씨 : " + getWeather());

// 방법2
String todayWeather = getWeather();
System.out.println("오늘의 날씨 : " + todayWeather);

→   리턴타입이 String이므로 방법1처럼 직접 문자열을 리턴하거나,   방법2처럼 변수에 저장하여 변수를 리턴해줌.

→   함수 호출 시 방법1처럼 호출과 동시에 리턴값을 바로 출력하거나,  방법2처럼 변수에 리턴값을 저장한 뒤 출력 가능.

   실행 결과

더보기

오늘의 날씨 : 흐림

 

 

 

 

 

 

 

3.   파라미터만 있고,  리턴값은 없는 메서드

–  파라미터가 있으므로 메서드 선언부 소괄호( )안에 외부로부터 호출 시 전달 받는 데이터를 저장할 변수(매개변수) 선언.
–  리턴값은 없으므로 리턴타입 부분을 void로 지정.


EX3   )

 

—   sister_3 메서드 정의

public static void sister_3(int money) {

	System.out.println("동생 : 오빠가 준 돈 = " + money + "원");
	money -= 500;
		
	if(money > 0) {
	   return;		// return문을 만나면 해당 메서드를 바로 빠져 나감.
	}
	System.out.println("동생 : 새우깡 사먹고 "+money+"원이 남았다.");
}

→   파라미터로 선언된 int형 변수 money에 메서드 호출 시 전달된 값이 저장됨.
       ex )  sister_3(3000) 호출 시 int money = 3000과 동일한 코드로 취급.
→   현재 메서드 내에서 money변수를 자유롭게 사용 가능하지만 메서드를 벗어나면(블럭) 존재하지 않는 변수로 취급됨.
→   돈의 개념은 보통 양수이기 때문에 if문으로 구분해줌.
→   현재 수행중인 메서드를 종료하고 빠져나가기 위해서는 특정 조건일 때 return문이 실행되도록 해야 함.
→   리턴타입이 int형이면 그냥 return 0;이라고 써서 타입만 맞춰줘도 됨.
      어차피 내가 위에서 안쓰면 버려지는 값이므로 숫자는 중요한게 아님.

 

 

—   sister_3 메서드 호출

System.out.println("동생아! 돈 줄테니 과자를 사먹어라!");
	
//sister_3(3000);
// 방법1) 메서드 파라미터에 리터럴 값을 직접 전달하기

int myMoney = 3000;
sister_3(myMoney);
// 방법2) 변수를 사용하여 값을 지정한 뒤 파라미터에 전달하기

→   메서드 호출 시, 전달할 데이터는 메서드명 뒤의 소괄호 내에 기술함.

→   if문의 조건식이 참이 되어 return문을 만나 메서드를 빠져나왔기에 맨 밑의 출력문은 출력 되지 않음.

   실행 결과

더보기

동생아! 돈 줄테니 과자를 사먹어라!
동생 : 오빠가 준 돈 = 3000원

 

 

 

 

 

 

 

4.   파라미터도 있고,  리턴값도 있는 메서드

–  2번 유형과 3번 유형이 합쳐진 형태.


EX4   )

 

—   sister_4 메서드 정의

public static String sister_4(int money) {
	System.out.println("동생 : 오빠가 준 돈 = " + money + "원");
	money -= 500;
	System.out.println("동생 : 새우깡 사고 " + money + "원이 남았다.");
		
	return "새우깡";		// 문자열 "새우깡"을 리턴
}

→   return값에는 변수 또는 리터럴 값 하나만 쓸 수 있음.

 

 

—   sister_4 메서드 호출

System.out.println("동생아! 3000원 줄 테니,  내 과자도 사줘라~");

String snack = sister_4(3000);
System.out.println("동생이 사다준 것 : " + snack);

→   메서드 호출함과 동시에 리턴값을 변수 snack에 저장함.

   실행 결과

더보기

동생아! 3000원 줄 테니,  내 과자도 사줘라~
동생 : 오빠가 준 돈 = 3000원
동생 : 새우깡 사고 2500원이 남았다.
동생이 사다준 것 : 새우깡

 

 


 

 

Q4   )   정수를 1개 전달하면 해당 정수에 대해 홀수인지 짝수인지 판별하여 출력하는 

            checkNumber() 메서드를 호출하시오.

A4   )

public static void checkNumber(int num) {
	if(num%2==1) {
		System.out.println(num + " : 홀수");
	}else {
		System.out.println(num + " : 짝수");
	}
}


checkNumber(7);

→   값을 전달해야하므로 파라미터는 있고 따로 리턴해서 쓸 값이 없으므로 리턴값은 없는 메서드임.

   실행 결과

더보기

7 : 홀수

 

 


 

 

Q5   )   정수 1개를 전달하면,  해당 정수에 대해 홀수인지 짝수인지 판별하고,
            판별 결과 문자열을 리턴하는 checkNumber2() 메서드를 호출하시오.

A5   )

public static String checkNumber2(int num) {
	if(num%2==1) {
				
		return "홀수";
	}else if(num%2==0) {
		return "짝수";
	}
			
	return "";			// null스트링 값도 줄 수 있음
}


String result = checkNumber2(2);
System.out.println("판별 결과 : " + result);

→   null스트링 값을 줘도 빠져나올수 있음
→   if문과 else if문 내에서 직접 리턴하지 않고 리턴 데이터를 별도의 변수에 저장한 뒤, if문 종료 후 return 수행.

   실행 결과

더보기

판별 결과 : 짝수

 

 

 

 

 

 

 

5.   파라미터가 2개 이상인 메서드

–  전달되는 데이터가 int, String 형태이므로,  파라미터 선언 순서도 int, String 순서로 선언해야 함.


EX5   )

 

—   sister_5 메서드 정의

public static String sister_5(int money, String snack) {
	System.out.println("오빠가 준 돈 : " + money + "원");
	System.out.println("오빠가 준 과자 : " + snack);
	System.out.println(snack + "을 쿠쿠다스로 교환했다!");
		
	snack = "쿠쿠다스";
	return snack;
}

 

—   sister_5 메서드 호출


System.out.println("동생아! 새우깡이랑 1000원을 줄 테니 쿠쿠다스로 바꿔와라!");
	
//sister_5(1000, "새우깡");			// 방법1 ) 직접 값을 넣어 호출

int myMoney = 1000;
String snack = "새우깡";
//sister_5(myMoney, snack);			// 방법2 ) 변수를 따로 만들어서 호출

String mySnack = sister_5(1000, "새우깡");	// 방법3 ) 호출과 동시에 리턴값 변수에 저장

System.out.println("동생이 바꾸다 준 것 : " + mySnack);

   실행 결과

더보기

동생아! 새우깡이랑 1000원을 줄 테니 쿠쿠다스로 바꿔와라!
오빠가 준 돈 : 1000원
오빠가 준 과자 : 새우깡
새우깡을 쿠쿠다스로 교환했다!
동생이 바꾸다 준 것 : 쿠쿠다스

 

 


 

 

Q6   )   정수 2개를 전달하면 두 정수의 합을 리턴하는 메서드 'sum'을 호출하고,  리턴값을 출력하시오.
             ex )  10,  20 전달 시 10+20 결과인 '30' 을 리턴함

A6   )

public static int sum(int num1, int num2) {
	int sum = num1 + num2;
	return sum;
    // 메서드명이랑 변수명이랑 똑같아도 상관없음
}


int sum = sum(10, 20);
System.out.println("두 수를 더 한 값은 : " + sum);

   실행 결과

더보기

두 수를 더 한 값은 : 30

 

 


 

 

Q7   )   연산자 역할인 문자 1개와 정수 2개를 전달하면,  
            두 정수에 대한 어떤 연산을 수행한 후 결과값을 리턴하는 메서드(operation)를 호출하고

            리턴되는 값을 출력하시오.
            ex )   '+', 10, 20 전달 시 10 + 20 결과인 30 리턴   /  '-', 10, 20 전달 시 10 - 20 결과인 -10 리턴
A7   )

 

—   operation 메서드 정의

 

방법1)

public static int operation(char op, int num1, int num2) {
		
	if(op == '+') {
		return num1 + num2;
	}else if(op == '-') {
		return num1 - num2;
	}else {
		System.out.println("사용 가능한 연산자를 사용해주세요.");
		return 0;
	}
}

→   연산자를 문자데이터(char)로 취급하고 조건식을 걸어 연산자로 사용함.

→   다른 연산기호를 사용했을 땐 연산이 불가능하므로 리턴타입에 알맞게 그냥 '0'을 리턴함.

       어차피 내가 리턴값을 사용하지 않으면 버려지는 값이므로 형식만 맞춤.

 

방법2)    return문 하나만 사용

public static int operation(char op, int num1, int num2) {

	int result = 0;	
	if(op == '+') {
		result = num1 + num2;
	}else if(op == '-') {
		result = num1 - num2;
	}else {
		System.out.println("사용 가능한 연산자를 사용해주세요.");
		result = 0;
	}
	return result;
}

→   result 변수를 생성,  조건식을 거쳐 나온 연산의 값을 변수에 저장하고,  조건식 마무리 후 변수에 저장된 값을 리턴함.

 

 

—   operation 메서드 호출

int result = operation('*', 10, 20);
		
if(result != 0) {
	System.out.println("연산의 결과는 : " + result);
}else {
	System.out.println("연산이 불가능 합니다.");
}

→   정의하지 않은 연산을 쓸 경우 return값으로 0을 돌려주게 설정했는데
      사실상 연산의 결과가 0이진 않으므로,  디테일하게 설정하고 싶다면 if-else문을 사용하여 이렇게 나타낼 수 있음.