본문 바로가기

TIL/Java

[Java] 메소드, 전달인자(argument), 매개변수(parameter), 메소드 리턴(return)

메소드

어떤 특정 작업을 수행하기 위한 명령문의 집합

객체때 더 자세히 배우니 호출 흐름에 대해 이해하는 것이 오늘의 목표

 

App1에서 다뤘던 것과 비슷해보이지만

App2에서는 메소드에서 호출해보는 것

 

전달인자(argument)와 매개변수(parameter)를 이용한 메소드 호출

지금까지 우리가 배워온 변수는 지역변수에 해당한다.

1. 지역변수 2. 매개변수 3. 전역변수(필드) 4. 클래스(static)변수

이렇게 있지만 앞으로 차차 배우게 될 것

 

지역변수는 선언한 메소드 블럭 내부에서만 사용이 가능하다. 이것을 지역변수의 스코프라고 한다.

다른 메소드간 서로 공유해야 하는 값이 존재하는 경우 메소드 호출 시 사용하는 괄호를 이용해서 값을 전달할 수 있다.

이 때 전달하는 값을 전달인자(argumetn)라고 부르고, 메소드 선언부 괄호 안에 전달 받기위해 변수를 매개변수(parameter)라고 부른다.

public static void main(String[] args) {

		App3 app3 = new App3();

		app3.testMethod(20);
		
		int age = 20;
		app3.testMethod(age);
		
		byte byteAge = 10;
		app3.testMethod(byteAge);	
		
		long longAge = 80;
		//app3. testMethod(longAge);
		app3. testMethod((int)longAge);		//강제 형변환을 이용하여 자료형을 맞춘 후 호출할 수 있다.(데이터손실 위험)
		
		//연산결과를 이용해서 값 전달할 수 있다.
		app3.testMethod(age + 3);
		
	}

	public void testMethod(int age) {
		//int age = 10;  	//매개변수에서 선언된 변수명과 같은 지역변수를 선언할 수 없다.
		System.out.println("당신의 나이는 " + age + "세 입니다.");
	}

여러 개의 전달 인자를 이용한 메소드 호출 테스트

매개변수도 일종의 지역변수로 분류된다.
매개변수 역시 final 키워드를 사용할 수 있다.
지역변수에 final 키워드를 붙여 상수를 만드는 것과 동일하다.
final 매개변수는 상수 네이밍 규칙을 선택적으로 따르는 경향이 있다. (써도되고 안써도됨)

public static void main(String[] args) {
		
		 App4 app4 = new App4();
		 app4.testMethod("김모씨", 30, '여');
		 app4.testMethod("이모씨", 35, '남');

		 //메소드 주석도 달아주자. 호출구문에 마우스를 올리면 메소드에 대한 설명을 볼 수 있다.
	}
	/**
	 * <pre>
	 * 이름과 나이와 성별을 전달받아 한 번에 출력해주는 기능을 제공합니다.
	 * @param name 출력할 이름을 전달해주세요.
	 * @param age 출력할 나이를 전달해주세요.
	 * @param gender 출력할 성별을 전달해주세요. 성별은 변경되지 않을 것을 보장합니다.
	 */
     //상단 주석을 달아줌으로 인해 testMethod에 커서를 갖다대면 주석이 뜬다.
     
	public void testMethod(String name, int age, final char gender) {
		
		System.out.println("당신의 이름은 " + name + "이고, 나이는 " + age + "세 이며, 성별은 " + gender + "입니다.");
	}

 

return

return은 현재 메소드를 강제 종료하고 호출한 구문으로 다시 돌아가는 명령어이다.

모든 메소드의 내부에는 return;이 존재함 / 가장 마지막에 작성해야 한다.

-메소드리턴 테스트

	public static void main(String[] args) {
		
		//메소드 리턴 테스트
		System.out.println("main() 메소드 시작함...");
		
		Application5 app5 = new Application5();		//객체생성
		app5.testMethod();

		System.out.println("main() 메소드 종료됨...");
	}
	
	public void testMethod() {
		System.out.println("testMethod() 동작 확인...");

위에서 볼 수 있듯이 void 메소드가 들어가 있기 때문에 return이 없어도 무리없이 호출이 된다.

(void 에서는 알아서 컴파일러가 return을 만들어줌)

 

-메소드리턴값 테스트

복귀할 때 그냥 복귀할 수도 있지만, 값을 가지고 복귀할 수도 있다.
이때 가지고 가는 값을 "리턴값"이라고 한다.

리턴값을 반환받기 위해서는 메소드 선언부에 리턴 타입을 명시해줘야 한다.

	public static void main(String[] args) {
		
		Application6 app6 = new Application6();
		app6.testMethod();
		
		String returnTest = app6.testMethod();
		System.out.println(returnTest);
		
		System.out.println(app6.testMethod());

호출한 후에 app6.testMethod(); 를 입력하면 아무것도 출력이 되지 않는다.

String 변수를 선언해서 출력하는 방법과, 바로 System.out.println을 써서 출력하는 방법 두 가지가 있다.

 

-매개변수와 리턴값으로 간단한 계산기 만들기

	public int plusTwoNumbers(int first, int second) {
		return first + second;
	}
	
	public int minusTwoNumbers(int first, int second) {
		return first - second;
	}
	
	public int multipleTwoNumbers(int first, int second) {
		return first * second;
	}
	
	public int divideTowNumbers(int first, int second) {
		return first / second;
	}

 

먼저 메인메소드 안에서가 아닌, 바깥에서 메소드선언을 먼저 해 준다.

 

	public static void main(String[] args) {
		
		int firstNum = 20;
		int secondNum = 10;
		
		Application7 app7 = new Application7();
		System.out.println("두 수를 더한 결과 : " + app7.plusTwoNumbers(firstNum, secondNum));
		
		System.out.println("두  수를 뺀 결과 : " + app7.minusTwoNumbers(firstNum, secondNum));
		
		System.out.println("두 수를 곱한 결과 : " + app7.multipleTwoNumbers(firstNum, secondNum));
		
		System.out.println("두 수를 나눈 결과 : " + app7.divideTowNumbers(firstNum, secondNum));

이후 메인 메소드에서 바깥에서 적어준 메소드를 호출해서 값을 입력해서 사칙연산 수행

 

static 메소드

메인 메소드에는 public과 void사이에 static이라는 키워드가 있다.

static 메소드를 호출하는 방법이 기존과는 조금 다르다.

클래스명.메소드명();

기존에는

클래스명 클래스이름 = new 클래스명();

클래스이름.메소드명(); 이렇게 해줬다면 중간부분이 생략된 거나 마찬가지다. (나의 생각..)

	public static void main(String[] args) {
		System.out.println("10과 20의 합 : " + Application8.SumTwoNumbers(10, 20));
        
        	System.out.println("20과 30의 합 : " + SumTwoNumbers(20, 30));

	}

	public static int SumTwoNumbers(int first, int second) {
		
		return first + second;
	}

"10과 20의 합" 출력에서 호출을 해줬기 때문에

두 번째 "20과 30의 합"에서는 클래스명은 생략이 가능하다. (같은 클래스 내일 경우!)

 

-다른 클래스에서 작성한 메소드 호출

동일한 패키지에 있는 다른 클래스에서 메소드를 호출하는 방법이다.

public class Calculator {

	public int minNumberOf(int first, int second) {
		return first > second ? second : first;
	}

	public static int maxNumberOf(int first, int second) {
		return first > second ? first : second;
		
	}
	
}

Calculator라는 클래스에서 최소값, 최대값을 구하는 메소드를 선언했다. 

비교연산자를 사용해서 삼항연산자 생성함.

 

메인메소드(출력해야하는 클래스)로 와서 non-static과 static이 있는 메소드 둘다 호출해준다.

	public static void main(String[] args) {
		
		int first = 100;
		int second = 50;
		
		//non-static 호출
		
		Calculator calc = new Calculator();
		int min = calc.minNumberOf(first, second);
		System.out.println("두 수 중 최소값은 : " + min);
		
		//static 호출
		
		int max = Calculator.maxNumberOf(first, second);
		System.out.println("두 수 중 최대값은 : " + max);

	}

위에서 배웠듯이 static은 클래스명.메소드명(); 이렇게 출력가능하다.