[Java] class 의 구성요소 : ② 메소드

2022. 1. 3. 16:17

1. 메소드 

객체의 동작에 해당하는 것을 의미한다.

메소드를 호출하게 되면, 중괄호 블록에 있는 코드들이 일괄적으로 수행되게 된다.

따라서 메소드를 통해 외부로부터 매개값을 받기도 하고, 실행 후 어떤 값을 반환할 수도 있다.

 

메소드의 형태

출처 : https://kephilab.tistory.com/48?category=395674

1-1 반환 타입 

메소드가 실행된 후 반환하는 값의 형태, 타입을 의미한다. 반환 값은 있을 수도, 없을 수도 있다.

만약 메소드를 통해 출력한 결과값을 타 클래스나 메소드에 넘겨줄 경우에는 반환값이 있어야 한다.

 

따라서 반환 값이 없을 경우 void 라 쓰고

반환 값이 있으면 데이터 타입을 입력한다. ( byte, int, long, float, double... String...  등)

 

1-2 메소드 이름

메소드의 이름은 자바 식별자 규칙의 의거하여 작성되어야 한다.

- 숫자로 시작이 불가능하고, $와 _를 제외한 특수 문자는 사용 불가.

- 관례적으로 메소드 명은 소문자로 시작함

- 서로 다른 단어의 혼합일 경우, 단어의 첫 머리글자는 대문자로 작성된다. ex) get과 id 의 혼합은 getId(){}.

 

 1-3 매개 변수 선언

매개변수는 메소드가 실행될 때의 필요한 데이터를 외부에서 받아오기 위해 존재한다.

만약 매개변수가 필요없는 메소드의 경우에는 ( ) 빈 값으로 놔두기도 한다.

void powerOn () {
	System.out.println("전원을 킵니다.");
    }

매개변수가 필요없는 메소드

int hap(int a, int b) {
	int result = a + b;
    	return = result; // 반환값이 존재하는 메소드에는 반드시 return 이 있어야 한다.
}

매개변수가 필요한 메소드

public calss Calculator {
	void powerOn () {
    System.out.println("전원을 킵니다.");
    }
    void powerOff () {
    System.out.println("전원을 끕니다.");
    }
    int hap( int a, int b) {
    int result = a + b;
    return result;
    }
    double divide ( int a, int b) {
    double result = (double)a / (double)b;
    return result;
    }
}
public class CalculatorEx {
	public static void main(String[] args) {
    Calculator ca = new Calculator();
    ca.powerOn(); // 전원을 킵니다.
    
    int result01 = ca.hap(3, 4);
    System.out.println(result01); // 7
    
    byte a = 25;
    byte b = 10;
    double result02 = divide(a, b); // 매개변수에 정수를 직접 대입하는 것이 아니라 변수로 대입할 경우
    					// byte 타입이나 short 타입의 경우 a,b가 int로 변환된다.
    System.out.println(result02); // 2.5 
    ca.powerOff(); // 전원을 끕니다.
    }
}

 

1-4 매개변수가 몇 개가 될 지 모를 경우

대표적으로 여러 개의 정수들을 모두 합하는 메소드의 경우에는 매개변수가 얼마나 들어올 지 알 수 없다.

이럴 경우, 매개변수에 1) 배열을 사용한다. 2) 리스트를 사용한다. 의 두 가지 해법이 있다.

 

1) 배열을 사용할 경우

int sum1 ( int[] values ) { ... }
// 호출
int value = {1, 2, 3};
int result1 = sum1(value); // 3행에 생성한 배열인 {1, 2, 3}을 sum1 의 매개변수에 대입함.
// 그런데 새로운 배열을 대입하고 싶을 때에는? 
int result2 = sum1(new int[] {1, 2, 3, 4, 5}); new를 사용해 새 배열을 만들고 배열값을 입력

2) 리스트를 사용할 경우

public class sum2 {
    int sum3(int... values) {
        int sum = 0;
        for (int i = 0; i < values.length; i++) {
            sum += values[i];
        }
        return sum;
    }
    int result = sum3(1, 2, 3);
    int result2 = sum3(1, 2, 3, 4, 5, 6);

    public static void main(String[] args) {
        sum2 s = new sum2();
        System.out.println(s.result); // 6
        System.out.println(s.result2); // 21
    }
}

 

1-5 Return 리턴문

1-3에서 잠깐 언급했지만 메소드에서 반환값이 존재하는 경우, 반드시 ruturn ... 문을 지정해야 한다.

리턴문은 return ... 이라는 형태이며, "=" 이콜은 사용하지 않는다.

int hap (int a, int b) {
	int result = a + b;
    return result;
    System.out.println(result); // 리턴 이후, 실행문이 오면 에러발생. 리턴문 이후에는 실행안됨
}

 

void 로 표시되는, return 값이 없는 메소드의 경우에도 return 문을 사용할 수 있다.

return을 사용 시에는 메소드의 사용을 종료시킨다. 

public class Gas{
   //필드
    int gas;
    //생성자 : 생략, 기본생성자
    //메소드
    void setGas(int gas) {
    	this.gas = gas; // setGas 로 받는 매개변수 gas 는 class Gas 의 필드데이터 gas임;
    }
    boolean leftGas() {
    	if ( gas == 0 ) {
          System.out.println("gas가 없습니다.");
          return false;  // false 값을 리턴함
        } else { Ststem.out.println("gas가 있습니다.");
          return true;  // true 값을 리턴함
        }
	}
    void run() {
    	while (true) {
        	if ( gas > 0 ) {
            	System.out.println("gas가 "+gas+"리터 남았습니다.");
                gas -= 1;
            } else {
            	System.out.println("gas가 없습니다.")
                return; // 매소드 종료 
}}}
public class GasEx{
	public static void main(String[] args){
    Gas ga = new Gas();
    ga.setGas(5); // gas 값이 5가 됨.
    
    boolean gasState = ga.leftGas(); // gas가 5일 때의 leftGas()를 실행.
    if (gasState) { // gasState가 참이라면, 아래를 출력함;
    	System.out.println("출발합니다.");
        ga.run();
    }
    if (ga.leftGas()) { // 참이라면 => leftGas의 참의 의미는 gas가 있다는 것.
    	System.out.println("gas를 주입할 필요가 없습니다.");
        } else {
        System.out.println("gas를 주입해주세요.");
        }
    }
}

 

1-6 메소드 오버로딩

생성자의 오버로딩과 비슷하게, 메소드 역시 오버로딩이 가능하다.

다만 차이점은 메소 오버로딩의 경우, 매개변수 간의 순서가 달라질 때도 오버로딩을 선언할 수 있다는 점이다.

 

메소드의 오버로딩이 필요한 이유는 매개값을 다양하게 받아서 처리하기 위함이다.

int plus(int a, int b){
	int result = a + b;
    return  result;
}

double plus(double a, double b) {
	double result = a + b;
    return result;
}

하나의 plus() 메소드를 오버로딩했다. 

만약 매개변수 a, b에 대해서 누군가는 int 값인 1, 2로 입력할 수도 있고, 누군가는 실수값인 1.0, 2.0으로 입력할 수도 있다.

하지만 오버로딩을 통해 정수값과 실수값 모두 처리가 가능해져서 오류가 발생하지 않고, plus() 메소드는 정상적으로 작동한다.

 

BELATED ARTICLES

more