본문 바로가기
Java

[Java] 메소드

by lmyourpearl 2025. 11. 9.

메소드는 객체의 동작에 해당하는 중괄호{ }를 말한다. 중괄호 블록 이름이 메소드 이름이며, 메소드를 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행 됨.

 

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

리턴타입: 메소트가 리턴하는 결과의 타입을 표시.

메소드 이름: 메소드의 기능이 드러나도록 실별자 규칙에 맞게 이름을 지어준다.

매개 변수 선언: 메소드를 실행할 때 필요한 데이터를 받기 위한 변수를 선언.

메소드 실행 블록: 실행할 코드를 작성.

// 메소드 선언

package sec04.exam01;

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;
    }
    
    void powerOff() {
    	System.out.println("전원을 끕니다.");
    }
}
// 메소드 호출

package sec04.exam01;

public class CalculatorExample {
	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();
    }
}

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

 

매개 변수의 개수를 모를 경우

메소드의 매개 변수는 개수가 이미 정해져 있는 것이 일반적이지만, 어떤 상황에서는 메소드를 선언 할 때 매개 변수의 개수를 알 수 없는 경우도 있는데, 예를 들어 여러 개의 수를 모두 합산하는 메소드를 선언해야 한다면 몇 개의 매개 변수가 입력될지 알 수 없기 때문에 매개 변수의 개수를 결정 할 수 없다. 그럴 땐, 매개 변수를 배열 타입으로 선언.

// 매개 변수의 개수를 모를 경우

package sec04.exam02;

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() 메소드의 실행문이 일치하는데, 매개 변수의 선언 방법만 다를 뿐 매개 변수의 타입이 배열이므로 처리내용은 같음.

 

// 매개 변수의 개수를 모를 경우

package sec04.exam02;

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
// result1: 6
// result2: 15

return문

리턴값이 있는 메소드

메소드 선언에 리턴 타입이 있는 메소드는 반드시 리턴문을 사용해서 리턴값을 지정해야 하며, return문의 리턴값은 리턴 타입이거나 리턴 타입으로 변환될 수 있어야 함.

 

리턴값이 없는 메소드 : void

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

void로 선언된 메소드에서도 return문을 사용할 수 있는데, 리턴값을 지정하는 것이 아니라 메소드 실행을 강제 종료 시키는 역할.

// return문

package sec04.exam03;

public class Car {

	// 필드
    int gas;
    
    // 생성자 (기본 생성자 생략 가능)
    
    // 메소드
    void setGas(int gas) {
    	this.gas = gas;
    }
    
    boolean isLeftGas() {
    	if(gas == 0) {
        	System.out.println("gas가 없습니다.");
            return false;		// false를 리턴
        }
        System.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잔량:" + gas +")");
          return;		// 메소드 실행 종료
      }
   }
}
// return문

package sec04.exam03;

public class CarExample {
	public static void main(String[] args) {
    	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() 메소드 호출
        	Sytem.out.println("gas를 주입할 필요가 없습니다.");
        } else {
          System.out.println("gas를 주입하세요.");
       }
   }
}

메소드 호출

메소드는 클래스 내.외부의 호출에 의해 실행되는데, 클래스 내부의 다른 메소드에서 호출할 경우에는 단순한 메소드 이름으로 호출하면 되지만, 클래스 외부에서 호출할 경우에는 객체가 존재해야 메소드도 존재하므로 우선 클래스로부터 객체를 생성한 뒤 참조 변수를 이용해서 메소드를 호출해야 함.

 

객체 내부에서 호출

// 클래스 내부에서 메소드 호출

package sec04.exam04;

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

*메소드가 매개 변수를 가지고 있을 때에는 매개 변수의 타입과 수에 맞게 매개값을 제공함.

// Calculator의 execute()실행

package sec04.exam04;

public class CalculatorExample {
	public static void main(String[] args) {
    	Calculator myCalc = new Calculator();
        myCalc.execute();		// Calculator의 execute()메소드 호출
    }
}

// 실행 결과
// 실행결과: 8.5

 

 

객체 외부에서 호출

// 클래스 외부에서 메소드 호출

package sec04.exam05;

public class Car {
	
    // 필드
    int speed;
    
    // 생성자 (기본 생성자 생략 가능)
    
    // 메소드
    int getSpeed() {
    	return speed;
    }
    
    void keyTurnOn() {
    	System.out.println("키를 돌립니다.");
    }
    
    void run()
    	for(int i=10; i<=50; i+=10) {
        	speed = i;
            System.out.println("달립니다.(시속:" + speed + "km/h)");
        }
    }
}
// 클래스 외부에서 메소드 호출

package sec04.exam05;

public class CarExample {
	public static void main(String[] args) {
    	Car myCar = new Car();
        myCar.keyTurnOn();
        myCar.run();
        int speed = myCar.getSpeed();
        System.out.println("현재 속도:"+ speed + "km/h");
    }
}

// 실행 결과
// 키를 돌립니다.
// 달립니다.(시속: 10km/h)
// 달립니다.(시속: 20km/h)
// 달립니다.(시속: 30km/h)
// 달립니다.(시속: 40km/h)
// 달립니다.(시속: 50km/h)
// 현재 속도" 50km/h

메소드 오버로딩

클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것을 메소드 오버로딩이라고 하며, 메소드 오버로딩의 조건은 매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다는 점.

// 메소드 오버로딩

package sec04.exam06;

public class Calculator {
	// 정사각형의 넓이
    double areaRectangle(double width) {
    	return width * width;
    }
    
    // 직사각형의 넓이
    double areaRectangle(double width, double height) {
    	return width * height;
    }
}
// 메소드 오버로딩

package sec04.exam06;

public class CalculatorExample {
	public static void main(String[] args) {
    	Calculator myCalcu = new Calculator();
        
        // 정사각형의 넓이 구하기
        double result1 = myCalcu.areaRectangle(10);
        
        // 직사각형 넓이 구하기
        double result2 = myCalcu.areaRectangle(10,20);
        
        // 결과 출력
        System.out.println("정사각형 넓이=" + result1);
        System.out.println("직사각형 넓이=" + result2);
    }
}

// 실행 결과
// 정사각형 넓이=100.0
// 직사각형 넓이=200.0

 


🔘 선언부: 메소드 선언부는 리턴 타입, 메소드 이름, 매개 변수 선언 부분을 말함.

 

🔘 void: 리턴값이 없는 메소드는 리턴 타입으로 void를 기술해야 함.

 

🔘 매개 변수: 메소드 호출 시 제공되는 매개값은 메소드 선언부의 매개 변수에 차례대로 대입되어, 메소드 블록 실행 시 이용됨.

 

🔘 return문: 메소드 선언부에 리턴 타입이 있다면 리턴값을 지정하기 위해 return문이 반드시 있어야 하며, 리턴 타입이 void라면 return문은 필요없지만, 메소드 실행 종료를 위해 사용할 수도 있음.

 

🔘 호출: 메소드를 실행하려면 '메소드 이름(매개값,...)' 형태로 호출.

 

🔘 오버로딩: 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것을 메소드 오버로딩이라고 하며, 메소드 오버로딩의 조건은 매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다는 점.

'Java' 카테고리의 다른 글

[Java] 패키지와 접근 제한자  (0) 2025.11.10
[Java] 인스턴스 멤버와 정적 멤버  (0) 2025.11.10
[Java] 생성자  (0) 2025.11.09
[Java] 필드  (0) 2025.11.06
[Java] 클래스  (0) 2025.11.06