[Java 11] 자바 - 메소드(Method)

학습목표

  1. 메소드가 무엇인지 알고 있는가?
  2. 메소드의 형식을 정확하게 파악했는가?
  3. 매개변수와 인자, return을 정확하게 이해했는가?

메소드란?

자바에서 클래스는 속성을 표현하는 멤버변수와 동작을 나타내는 메소드를 가지고 있습니다. 그 중 메소드는 입력값이 있고, 그 입력값을 받아서 ‘동작’을 실행한 다음 결과를 도출해 내는 수학의 함수와 비슷한 개념입니다.

클래스에서 메소드를 사용하는 목적은 중복되는 코드를 줄이고 모듈화를 통해 코드의 가독성을 높일 수 있습니다. 또한 코드에 문제가 생기거나 기능을 변경할 경우에도 손쉽게 유지보수가 가능합니다.

메소드의 형식

매개변수와 멤버변수로 이루어진 클래스의 형식을 살펴보겠습니다.

class TV {    // TV 라는 클래스 안에 2개의 매개변수와 2개의 메소드가 들어있는 형태
  int channel;  // int channel 과 int volume은 채널과 음량의 속성을 나타내는 '매개변수'
  int volume;

  public void channelUp() { ... }   // 각각 채널을 올리고 내리는 '동작' 실행하는 '메소드'
  public void channelDown() { ... }
}


메소드 부분만 살펴보겠습니다. 아래의 코드는 자바 공부를 시작하며 제일 처음 작성했던 코드일 것입니다.

public static   void      main(String[] args) { ... } 
  접근제어자   반환타입   메소드 이름(매개변수 목록) { ... }


하나하나 뜯어서 살펴보면 위와 같이 구성되어 있습니다. 각 개념은 아직 배우지 않은 포함되지만 간단하게 무엇을 의미하는지 짚고 넘어가도록 하겠습니다.

  1. 접근 제어자(access modifier) : 해당 메소드에 접근할 수 있는 범위를 명시
  2. 반환타입(return type) : 메소드가 모든 작업을 마치고 반환하는 데이터의 타입을 명시
  3. 메소드 이름 : 메소드를 호출하기 위한 이름을 명시
  4. 매개변수 목록(parameters) : 메소드 호출 시에 전달되는 인수의 값을 저장할 변수들을 명시


아래의 2개의 메소드 예제를 살펴보면, 우선 2개의 예제 코드는 정확하게 동일한 의미를 가지고 있습니다.

public class Practice {
  public static void main(String[] args) {
    int i = 0;                // 여기부터
    while(i < 10) {           //    ~
      System.out.println(i);  //    ~
      i++;                    //    ~
    }                         // 여기까지 {} 내의 코드를 numbering() 메소드로 묶어 분리하면 아래와 같이 코드가 구성됩니다.
  }
}


아래의 코드는 numbering이라는 메소드를 ‘정의(선언)’하고 있고, 이 메소드는 main이라는 이름의 메소드 안에서 ‘호출’됩니다.

public class Practice {
  public static void numbering() {
    int i = 0;
    while(i < 10) {
      System.out.println(i);
      i++;              // 정의(선언)
    }
  }

  public static void main(String[] args) {
    numbering();        // 호출
    }
}

두개의 코드를 비교하면 numbering을 따로 ‘정의’하고 ‘호출’하는 방식의 코드가 더 불편하고 비효율적이라고 느껴질수도 있습니다. 그러나 앞서 메소드의 사용 목적이 코드의 중복을 줄이고 모듈화 하는 것이 핵심이므로 ‘정의’와 ‘호출’이라는 방식을 통해 더욱 효율적으로 코드를 작성할 수 있을 것입니다.

입력과 출력

우리가 사용하는 프로그램은 대부분 사용자의 입력에 따라 다른 결과를 출력합니다. 위에서 실행한 numbering이라는 메소드는 항상 동일한 동작만 시행하게 됩니다. 만약 입력값에 따라 출력값이 달라진다면 더욱 활용도가 높은 코드가 될 것입니다.

매개변수와 인자

다음은 동일한 코드를 매개변수와 인자를 활용하여 재활용성을 높인 코드를 살펴보겠습니다. 위의 코드와 다른 점은 주석으로 달아놓은 것처럼 매개변수와 인자를 추가했다는 점입니다. 이를 통해 numbering()으로 정의된 메소드에 직접 숫자를 변경하지 않아도 호출 부분의 인자를 통해서 제어가 가능해졌습니다. ‘5’라는 인자를 ‘입력’받아 매개변수 ‘int limit’에 대응되어 numbering 매개변수를 제어할 수 있게되었습니다.

public class Practice {
  public static void numbering(int limit) {   // limit => 매개변수(parameter)
    int i = 0;
    while(i < limit) {
      System.out.println(i);
      i++;
    }       
  } 
}

public static void main(String[] args) {
  numbering(5);      // 5 => 인자(argument)
}

복수의 인자

위의 코드에서 5라는 입력값 하나만 전달했습니다. 그렇다면 여러개의 입력값을 전달하려면 다음 예제와 같이 작성하면 됩니다.

public class Practice {
  public static void numbering(int init, int limit) { // init, limit => 매개변수(parameter)
    int i = init;
    while (i < limit) {
      System.out.println(i);
      i++;
    }
  }

  public static void main(String[] args) {
    numbering(1, 5);    // 1, 5 => 인자(argument)
  }
}

return

위의 코드는 println을 통해 결과를 출력합니다. 그러나 메소드 사용시 return을 통해 좀 더 활용도 높은 ‘출력’ 방법을 사용할 수 있습니다. 메소드 내에서 사용한 return은 return 뒤에 따라오는 값을 메소드의 결과로 ‘반환’하는 동시에 메소드를 ‘종료’시킵니다. 주의할 점은 return을 통해 반환할 값의 데이터 형식을 메소드의 이름 옆에 반드시 명시( 예시-(1)참고 )해주어야 한다는 것입니다.

결과를 출력하는 것은 동일하지만 return을 사용하는 이유는 return한 데이터와 출력, 파일쓰기 등 구체적인 동작을 분리해 return된 데이터의 활용성을 높이기 위한 것입니다.

예제

public class Practice {
  public static String numbering(int init, int limit) {   // (1) 'numbering'이 'return'할 값이 반드시 'String'이다
      int i = init;
      String output = "";
      while (i < limit) {
          output += i;
          i++;
      }
      return output;
  }

  public static void main(String[] args) {
      String result = numbering(1, 5);    // numbering이 리턴한 값이 변수 result에 담긴다 
      System.out.println(result);         // (1)에 의해서 result는 String만 가능하다
  }
}

실행결과

1234


return은 값을 ‘반환’하는 동작을 실행할 뿐만 아니라 메소드를 ‘중단’시키는 역할도 합니다. 아래의 코드를 살펴봅시다.

예제

public class Practice {
  public static String num(int i) {
  if (i == 0) {
    return "zero";
  } else if (i == 1) {
    return "one";       // 메소드 종료하고 값을 반환
  } else if (i == 2) {
    return "two";
  }
  return "none";
  }

	public static void main(String[] args) {
		System.out.println(num(1)); 
	}
}

실행결과

one

다음 예제를 살펴보며 return문에 대해 종합적으로 짚고 넘어가도록 하겠습니다.

예제

public class Car {
	int gas;   // 필드

	void setGas(int gas) {
		this.gas = gas;   //매개값을 받아서 gas 필드값을 변경
	}

	boolean isLeftGas() {
		if (gas == 0) {
			System.out.println("gas가 없습니다.");
			return false;	//gas == 0인 경우 값을 반환하고 메소드를 중단
		}

		System.out.println("gas가 " + gas + "만큼 있습니다.");
		return true;
	}

	void run() {
		while (true) {
			if (gas > 0) {
				System.out.println("달립니다. (gas잔량 : " + gas + ")");
				gas -= 1;
			} else {
				System.out.println("달립니다. (gas잔량 : " + gas + ")");
				return;		//return값이 없는 메소드(void)
			}
		}
	}
}
public class CarExample {
	public static void main(String[] args) {
		Car myCar = new Car();

		myCar.setGas(5);		//Car의 setGas() 메소드 호출
		
		boolean gasState = myCar.isLeftGas();
		if (gasState) {
			System.out.println("출발합니다.");
			myCar.run();		//Car의 run() 메소드 호출
		}
		if (myCar.isLeftGas()) {		//Car의 isLeftGas() 메소드 호출
			System.out.println("gas를 주입할 필요가 없습니다.");
		} else {
			System.out.println("gas를 주입하세요.");
		}
	}
}


매개 변수의 수를 모를 경우

메소드를 선언할 때 매개변수의 개수를 알 수 없는 경우나 하나의 메소드는 하나의 값만을 반환할 수 있기 때문에 여러 개의 값을 출력하고 싶다면 배열에 담아 출력하면 됩니다.

매개변수를 배열 타입으로 선언

int sum1(int[] values){  }
int[] values = { 1, 2, 3};
int result = sum1(values);
int result = sum1(new int[] { 1, 2, 3, 4, 5});


매개변수 …을 사용해서 선언

int sum1(int ... values){  }
//방법 1
int result = sum2(1, 2, 3);
int result = sum2(new int[] { 1, 2, 3, 4, 5});

//방법 2
int[] values = { 1, 2, 3};
int result = sum2(values);
int result = sum2(new int[] { 1, 2, 3, 4, 5});


getNumbers가 리턴한 배열을 numbers 변수가 담아 여러개의 데이터를 출력했습니다. nembers 변수를 이용해서 출력 뿐만 아니라 여러 개의 데이터를 처리할 수 있습니다.

예제 1

import java.util.Arrays;

public class NotePad0419 {
	public static int[] getNumbers() {
		int[] numbers = { 20, 34, 52, 55, 76, 90 };
		return numbers;
	}

	public static void main(String[] args) {
		int[] numbers = getNumbers();
		System.out.println(Arrays.toString(numbers));
	}
}
 

실행결과

[20, 34, 52, 55, 76, 90]


예제 2

[Comper.java]

public class Computer {
	int sum1(int[] values) {
	int sum = 0;
	for(int i = 0; i <values.length; i++) {
		sum += values[i];
	}
	return sum;
}

	int sum2(int ... values) {
		int sum = 0; 
		for(int i = 0; i < values.length; i++) {
			sum+=values[i];
		}
		return sum;
	}
}

[ComputerExaple.java]

public class ComputerExample {
	public static void main(String[] args) {
		Computer myCom = new Computer();

		int[] values1 = { 1, 2, 3 };
		int result1 = myCom.sum1(values1);
		System.out.println("result1 : " + result1);

		int result2 = myCom.sum1(new int[] { 1, 2, 3, 4, 5 });
		System.out.println("result2 : " + result2);

		int result3 = myCom.sum2(1, 2, 3);
		System.out.println("result3 : " + result3);

		int result4 = myCom.sum2(1, 2, 3, 4, 5);
		System.out.println("result4 : " + result4);
	}
}

실행결과

result1 : 6
result2 : 15
result3 : 6
result4 : 15


태그:

카테고리:

업데이트:

댓글남기기