본문 바로가기

Java/Java

클래스_메소드

1. 메소드

메소드는 객체의 동작에 해당하는 구성 멤버이다.

메소드는 다음과 같은 요소들도 구성된다.

  • 리턴 타입: 메소드 실행 후 리턴하는 결과의 타입을 명시한다.
  • 메소드 이름: 메소드의 이름이다. 메소드의 기능을 잘 표현하고, 식별자 규칙에 따라 명시한다.
  • 매개변수 선언: 메소드를 실행할 때 외부로부터 데이터를 받아올 매개변수를 선언한다.
  • 메소드 실행 블록: 메소드를 호출했을 때 실행될 과정들을 작성한다.
  • 리턴타입 메소드 이름(매개변수 선언, ... , 매개변수 선언) { 메소드 실행블록 }
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 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); //byte는 int로 자동변환 가능하기 때문에, 컴파일 에러가 발생하지 않는다.
		System.out.println("result2: " + result2);
		
		myCalc.powerOff();
		

	}

}

 

 

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

어떤 상황에서는 매개변수의 개수를 알 수 없는 경우가 있다.

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

 

아래와 같이 메소드의 매개변수를 int[] values로 선언할 경우,

int[] 타입 변수를 생성한 뒤 매개변수로 사용할 수도 있고,

메소드 호출과 동시에 int[] 목록을 생성하여 사용할 수도 있다.

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

더 편한방법이 있는데, 매개변수를 ... 으로 선언하는 것이다.

이럴 경우, 메소드 호출 때 전달해준 값의 개수에 따라 자동으로 배열이 생성되어 매개값으로 사용된다.

그리고 ...으로 매개변수를 선언하면, 위의 경우처럼 직접 배열타입 변수를 생성하여 매개변수로 전달할 수 있다.

  • int sum2(int ... values);
  • int result = sum2(1, 2, 3);
  • int result = sum2(values);
  • int result = sum2(new int[] {1, 2, 3});
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;
	}
}

 

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);
		
		int result5 = myCom.sum2(values1);
		System.out.println("result5: " + result5);
		
		int result6 = myCom.sum2(new int[] {1, 2, 3, 4, 5});
		System.out.println("result6: " + result6);

	}

}

 

 

3. 리턴문

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

리턴문의 리턴값은 리턴타입과 동일하거나, 리턴타입으로 변환될 수 있어야한다.

 

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

void를 사용하는 메소드는 리턴문을 사용할 필요는 없지만, 사용할 수도 있다.

이런 경우, 리턴문은 메소드 실행을 종료하는 역할을 한다.

 

public class Car {
	//필드
	int gas;
	
	//생성자
	
	//메소드
	void setGas(int gas) {
		this.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;
			} else {
				System.out.println("멈춥니다.(gas잔량:" + gas + ")");
				return;
			}
		}
	}

}

 

public class CarExample {

	public static void main(String[] args) {
		Car myCar = new Car();
		
		myCar.setGas(5);
		
		boolean gasState = myCar.isLeftGas();
		if(gasState) {
			System.out.println("출발합니다.");
			myCar.run();
		}
		
		if(myCar.isLeftGas()) {
			System.out.println("gas를 주입할 필요가 없습니다.");
		} else {
			System.out.println("gas를 주입하세요.");
		}

	}

}

 

 

4. 메소드 호출

메소드 호출도 필드와 마찬가지로 클래스 내부, 클래스 외부에서 사용될 때 사용 방법이 다르다.

 

클래스 내부에서 호출할 때는 메소드명을 통해 호출할 수 있으며,

클래스 외부에서 호출할 때는 객체를 먼저 생성한되 객체.메소드명 으로 호출한다.

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 CalculatorExample {

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

	}

}

 

 

5. 메소드 오버로딩

생성자 오버로딩과 마찬가지로 메소드에도 오버로딩이 존재한다.

메소드에 대해서도 외부에서 주어지는 데이터의 형태가 다양할 것이며,

그 다양한 데이터 형태를 처리하기 위한 다양한 메소드가 필요하기 때문이다.

 

생성자 오버로딩과 마찬가지로 매개변수의 타입, 개수, 순서를 달리하여 메소드 오버로딩을 할 수 있으며,

매개변수 타입, 개수, 순서가 동일하고 매개변수 이름이 다르다면, 그것은 오버로딩이 아니다. 

추가적으로 매개변수 타입, 개수, 순서가 동일하고 리턴타입만 다르다면, 그것도 오버로딩이 아니다. 

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

}

 

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

	}

}

 

 

출처: 혼자 공부하는 자바(신용권)

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