본문 바로가기
프로그래밍언어/Java

06-4 메소드

by 스꼬맹이브로 2021. 2. 15.
728x90
반응형
SMALL

<메소드 선언>

메소드 선언은 선언부와 실행 블록으로 구성되며, 선언부를 메소드 시그니처(signature)라고 한다.

▶리턴 타입

리턴타입 : 리턴 값의 타입을 말하며, 리턴 값이란 메소드를 실행한 후의 결과값을 말함.

메소드는 리턴값이 있을 수도 있고 없을 수도 있으나 리턴 값이 있을 경우 리턴 타입이 선언부에 명시되어야 함.

 

▶메소드 이름

메소드 이름은 자바 식별자 규칙에 맞게 작성하면 되는데, 다음 사항에 주의해야 함.

  • 숫자로 시작하면 안 되고, $와 _를 제외한 특수 문자를 사용하지 말아야 한다.
  • 관례적으로 메소드 이름은 소문자로 작성한다.
  • 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫 글자는 대문자로 작성한다.
//메소드이름예제
void run() { ... }
void startEngine() { ... }
String getName() { ... }
int[] getScores() { ... }

▶매개 변수 선언

매개 변수는 메소드가 실행할 대 필요한 데이터를 외부로부터 받기 위해 사용함

그렇기 때문에 메소드에서 매개 변수가 필요한 경우가 있고 필요 없는 경우가 있음

 

//예제 : 계산기

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("전원을 끕니다");
	}
}


위의 예제에서 powerOn()메소드와 powerOff()메소드는 매개변수가 필요하지 않으므로 지정해주지 않았다.

plus()메소드와 divide()메소드는 계산해야하는 값 2개가 필요하므로 매개 변수를 2개를 받아서 계산하는 모습을 확인할 수 있다.

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

외부 클래스에서 Calculator 클래스의 메소드를 호출하기 위해서는 Calculator 객체를 생성하고 참조 변수인 myCalc를 이용해야 한다. myCalc 변수에 도트연산자와 함께 메소드 이름(매개값,...)을 호출하면 메소드 블록이 실행된다.


결과:

 

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

해결책 : 매개 변수를 배열 타입으로 선언

//ex: 여러 개의 수를 모두 합산하는 메소드를 선언할 경우
//방법 1
int sum1(int[] values) { }
//방법 2
int sum2(int ... values) { }

...로 선언하게 되면 메소드 호출 시 넘겨준 값의 수에 따라 자돈으로 배열이 생성되고 매개값으로 사용된다.

 

//예제: 매개 변수의 개수를 모를 경우

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

결과 :

sum1()과 sum2() 메소드의 실행문의 결과가 완전 일치하는 것을 볼 수 있다. 이는 매개 변수의 선언 방법만 다를 뿐 매개 변수의 타입이 같은 배열이므로 처리 내용이 같을 수밖에 없음을 보여준다.

 

<리턴(return)문>

▶리턴값이 있는 메소드

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

만약 return문이 없다면 컴파일 에러가 발생하고, return문이 실행되면 메소드는 즉시 종료된다.

//return문
return 리턴값;

return문의 리턴값은 리턴 타입이거나 리턴 타입으로 변환될 수 있어야 함.

ex) int일 경우 : byte, short, int

//예제:int형
int plus(int x, int y){
	int result = x + y;
    return result;
}

//byte형도 가능
int plus(int x, int y){
	byte result =(byte) (x + y);
    return result;
}

 

▶리턴값이 없는 메소드:void

리턴값이 없는 메소드는 리턴 타입으로 void를 사용하지만 return문을 사용할 수 있음(메소드 강제 종료 시키는 역할)

//void return문
return;

 

<메소드 호출>

메소드는 클래스 내부 또는 외부의 호출에 의해 실행

내부 : 단순한 메소드 이름으로 호출

외부 : 클래스로부터 객체를 생성한 뒤 참조 변수를 이용해서 메소드를 호출

 

▶객체 내부에서 호출

//클래스 내부에서 메소드 호출 방법
//매개 변수의 타입과 수에 맞게 매개값 제공
메소드(매개값, ...);
//ex:: mothod2()에서 mothod1()호출

public class ClassName{
	void method1(String p1, int p2){
    //p1에 홍길동 대입, p2에 100 대입
    //대입된 p1과 p2를 활용
    }
    
    void method2(){
    	method1("홍길동",100);
    }
}

메소드가 리턴값이 없거나, 있어도 받고 싶지 않을 경우 모두 호출이 가능함.

리턴값이 있는 메소드를 호출하고 리턴값을 받고 싶다면 변수를 선언하고 리턴값을 대입

타입 변수 = 메소드(매개값, ...);
//method2()에서 method1()을 호출하여 결과값 저장
public class ClassName{
	int method1(int x, int y){
    	int result = x + y;
        return result;
    }
    
    void method2(){
    	int result1 = mothod(10,20); // 30저장
        double result2 = method1(10,20); // 30.0저장
    }
}

 

▶객체 외부에서 호출

외부 클래스에서 메소드를 호출하려면 클래스로부터 객체를 생성해야 함

(메소드는 객체에 소속된 멤버이므로 객체가 존재하지 않으면 메소드도 존재하지 않기 때문!)

//객체 생성 방법
클래스 참조변수 = new 클래스(매개값, ...);

객체 생성이 완료되었다면 참조 변수와 함께 도트연산자를 사용해서 메소드를 호출할 수 있음

참조변수.메소드(매개값, ...); //리턴값이 없거나, 있어도 리턴값을 받지 않을 경우
타입 변수 = 참조변수.메소드(매개값, ...); //리턴값이 있고, 리턴값을 받고 싶을 경우
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)");
		}
	}	
}
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");
	}
}

 

결과 :

keyTurnOn()과 run() 메소드는 리턴값이 없기 때문에 단순 호출만 했고, getSpeed()메소드는 리턴값이 있으므로 리턴값을 받아 변수 speed에 저장하여 사용함

 

<메소드 오버로딩>

메소드 오버로딩(overloading) : 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것

오버로딩의 사전적 의미는 많이 싣는 것을 의미하며, 이를 통해 하나의 메소드 이름으로 여러 기능을 담는다 하여 붙여진 이름이라는 것을 추측할 수 있다.

메소드 오버로딩의 조건은 매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다는 점이다.

메소드 오버로딩이 필요한 이유 : 매개값을 다양하게 받아 처리할 수 있도록 하기 위해서 

 

메소드 오버로딩의 가장 대표적인 예는 System.out.println()메소드이다.

만약, println() 메소드가 하나의 타입만 출력할 수 있도록 되어있다면?

상상할 수 없을 것이다....

 

그래서 println()메소드는 호출할 때 주어진 매개값의 타입에 따라서 다음과 같이 오버로딩된 println() 메소드 중 하나를 호출한다.

void println() {...}
void println(boolean x) {...}
void println(char x) {...}
void println(char[] x) {...}
void println(double x) {...}
void println(float x) {...}
void println(int x) {...}
void println(long x) {...}
void println(Object x) {...}
void println(String x) {...}

 

//사각형 넓이를 구하는 메소드 오버로딩 예제

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

 

매개값이 1개이면 정사각형의 넓이를 계산하고, 매개값이 2개이면 직사각형의 넓이를 계산하여 리턴한다.

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

결과 :

 

728x90
반응형
LIST

'프로그래밍언어 > Java' 카테고리의 다른 글

06-6 패키지와 접근 제한자  (0) 2021.02.23
06-5 인스턴스 멤버와 정적 멤버  (0) 2021.02.17
06-3. 생성자  (0) 2021.02.08
06-2. 필드  (0) 2021.01.26
06-1. 객체 지향 프로그래밍  (1) 2021.01.25