Java - 기본기

18. 메소드 : 선언부와 구현부, 메서드 호출, return문, 반환값

TerianP 2021. 10. 26.
728x90

1. 메서드란?

  • 문장들을 묶어놓은 것.
  • 정확히는 같은 작업을 하는 코드를 묶어 코드 중복을 줄이기 위해 사용 : 중복코드 제거, 관리 용이, 재사용 가능
  • 메서드는 값(입력)을 받아서 처리하고, 결과를 반환(출력)
    • 참고로 저는 지금까지 메서드를 사용했을 때는 값(입력) 받는 부분을 제외하고 결과를 반환하는 방법만 사용했습니다.
    • 즉 반환 타입을 void 로 넣어서 사용했습니다.
int            add           (int x, int y){
반환타입 	    메서드이름     매개변수선언(입력)
	int result = x + y;
	
	return result;
}
  • 메서드가 어떻게 동작하는지 까지는 사실 알 필요가 없음. 다만 메서드의 '기능'은 알고 있으면 편함. 예로 println 이 어떻게 동작하는지는 알 필요가 없지만, 어떤 기능(출력)을 하는지는 알고 있으면 좋다.
  • 보통 메서드는 반복적으로 수행되는 여러 문장을 메서드로 작성하거나 엄청나게 긴 코드를 하나의 메서드로 짜서 기능하도록 한다.
  • 무엇보다 하나의 메서드는 한 가지 기능만 수행하도록 작성하는 것이 좋다. 즉 최소의 의미있는 작업단위로 나누는 것이 좋다. 이는 추후 유지보수 && 재사용 시 보다 유리한 코드가 된다.
이때 질문 하나!! 함수와 메서드는 다른 것인가?
NO, 근본적으로는 같은 말이라고 생각해도 무방하다. 다만 메서드는 보다 객체지향적 언어로 메서드는 반드시!! 클래스 안에 포함 되어야 한다(클래스에 종속적). 그러나 함수는 클래스에 독립적이다.

 

2. 메서드의 선언부와 구현부

반환타입 메서드이름 (타입 변수명, 타입 변수명, ----){ => 선언부 , 매개변수는 아무것도 없거나 여러개도 가능
	// 메서드 호출시 수행될 코드 => 여기서부터 구현부
}
  • 선언부에서는 반환 타입과 메서드 이름, 매개변수를 작성한다. 이때 매개변수는 넣지 않거나 여러 개를 넣어도 무방하다. 반환 타입은 작업 결과의 출력 시 타입을 결정한다(return 했을 때 타입)
  • 구현부에서 작업 결과(return) 했을 때의 값은 0개 이거나 1개만 올 수 있다. 만약 2개 이상인 경우 객체로 묶거나 배열로 묶어서 출력해야한다.
  • 만약 매개변수가 없고, 반환도 따로 필요없는 경우 '선언부'의 반환타입에 void 를 넣어준다. 이렇게하면 return 을 사용하여 작업 결과를 작성해줄 필요가 없다.
  • 추가로 메서드의 선언부와 구현부에서 선언된 변수는 모두 지역변수(lv)로 취급된다. 즉 메서드 시작부터 끝날때까지만 유효한 변수가 된다.

 

3. 메서드 호출

public static void main(String[] args){
	메서드이름(값1,값2,....) // 메서드 호출하는 방법
}

ex)
public static void main(String[] args){
	game(); // void game() 호출
	int result = add(3, 5); // int add(int x, int y) 를 호출하고, 결과를 result 에 저장
}

int add(int x, int y){
	int result = x+y;
	return result;
}

void game(){
	println("game start!");
}

 

3-2) 메서드 활용 : 사칙연산 메서드

public class Practice_25 {
	public static void main(String[] args) {
		Mymath mm = new Mymath();
		
		System.out.println(mm.add(3, 4));
		System.out.println(mm.subtract(10, 5));
		System.out.println(mm.multiply(12, 12));
		System.out.println(mm.divide(100, 20));
	}
	
}

class Mymath{
	
	long add(long a, long b) {
		long result = a+b;
		return result;
	}
	
	long subtract(long a, long b) {
		return a-b; // 요렇게 간단하게도 가능
	}
	
	long multiply(long a, long b) {
		return a*b;
	}
	
	double divide(double a, double b) {
		return a/b;
	}
}

 

4. 메서드 실행 흐름 : 메서드 실행 순서

public class Practice_25 {
	public static void main(String[] args) {
		Mymath mm = new Mymath(); // 1. 객체 생성 -> 가장 먼저!
		
		long value = mm.add(1L, 2L); // 2. 메서드 호출

	}
	
}

class Mymath{
	
	long add(long a, long b) { // 2. 호출된 메서드 실행
		long result = a+b;
		return result; // 3. 해당 메서드(add) 의 모든 문장이 실행되거나 
									// return문을 만나면 호출한 메서드로 되돌아와서 이후 문장 실행
	}
}

1) Main 메서드에서 메서드 add 를 호출한다. 인수(파라미터, 매개변수) 1L과 2L 이 메서드 add 의 매개변수 a, b 에 각각 복사(대입)된다.

2) 메서드 add 의 괄호{ } 안에 있는 문장들이 순서대로 수행된다.

3) 메서드 add 의 모든 문장이 실행되거나 return 문을 만나면, 호출한 메서드(main 메서드)로 되돌아와서 이후의 문장들을 실행한다.

 

5. return 문, 반환값

5-1) return 문

  • 실행 중인 메서드를 종료하고, 호출한 곳으로 되돌아간다.
  • 이때 반환 타입이 void 인 경우 return 문을 생략 가능하나, void 가 아닌 경우 return 문을 생략 할 수 없고 반드시!! 써야 한다.
# 반환 타입이 void 인 경우

void printGugudan(int dan){
	if(!(2<= dan && dan <= 9){
		return; // dan 의 값이 2 ~ 9 가 아닌 경우, 호출한 곳으로 그냥 되돌아간다.
						// 메인 메소드에서 호출한 경우 메인 메소드로 그대로 되돌아감

	for(int i=1; i<=9; i++){
		printf("%d * %d = %d%n", dan, i, dan*i);
	
	return; // 반환 타입이 void 면 컴파일러가 자동 추가하기 때문에 생략 가능!!!
}


# 반환 타입이 void 가 아닌 경우
// 아래처럼 return 문을 꼭 써줘야함!!

int max(int a, int b) {
		if(a>b) {
			return a; 
		}else {
			return b;
		}
	}

5-2) 반환 값

  • 반환 값이란 메서드에서 반환 타입이 void 가 아닐 때 return 뒤에 나오는 값을 의미한다.
int max(int a, int b) {
		if(a>b) {
			return a; 
		}else {
			return b;
		}
	}

일 때 반환 값은 a 또는 b 이다.
  • 이때 반환 값은 메서드 앞에 나오는 void 가 아닌 타입 과 반드시 일치해야 하며, 만약 자동형변환이 가능한 값이라면 크게 문제는 없다.
  • 반환 값은 무조건 변수가 와야하는 것은 아니며, a+b 와 같은 계산식이 올 수도 있다. 물론 이때도 반환 타입과 일치해야 한다.

댓글