본문 바로가기
JAVA

JAVA 메서드

by 요리하다그만둠 2022. 7. 21.

메서드는 객체의 동작에 해당하는 중괄호 {} 블록을 말합니다. 중괄호 블록은 이름을 가지고 있는데,

이것이 메서드 이름입니다. 메서드를 호출하게 되면 중괄호 블록에 있는 모든 코드듣ㄹ이 일관적으로 실행됩니다.

메서드는 필드를 읽고 수정하는 역할도 하지만, 다른 객체를 생성해서 다양한 기능을 수행하기도 합니다.

메서드는 객체 간의 데이터 전달의 수단으로 사용됩니다. 외부로부터 매개값을 받을 수도 있고, 실행 후 어떤 값을 리턴할 수도 있습니다.

 

메서드 선언

메서드 선언은 선언부(리턴타입, 메서드 이름, 매개변수 선언) 와 실행 블록으로 구성됩니다. 메서드

선언부를 메서드 시그니처 라고도 합니다.

 

리턴 타입은 메서드가 실핼 후 리턴하는 값의 타입을 말합니다. 메서드는 리턴값이 있을 수도 있고 없을 수도 잇습니다.

메서드가 실핼 후 결과를 호출한 곳에 넘겨줄 경우에는 리턴값이 있어야 합니다.

 

메서드 이름

메서드 이름은 자바 식별자 규칙에 맞게 작성하면 되는데 , 다음 사항에 주의하면 됩니다.

  • 숫자로 시작하면 안 되고, $와 _ 를 제외한 특수 문자를 사용하지 말아야 합니다.
  • 관례적으로 메서드명은 소문자로 작성합니다.
  • 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫머리 글자는 대문자로 작성합니다.

메서드 이름 예시

void run() {....}
void statyEngine() {....}
String getName() {....}
int[] getScores() {....}

메서드 이름은 이 메서드가 어떤 기능을 수행하는지 쉽게 알 수 있도록 기능 이름으로 지어주는것이 좋습니다.

메서드명의 길이는 프로그램 실행과는 무관하니, 너무 짧게 주지 않도록 합니다.

 

매개 변수 선언

매개 변수는 메서드가 실행할 때 필요한 데이터를 외부로부터 받기 위해 사용됩니다. 매개 변수도 필요한 경우가 있고 필요 없는 경우도 있습니다. 

 

예제 Calculator 클래스에서 메서드를 선언하고 사용된 return문을 설명하겠습니다.

public class Calaulator {
	
	// 메서드
	void powerOn() {
		System.out.println("전원을 켭니다.");
	}
	
	int plus(int x, int y) {
		int result = x + y;
		return result;
	}
	
	double divide(int x, int y) {
		double result = (double)x / (double)y;
		return result;
	}
	
	void powerOff() {
		System.out.println("전원을 끕니다.");
	}
}

여기서 void 형이 아닌 메서드를 작성할떄는 빨간줄이 그어지며 이 메서드는 리턴 타입을 넣던지 void로 해~라는 말이나옵니다.

void 형은 리턴타입이 필요없고

void 형이 아닐경우에는 꼭 리턴 타입을 넣어주어야합니다.

public class CalaulatorExample {

	public static void main(String[] args) {
		// 생성자 생성
		Calaulator myCalc = new Calaulator();
		myCalc.powerOn();
		
		int result1 = myCalc.plus(5, 6);
		System.out.println("result1 : " + result1);
		
		byte x = 10;
		byte y = 4;
		double result2 = myCalc.divide(x, y);
		System.out.println("result2 : " + result2);
		
		myCalc.powerOff();
	}

}

CalaulatorExample 출력 결과

매개 변수의 수를 모를 경우

메서드의 매개 변수는 개수가 이미 정해져 있는 것이 일반적이지만, 경우에 따라서는 메서드를 선언할 때 매개 변수의 개수를 알 수 없는 경우도 있습니다. 예를 들어 여러 개의 수를 모두 합산하는 메서드를 선언해야 한다면, 몇 개의 변수가 입력될지 알 수 없기 때문에 매개 변수의 개수를 결정할 수 없을 것입니다.

해결책은 매개 변수를 배열 타입으로 선언하는 것입니다.

int sum1(int[] values) {   }

sum1() 메서드를 호출할 때 배열을 넘겨줌으로써 배열의 항목 값들을 모두 전달할 수 있습니다. 배열의 항목 수는 호출할 대 결정됩니다.

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

매개 변수를 배열 타입으로 선언하면, 메서드를 호출하기 전에 배열을 생성해야 하는 불편한 점이 있습니다. 그래서 배열을 생성하지 않고 값의 리스트만 넘겨주는 방법도 있습니다. 다음과 같이 sum2() 메서드의 매개 변수를 "..." 를 사용해서 선언하게되면 메서드 호출 시 넘겨준 값의 수에 따라 자동으로 배열이 생성되고 매개값 으로 사용됩니다.

ints sum2(int ...values) {     ]

"..."로 선언된 매개 변수의 값은 다음과 같이 메서드 호출 시 리스트로 나열해주면 됩니다.

int result = sum2(1, 2, 3);
int result = sum2(1, 2, 3, 4, 5);

"..."로 선언된 매개 변수는 배열 타입이므로 다음과 같이 배열을 직접 매개값으로 사용해도 좋습니다.

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

 

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;
	}
}

sum1()과 sum2() 메서드의 실행문들이 완전 일치하는 것을 볼 수 있습니다. 매개 변수의 선언 방법만 다를 뿐이지 매개 변수의 타입이 배열이므로 처리 내용이 같을 수밖에 없습니다.

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 );
	}
}

 

ComputerExample 출력 결과

 

리턴문

리턴값이 있는 메서드

메서드 선언에 리턴타입이 있는 메서드는 반드시 리턴 타입이 필요합니다.(간단하게 생각하면 void가 없을 경우)

 

void로 선언된 리턴값이 없는 메소드에서는 return문으로 메소드 싱행을 강제 종료 시킵니다.

 

예로 gas 값이 0보다 클 경우 계속해서 while 문을 실행하고, 0일 경우 return문을 실행해서 run()메서드를 즉시 종료시킵니다. while문이 한 번 루핑할 때마다 gas를 1씩 감소하기 때문에 언젠가는 0이되어 run()메서드를 종료 시킵니다.

(만약 while문 뒤에 실행문이 추가적을 더 있을 경우, break문을 반드시 사용해야 합니다.)


public class Car {
	// 필드
	int gas;
	
	// 생성자
	
	// 메서드
	void setGas(int gas) {
		// 리턴값이 없는 메서드로 매개값을 받아서
		// gas 필드값을 변경
		this.gas = gas;
	}
	
	boolean isLeftGas() {
		// 리턴값이 boolean인 메서드로 gas 필드값이 0 이면
		// false를 리턴 0이 아니면 true를 리턴
		if(gas == 0) {
			System.out.println("gas가 없습니다");
			return false; // false를 리턴
		}
		System.out.println("gas가 있습니다.");
		return true; // true를 리턴
	}
	
	void run() {
		// 리턴값이 없는 메서드로 gas 필드값이 0이면 return문으로 메서드를 강제종료함
		while(true) {
			if(gas > 0) {
				System.out.println("달립니다.(가스 잔량 : " + gas + ")");
				gas -= 1;
			}else {
				System.out.println("멈춥니다.(가스 잔량 : " + gas + ")");
				return; // 메서드 종료
			}
		}
	}
}

 

public class CarExample {
	public static void main(String[] args) {
		// 1번 생성자 선택
		Car myCar = new Car(); 
		
		myCar.setGas(5);  // Car의 setGas() 메서드 호출
		
		boolean gasState = myCar.isLeftGas(); 
		// Car의 isLeftGas() 메서드 호출
		if(gasState) {
			System.out.println("출발합니다.");
			myCar.run(); // Car의 run 메서드 호출
		}
		
		if(myCar.isLeftGas()) {
			// Car의 isLeftGas() 메서드 호출
			System.out.println("gas를 주입할 필요가 없습니다.");
		}else {
			System.out.println("gas를 주입해주세요");
		}
		
	}
}

 

CarExample 출력결과

'JAVA' 카테고리의 다른 글

int와 Integer 차이  (0) 2022.10.31
제네릭  (0) 2022.08.23
JAVA 생성자 오버로딩  (0) 2022.07.20
JAVA 필드 초기화  (0) 2022.07.20
JAVA 생성자  (0) 2022.07.19