본문 바로가기
Java/Java

메소드란?, 매개변수가 있는/없는 메소드, 리턴 값이 있는/없는 메소드

by 박채니 2022. 3. 3.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


메소드란?

클래스의 기능에 해당하는 요소

 

메소드의 정의

☞ 자바제어자 리턴타입 메소드명 (입력매개변수) { ~ }

- 리턴타입 : 메소드 종료 이후 변환(반환) 되는 값의 자료형

- 메소드명 : 변수명 선정 규칙과 동일, 관계적으로 소문자 시작

- 입력매개변수 : 메소드를 호출할 때 전달되는 값의 자료형과 전달받은 값을 저장할 지역 변수명 정의

- { ~ } : 메소드가 수행해야할 기능

자바제어자는 추후 다뤄보도록!!

 

메소드를 사용하는 이유?

①  중복 코드 재사용에 용이

②  코드의 모듈화를 통해 코드 가독성 향상

 

매개변수가 없고, 리턴 값도 없는 메소드

public class MethodStudy {
	public static void main(String[] args) {
		MethodStudy study = new MethodStudy();
		
        	//클래스 외부에서 메소드 호출 -> 객체 생성 필요!
		study.test1();
		study.test2();
	}
	
	public void test1() {
		String name = "홍길동";
		int age = 23;
		System.out.println("이름 : " + name + ", 나이 : " + age);
	}
	
	public void test2() {
		String name = "심사임당";
		int age = 25;
		System.out.println("이름 : " + name + ", 나이 : " + age);
	}
}

@콘솔출력값
이름 : 홍길동, 나이 : 23
이름 : 심사임당, 나이 : 25

만약 각자 자기 소개를 출력해주는 메소드들을 만들어봤다고 가정하자.

그렇다면 위 처럼 각 메소드들에 이름, 나이, 출력문이 있을 것입니다. 근데.. 갑자기 자기소개를 영어로 바꿔야한다고 해보자!

그럼 출력문 내에 한글을 영어로 바꾸면 됐었습니다.

 

하지만.. 수정해야할 메소드들이 2개가 아니라 1000개라고 가정해보자...

그렇다면 1000개의 메소드들을 하나하나 다 수정해야할 것입니다......(퇴사각)

 

이런 상황이 벌어지지 않도록 이용하는 것이 메소드 입니다.


매개변수가 있는 메소드

//test1, test2는 매개변수, 리턴값이 없는 메소드
public void test1() {
	String name = "홍길동";
	int age = 23;
	//클래스 내부에 있으므로 객체 생성 X
	print(name, age);
}
	
public void test2() {
	String name = "심사임당";
	int age = 25;
	//클래스 내부에 있으므로 객체 생성 X
	print(name, age);
}
	
//매개변수(Strint name, int age)가 있는 메소드
public void print(String name, int age) {
	System.out.println("이름 : " + name + ", 나이 : " + age);
}

이렇게 중복 되는 코드를 별도 메소드로 정의하고 매개변수로 각 이름, 나이를 받아 출력해주는 메소드를 만들어보았습니다.

이렇게 되면 문장이 영어로 변경되었다고 해도 print메소드 하나만 수정하면 되겠죠?

public void test1() {
	String name = "홍길동";
	int age = 23;
	print(name, age);
}
	
public void test2() {
	String name = "심사임당";
	int age = 25;
	print(name, age);
}
	
public void print(String name, int age) {
	System.out.println("My name : " + name + ", My age : " + age);
}

@콘솔출력값
My name : 홍길동, My age : 23
My name : 심사임당, My age : 25

메소드 선언부 → 매개변수

메소드 호출부 → 매개인자(인수) 라고 부릅니다.

 

* 매개변수 (parameter)

public void print(String name, int age)

public void print(매개변수, 매개변수)

호출 시 전달된 값(매개인자)를 매개변수 공간에 대입합니다.

 

* 매개인자 (argument)

print(name, age)

print(매개인자, 매개인자)

※ 매개인자와 매개변수의 자료형, 개수가 다 올바르게 맞아야 정상 실행되며, 그렇지 않으면 오류 발생!

 

 

리턴 값이 있는 메소드

//test3는 매개변수, 리턴 값이 없는 메소드
public void test3() {
	Scanner sc = new Scanner(System.in);
	
	System.out.print("> 정수 입력 : ");
	int a1 = sc.nextInt();
	System.out.print("> 정수 입력 : ");
	int a2 = sc.nextInt();
	
	System.out.printf("%d와 %d의 합은 %d입니다.\n", a1, a2, a1+a2);
}

@콘솔출력값
> 정수 입력 : 10
> 정수 입력 : 20
10와 20의 합은 30입니다.

정수 2개를 입력 받아 합을 구하는 메소드를 만들어보았습니다만, 정수 100개 입력을 해야하는 상황이라면.. 정수를 입력 받는 메소드를 하나 만들어서 중복을 제거하는 것이 좋을 것 같습니다.

 

이 때! 리턴 값을 받아서 중복을 제거해줄 수 있습니다.

 

public void test3() {
	int a1 = userPrint();
	int a2 = userPrint();
	System.out.printf("%d와 %d의 합은 %d입니다.\n", a1, a2, a1+a2);
}

//리턴 값(int)이 있는 메소드
public int userPrint() {
	Scanner sc = new Scanner(System.in);
	System.out.print("> 정수 입력 : ");
	int a = sc.nextInt();
		
	return a;
}

@콘솔출력값
> 정수 입력 : 10
> 정수 입력 : 20
10와 20의 합은 30입니다.

test3에서 메소드를 call (int a1 = userPrint()) 하였고, userPrint 메소드가 실행될 것입니다.

Scanner를 통하여 사용자의 입력 값을 a에 담아주었고, 그 값을 다시 return 해줍니다.

userPrint 메소드는 int를 리턴해주는 메소드이므로 반드시 int를 리턴해줘야 합니다. (return a;)

그렇다면 a1에는 리턴 받은 a (사용자 입력값) 이 저장될 것이고 그를 출력해주면 위와 동일한 결과를 출력해줍니다.

 

동일한 코드이지만 확실히 간결해지고, 가독성도 좋아졌죠?

 

그렇다면 만약, 정수를 입력할 때마다 "정수1 입력 : ", "정수2 입력 : " ...으로 몇 개의 정수를 입력하였는지 표시해주고 싶다면?

아래와 같이 해결해 줄 수 있을 것 입니다.

 

 

매개변수가 있고, 리턴 값이 있는 메소드

public void test3() {
	int a1 = userPrint(1);	//기본자료형이므로 실제 값이 매개변수로 전달
	int a2 = userPrint(2);
	System.out.printf("%d와 %d의 합은 %d입니다.\n", a1, a2, a1+a2);
}

//매개변수(int count)있는, 리턴 값(int)있는 메소드
public int userPrint(int count) {
	Scanner sc = new Scanner(System.in);
	System.out.printf("> 정수%d 입력 : ", count);
	int a = sc.nextInt();
		
	return a;
}

@콘솔출력값
> 정수1 입력 : 10
> 정수2 입력 : 20
10와 20의 합은 30입니다.

입력한 정수의 수만큼을 매개변수로 받아서 출력해줄 수 있습니다.