Java Category/Java

[JAVA] 메소드(Method)

ReBugs 2023. 1. 2.

혼자 공부하는 자바 (저자 : 신용권)의 내용을 개인적으로 정리하는 글임을 알립니다.


메소드 선언은 선언부와 실행 블록으로 구성된다.

메소드 선언부를 메소드 시그니처라고 한다.

메소드 시그니처에는 리턴타입, 메소드 이름, 매개 변수 선언이 온다.

 

메소드 선언

리턴 타입

  • 리턴 타입은 있을 수도 있고 없을 수도 있다.
  • 리턴 타입이 없다면 void라고 명시하면 되고, 리턴 타입이 있다면 해당 타입을 명시하면 된다.
  • 리턴 타입이 있다면 반드시 리턴 값을 리턴해야 한다.
  • 리턴 값을 담는 변수와 리턴 값이 자동으로 형변환이 된다면 타입이 달라도 상관이 없다.

 

메소드 이름

  • 메소드 이름은 자바 식별자 규칙에 맞게 작성하면 된다.
  • 관례적으로 메소드 이름은 소문자로 작성한다.
  • 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫 글자는 대문자로 작성한다.

매개 변수(Parameter) 선언

  • 매개 변수 선언은 메소드의 용도(필요)에 따라서 해도 되고, 안 해도 된다.
  • 매개 변수 선언을 한 개 했다면, 메소드를 호출할 때 매개 값을 한 개 줘야 하고, 두 개를 했다면 두 개를 줘야 한다.
  • 매개 변수에 매개 값을 넘겨줄 때 자동 형 변환이 된다면 타입이 달라도 상관이 없다.
매개변수, 매개값
메소드 시그니처에 정의하는 변수를 매개변수(파라미터)라고 부르고, 메소드를 호출할 때 넘기는 변수 또는 값을 매개값이라고 한다.

Calculator.java

package TestPakage;
public class Calculator {
	void powerOn() {//매개 변수가 없는 메소드
		System.out.println("전원 ON.");
	}
	
	int plus(int x, int y) {//리턴 타입이 int이고, int 타입 매개변수가 2개인 메소드
		int result = x + y;
		return result;//리턴 타입은 int
	}
	
	double divide(int x, int y) {//리턴 타입이 double이고, int 타입 매개변수가 2개인 메소드
		double result = (double)x / (double)y;
		return result;//리턴 타입은 double
	}
	
	void powerOff() {//매개 변수가 없는 메소드
		System.out.println("전원 OFF");
	}
}

 

Test.java

package TestPakage;
public class Test {
	public static void main(String[] args) {	
		Calculator myCalc = new Calculator();
		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();
	}
}
/*
전원 ON.
result1: 11
result2: 2.5
전원 OFF
*/

 

매개 값의 개수를 모를 경우

몇 개의 매개 값이 올지 모를 경우에는 다음 두 가지 방법으로 대처하면 된다.

  • 메소드의 매개 변수를 배열 타입으로 선언
  • 값 목록으로 넘겨주기

두 가지 방법 모두 매개 변수의 선언 방법만 다를 뿐 매개 변수 타입은 둘 다 배열이다.

Calculator.java

package TestPakage;
public class Calculator {
	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;
	}
}

 

Test.java

package TestPakage;
public class Test {
	public static void main(String[] args) {	
		Calculator cal = new Calculator();
		
		int[] values1 = {1, 2, 3};
		int result1 = cal.sum1(values1);//배열을 넘김
		System.out.println("result1: " + result1);
		
		int result2 = cal.sum1(new int[] {1, 2, 3, 4, 5});//new 연산자로 배열 객체를 넘김
		System.out.println("result2: " + result2);		
		
		int result3 = cal.sum2(1, 2, 3);
		System.out.println("result3: " + result3);
		
		int result4 = cal.sum2(1, 2, 3, 4, 5);
		System.out.println("result4: " + result4);
	}
}
/*
result1: 6
result2: 15
result3: 6
result4: 15
*/

 

리턴(Return)문

리턴 값이 있는 메소드

메소드 선언에 리턴 타입이 있는 메소드는 반드시 리턴문을 사용해서 리턴값을 지정해야 한다.

만약 리턴문이 없다면 컴파일에러가 발생한다.

또한 리턴문이 실행되면 메소드는 즉시 종료된다.

 

리턴문의 리턴값은 리턴 타입이거나 리턴 타입으로 변환될 수 있어야 한다.

예를 들어 리턴 타입이 int인 메소드에서는 byte, short, int의 값이 리턴되어도 상관이 없다.

왜냐하면  byte, short는 int로 자동 타입 변환되어 리턴되기 때문이다.

 

리턴 값이 없는 메소드

리턴 값이 없는 메소드는 리턴 타입으로 void를 사용한다.

void로 선언된 메소드에서 return문은 메소드를 종료시키는 역할을 한다.

 

메소드 오버로딩

메소드 오버로딩은 생성자 오버로딩과 유사하다.

여기서는 덧 붙일 내용만 쓰겠다.

기본 개념은 밑의 링크를 눌러서 보면 될 것 같다.

2023.01.01 - [Language/JAVA] - [JAVA] 생성자(Constructor)

 

[JAVA] 생성자(Constructor)

혼자 공부하는 자바 (저자 : 신용권)의 내용을 개인적으로 정리하는 글임을 알립니다. 생성자 생성자는 new 연산자로 클래스로부터 객체를 생성할 때 호출되어 주로 객체의 초기화를 담당한다.

rebugs.tistory.com

 

매개 변수 두 개 모두 int로 오버로딩 된 메소드와 매개 변수 두 개 모두 double로 오버로딩 된 메소드가 있다고 하면, 하나는 int 타입으로 매개 값을 넘기고, 다른 하나는 double 타입으로 매개 값을 넘기면 오류가 날 것 같지만

매개 변수 두 개 모두 double로 오버로딩 된 메소드가 실행된다.

이유는 JVM은 일차적으로 매개 변수의 타입을 보지만, 매개 변수의 타입이 일치하지 않을 경우 자동 타입 변환이 가능한지를 검사하고, 자동 타입 변환이 가능한 메소드를 선택하기 때문이다.

Calculator.java

package TestPakage;
public class Calculator {
	//정사각형의 넓이
	double areaRectangle(double width) {
		return width * width;
	}
	//직사각형의 넓이
	double areaRectangle(int width, int height) {
		return width * height;
	}
	double areaRectangle(double width, double height) {
		return width * height;
	}
}

 

Test.java

package TestPakage;
public class Test {
	public static void main(String[] args) {	
		Calculator myCalcu = new Calculator();
		double result1 = myCalcu.areaRectangle(10);
		double result2 = myCalcu.areaRectangle(10, 20);
		double result3 = myCalcu.areaRectangle(10, 23.6);
		System.out.println("정사각형의 넓이 = " + result1);
		System.out.println("직사각형의 넓이 = " + result2);
		System.out.println("직사각형의 넓이 = " + result3);
	}
}
/*
정사각형의 넓이 = 100.0
직사각형의 넓이 = 200.0
직사각형의 넓이 = 236.0
*/

 

'Java Category > Java' 카테고리의 다른 글

[JAVA] 싱글톤(Singleton), final 필드와 상수  (0) 2023.01.04
[JAVA] 인스턴스 멤버와 정적 멤버  (0) 2023.01.03
[JAVA] 생성자(Constructor)  (0) 2023.01.01
[JAVA] 필드(Field)  (0) 2022.12.31
[JAVA] 클래스(Class)  (0) 2022.12.30

댓글