본문 바로가기
Programming Language/Java

[Java/개념] 메소드(Method)

by woongii 2024. 10. 14.

메소드는 객체의 동작을 정의하는 코드 블록을 의미한다. 메소드가 호출되면 중괄호 {} 내에 작성된 모든 코드가 순차적으로 실행된다. 메소드는 객체의 필드를 읽거나 수정할 수 있고, 다른 객체를 생성하여 다양한 작업을 수행하는 역할을 한다. 또한, 메소드는 객체 간 데이터 전달 수단으로도 사용되며, 외부에서 데이터를 입력받아 처리하거나 처리 결과를 반환할 수 있다.

 

1. 메소드 선언

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

리턴타입 메소드이름(매개변수선언){
//실행할 코드를 작성하는 곳
}

 

1) 리턴 타입

리턴 타입은 메소드가 실행 후 반환하는 값의 데이터 타입을 의미합니다. 메소드는 값을 반환할 수도 있고, 반환하지 않을 수도 있다. 반환 값이 없을 경우, 리턴 타입에 void를 명시하고, 반환 값이 있을 경우에는 해당 데이터 타입을 명시한다.

// 리턴 값이 없는 경우
void methodCall() { ... }  

// 리턴 값이 있는 경우
double methodCall(int x, int y) { ... }

 

리턴 값이 있는 경우 메소드를 호출한 후 그 값을 변수에 저장하거나 단순 실행할 수 있다.

// 리턴 값 없는 메소드 호출
methodCall();

// 리턴 값 있는 메소드 호출
double result = methodCall(10, 20);  // 결과 값을 변수에 저장
methodCall(30, 40);  // 결과 값을 사용하지 않고 실행만

 

2) 메소드 이름

메소드 이름은 자바 식별자 규칙에 맞게 작성하면 된다.

  • 숫자로 시작할 수 없다.
  • $, _ 이외의 특수 문자는 사용할 수 없다.
  • 관례적으로 메소드명은 소문자로 시작하며, 여러 단어가 혼합될 경우 카멜 표기법을 사용한다.

3) 매개변수 선언

매개변수는 메소드가 실행될 때 외부에서 입력받는 데이터를 의미한다. 매개변수는 컴파일 시점에 올바른 타입의 값이 전달되지 않으면 오류가 발생한다.

int plus(int x, int y) {
    return x + y;
}

 

public class Calculator {
    // 전원 켜기 메소드
    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("전원을 끕니다.");
    }

    public static void main(String[] args) {
        Calculator calc = new Calculator();
        calc.powerOn();

        // 두 정수를 더한 결과 출력
        int result1 = calc.plus(5, 6);
        System.out.println("result1: " + result1);

        // 두 정수를 나누는 결과 출력
        byte x = 10;
        byte y = 4;
        double result2 = calc.divide(x, y);  // 잘못된 메소드 호출 수정
        System.out.println("result2: " + result2);

        calc.powerOff();
    }
}

/*
결과:
전원을 켭니다.
result1: 11
result2: 2.5
전원을 끕니다.
*/

 

2. 가변 매개변수

매개변수의 개수를 미리 알 수 없을 때는 배열을 사용하거나 ...를 사용해 가변 매개변수를 선언할 수 있다.

 

1) 배열을 사용하는 방법

int sum(int[] values) {
    int result = 0;
    for (int value : values) {
        result += value;
    }
    return result;
}

int[] values = {1, 2, 3};
int result = sum(values);

 

2) 가변 매개변수 사용

"..." 를 사용하면 배열을 생성하지 않고, 메소드 호출 시 여러 값을 나열할 수 있다.

int sum(int ... values) {
    int result = 0;
    for (int value : values) {
        result += value;
    }
    return result;
}

int result = sum(1, 2, 3, 4);

 

[예시 코드]

public class Computor{
	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;
    }
}

public class ComputorEx{
	public static void main(String[] args){
    	Computor com = new Computor();
        
        int[] values1 = {1,2,3};
        int result1 = com.sum1(values1);
        System.out.println("result1: " + result1);
        
        int result2 = com.sum2(1,2,3);
        System.out.println("result2: " + result2);
    }
}

/*
결과는 동일하다
result1: 6
result2: 6
*/

3. 리턴 (return)문

1) 리턴 값이 있는 메소드

리턴 타입이 명시된 메소드에서는 반드시 return문을 통해 값을 반환해야 한다. return문이 실행되면 메소드는 즉시 종료된다. 리턴문 사용 시 주의점은 리턴문 이후 실행문이 오면 결코 실행되지 않기 때문에 "Unreachable code" 라는 컴파일 오류가 발생한다.

int plus(int x, int y) {
    return x + y;
}

 

2) 리턴 값이 없는 메소드

void로 선언된 메소드에서는 return문을 생략하거나, 메소드를 강제 종료할 때 return을 사용할 수 있다.

void printMessage(String message) {
    if (message == null) {
        return;  // 메소드를 종료
    }
    System.out.println(message);
}

 

[예시 코드]

public class Car {
    int gas;

    // gas 필드 값을 설정하는 메소드
    void setGas(int gas) { 
        this.gas = gas;
    }

    // gas가 남아 있는지 확인하는 메소드
    boolean isLeftGas() {
        if(gas == 0) {
            System.out.println("gas가 없습니다.");
            return false;
        }
        System.out.println("gas가 있습니다.");
        return true;
    }

    // 자동차가 달리는 메소드
    void run() {
        while(true) {
            if(gas > 0) {
                System.out.println("달린다. (gas의 잔량: " + gas + ")");
                gas -= 1;  // 달릴 때마다 gas를 1씩 감소
            } else {
                System.out.println("멈춘다. (gas의 잔량: " + gas + ")");
                return;  // gas가 0이면 멈추고 메소드 종료
            }
        }
    }
    
    public static void main(String[] args) {
        Car myCar = new Car();  // Car 객체 생성

        myCar.setGas(5);  // gas 5 설정

        if(myCar.isLeftGas()) {  // gas가 있으면 run 메소드 실행
            myCar.run();
        }
    }
}

 

4. 메소드 호출

메소드는 클래스 내부 또는 외부에서 호출될 수 있다. 클래스 내부에서는 단순히 메소드 이름으로 호출하고, 클래스 외부에서 호출할 경우에는 객체가 존재해야 메소드도 존재하기 때문에 객체를 생성한 후 참조 변수를 사용해 호출한다.

 

1) 객체 내부에서 호출

public class Calculator{
     int plus(int x, int y){
     	int result = x + y;
        return result;
     }
     
     double avg(int x, int y){
     	double sum = plus(x,y);
        double result = sum / 2;
        return result;
     }
     
     void execute(){
     	double result = avg(7,10);
        println("실행 결과: " + result);
     }
     
     void println(String message){
     	System.out.println(message);
     }
}

public class CalculatorEx{
     public static void main(String[] args){
    	Calculator calc = new Calculator();
        calc.execute();
    }
}
/*
결과: 
실행 결과: 8.5
*/

 

2) 객체 외부에서 호출

public class Car{
	int speed;
    int getSpeed(){
    	return speed;
    }
    
    void keyTurnOn(){
    	System.out.println("키를 돌립니다.");
    }
    
    void run(){
    	for(int i=10;i<=30;i+=10){
        	speed = i;
            System.out.println("달립니다.(시속: " + speed + "km/h)");
        }
    }
}

public class CarEx{
     public static void main(String[] args){
    	Car car = new Car();
        car.keyTurnOn();
        int speed = car.getSpeed();
        System.out.println("현재 속도: " + speed + "km/h");
    }
}
/*
결과: 
키를 돌립니다.
달립니다.(시속: 10km/h)
달립니다.(시속: 20km/h)
달립니다.(시속: 30km/h)
현재 속도: 30km/h
*/

 

5. 메소드 오버로딩

클래스 내에 같은 이름의 메소드를 여러개 선언하는 것을 메소드 오버로딩(method overloading)이라 한다. 메소드 오버로딩은 같은 이름의 메소드를 매개변수의 타입, 개수, 순서가 다르게 선언하는 것이다. 이는 동일한 기능을 하지만 다른 데이터를 처리할 때 유용하다.

class ClassName{
	리턴타입 매소드이름 (타입1 변수1, ...){...}
    
    리턴타입 매소드이름 (타입1 변수1, 타입2 변수2 ...){...}
}//매개 변수의 타입, 개수, 순서가 달라야함

 

메소드 오버로딩이 필요한 이유는 매개값을 다양하게 받아 처리할 수 있도록 하기 위해서이다. 오버로딩된 메소드를 호출할 경우 JVM은 매개값의 타입을 보고 메소드를 선택한다. 메소드 오버로딩의 가장 대표적인 예는 System.out.println() 메소드이다. 

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

 

 

 

 

[출처: 이것이 자바다]