profile image

L o a d i n g . . .

article thumbnail image
Published 2022. 7. 6. 07:05

메소드? 

- 객체의 동작에 해당하는 중괄호{}블록.

- 메소드를 호출하면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행

 

리턴타입 메소드이름 ([매개변수선언, ...]){ //메소드 선언부
	//메소드 실행부
}

void일 경우 리턴값이 없다. 다만 return문을 사용 할 수 있는데, 이 경우 리턴값을 지정하는  것이 아니라 메소드 실행을 강제 종료시키는 역할을 한다.

 

 

 

 


	double divide(int x, int y) {
		double result = (double)x / y;
		return result;
	}
	
	double result = divide(10.5, 20.0);

리턴타입이 double , 매개변수가 int 타입인 divide에

매개값을 double값으로 넣어주게되면 에러가 발생한다

 

매개값은 반드시 매개 변수의 타입에 맞는 값이어야하며, 메소드가 int타입 매개변수를 갖고있다면 호출 시 매개값으로 int값이나 int로 변환할 수 있는값을 넘겨주어야한다

 


예제

package a220706;

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 / y;
		return result;
	}
	
	void powerOff() {
		System.out.println("전원을 끕니다");
	}
}
package a220706;

public class CalculatorEx {
	public static void main(String[] args) {
		Calculator cal = new Calculator();
		
		cal.powerOn();
		
		int result = cal.plus(5, 6);
		System.out.println("Result: " + result);
		
		byte x = 10;
		byte y = 35;
		int resultB = cal.plus(x, y);
		System.out.println("ResultB: " + resultB);
		
		cal.powerOff();
	}
}

 

 

 

 

 

 

 

 

 

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

메소드의 매개변수는 개수가 이미 정해져 있는 것이 일반적이나, 메소드 선언 시 매개변수의 개수를 알 수 없는 경우도 있다.

 

 

int sum(int[] values){}

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

 

 

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

메소드를 호출 할 때 배열을 넘겨줌으로써 배열의 항목값들을 전달 할 수 있으며, 배열의 항목 수는 호출 시 결정된다

 

 

 

 

하지만  이렇게 매개변수를 배열 타입으로 선언하면 메소드 호출 전 배열생성의 불편함이 있다.

이때는 배열을 생성하지 않고 값의 목록만 넘겨주면 된다

int sum(int ...values){}
int result = sum(1, 2, 3);
int result = sum(1, 2, 3, 4, 5);

 

 

 

 


예제

package a220706;

public class Computer {
	
	int sum(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;
	}
}

위처럼 매개변만 다르고 메소드 실행문이 완전 일치하는 것을 볼 수 있다

 

package a220706;

public class ComputerEx {
	public static void main(String[] args) {
		Computer computer = new Computer();
		
		int[] values = {1,2,3};
		int result = computer.sum(values);
		System.out.println("result: " + result);
		
		int result2 = computer.sum(new int[] {1, 2, 3, 4, 5});
		System.out.println("result2: " + result2);
		
		int result3 = computer.sum2(1, 2, 3);
		System.out.println("result3: " + result3);
		
		int result4 = computer.sum2(new int[] {1, 2, 3, 4, 5});
		System.out.println("result4: " + result4);
	}
}

 

 

 

 

 

 

return

package a220706;

public class Car {
	int gas;
	
	void setGas(int gas) {
		// 리턴값이 없는 메소드로 매개값을 받아 gas필드값 변경
		this.gas = gas;
	}
	
	boolean isLeftgas() {
		if (gas == 0) {
			System.out.println("gas가 없습니다");
			return false;
		}
		System.out.println("gas가 있습니다");
		return true; //boolean에 대한 값 반환
	}
	
	void run() {
		while (true) {
			if(gas > 0) {
				System.out.println("달립니다.(gas잔량: " + gas + ")");
				gas -= 1;
			} else {
				System.out.println("멈춥니다.(gas잔량: " + gas + ")");
				return; //메소드  실행 종료
			}	
		}
	}
}
package a220706;

public class CarEx {
	public static void main(String[] args) {
		Car car = new Car();
		
		car.setGas(5);
		
		boolean gasState = car.isLeftgas();
		if(gasState) {
			System.out.println("출발합니다");
			car.run();
		}
		
		if(car.isLeftgas()) {
			System.out.println("gas주입 필요 없음");
		} else {
			System.out.println("gas주입 필요");
		}
	}
}

 

 

 

 

메소드 오버로딩(overloading)

- 사전적의미로는 많이 싣는  것을 뜻하며, 하나의 메소드 이름으로 여러 기능을 담아 붙여짐

- 매개변수의 타입, 개수, 순서중 하나가 달라야한다

가장 대표적인 예는 println()메소드. 

호출할 때 주어진 매개값의 타입에 따라 오버로딩된 println()메소드들 중 하나를 호출한다.

 

 

 

 

예제

package a220706;

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

public class SquareEx {
	public static void main(String[] args) {
		Square square = new Square();
		
		double result = square.areaRectangle(10);
		double result2 = square.areaRectangle(10, 20);
				
		System.out.println("정사각형 넓이 = " + result);
		System.out.println("직사각형 넓이 = " + result2);
	}
}

 

 

 

 

 

정리

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

void: 리턴값이 없는 메소드는 리턴타입으로 void를 기술

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

리턴문: 메소드 선언부에 리턴 타입이 있을시 리턴값 지정을 위해 return문 필수. void라면 필요없으나 메소드 실행  종료를 위해 사용할 수도 있음

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

오버로딩: 클래스 내 같은 이름의 메소드를 여러개 선언하는 것. 매개변수타입, 개수, 순서 중 하나가 달라야 함

 

 

 

 

 

 

 

 

반응형

'개발 > JAVA' 카테고리의 다른 글

[Java] Getter & Setter  (0) 2022.07.08
[Java] 인스턴스 멤버와 정적 멤버  (0) 2022.07.07
[Java] 생성자(constructor)  (0) 2022.07.05
[Java] 필드(field)  (0) 2022.07.04
[Java] 객체 지향 프로그래밍 (OOP)  (0) 2022.07.01
복사했습니다!