본문 바로가기
Back-End/Java

[Java] 메소드(method)_메소드의 구조, call by value와 call by reference의 차이

by 찐코딩 2021. 8. 16.

메소드(method)

쉽게 말해 입력에 따른 결과를 반환하는 것

 

 1. c언어에서의 함수(function)와 같음
 2. 기능을 정의하는 단위(예. 덧셈 기능, 뺄셈 기능 등등)
 3. 하나의 기능만을 정의하는 것이 좋음
 4. 자주 반복되는 내용을 정의해 놓고, 필요할 때 호출하여 사용함

 

형식)

 [접근 제한] 반한형(=리턴 타입) 메서드 이름(매개변수 혹은 인자) {
  	메서드 호출 시 실행될 문장;
    return; 		// 리턴 타입이 void일 경우 return 없음
  }

 

그럼 하나하나 뜯어보자 !

 

 접근 제한

https://jinnnkcoding.tistory.com/32

 

[Java] 접근지정자(접근제어자) 권한

접근지정자(접근제어자)권한 - 접근지정자는 클래스, 멤버변수, 멤버메서드 앞에 사용됨. - 외부로부터 접근을 제어한다는 의미를 가지고 있음. - 접근 지정자가 사용될 수 있는 곳 : 클래스, 멤

jinnnkcoding.tistory.com

접근제어자만 따로 포스팅을 해두었다!

 

public > protected > defaulf > private (클래스, 메서드, 변수 앞에 사용됨)


- public : 누구나 다, 아무나 접근 가능 (*보통 이걸 제일 많이 씀!)
- protected : 같은 패키지에서 접근 가능 
                 다른 패키지는 상속 관계만 접근 가능
- default : 같은 패키지에서만 접근 가능
               상속관계라도 접근 안됨
 - private : 외부에서 접근 불가

 

 

 반환형(=리턴 타입)

https://jinnnkcoding.tistory.com/37

 

[Java] 메소드 호출 시 반환형

따로 짚고 넘어가지 않아서 따로 포스팅.. package Method; //메서드 호출 시 반환형 public class Ex07 { //반환되는 값이 일반 숫자가 반환이 되는 경우 public static int method1() { return 55; // 만약 int..

jinnnkcoding.tistory.com

- 자료형 혹은 void로 작성

- 메서드를 실행하고 특정 타입의 결과를 반환해 주겠다고 선언한 것

- 메서드에서 실행된 결과 값을 돌려주는 자료형으로, 생략이 불가능함

- 해당 메서드가 어떤 동작이나 기능을 실행한 후 결과를 알려주는 자료형

- 메서드를 호출한 곳으로 결과를 되돌려줄 때 사용하는 자료형

- 만약 결과를 되돌려줄 필요가 없는 경우에는 void 라는 키워드를 작성함

- 반황형이 void인 경우를 제외하고 결과를 되돌려 주어야 할 때는 메서드 명령문 맨 마지막에 return이라는 키워드를 작성 후, 앞에서 선언한 반환형과 같은 자료형으로 결과를 되돌려준다. 

 

※ 반환타입이 void인 경우, return문 없이도 아무런 문제가 없었던 이유는 컴파일러가 메서드 마지막에 return; 을 자동적으로 추가해주었기 때문이다.

 

 

메서드 이름

식별자, 소문자로 시작, 두 개의 단어가 결합된 경우에는 두번째 글자의 첫 글자는 대문자로 작성하는 것이 관례

매개 변수

- 외부에서 값을 넘겨 받는 변수, 생략 가능
- 메서드 호출 시 전달되는 값의 저장을 위한 용도로 사용이 됨
- 메서드 호출 시 전달되는 값의 자료형과 매개변수의 자료형은 반드시 일치해야 함

메서드 실행문

해당 메서드가 호출된 경우에만 실행이 됨

 


그럼, main 메소드는 뭘까?

 

main 메소드

프로그램의 시작점 역할을 하는 JAVA의 약속된 내용이다.

즉, main 메소드가 없는 프로그램은 별도로 동작할 수가 없다.

컴퓨터가 소스 코드를 읽을 때 main 메소드를 실행하고 거기에 정의된 로직에 따라 프로그램이 동작하게 된다.

 

메서드 호출 방식

 1. call by value(값에 의한 호출)

- 값을 전달하여 호출하는 방식
- 매개변수가 기본자료형(int, double) 사용 

- 장점 : 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존이 된다

- 단점 : 복사를 하기 때문에 메모리가 사용량이 늘어난다.

 

예문을 통해 알아보자.

package Method;

public class Ex05 {
	
	public static void call(int num) {
		num=100;
	}

	public static void main(String[] args) {
    
    	// call by value 방식
        
		int num=200;
		System.out.println("메소드 호출 전....");
		System.out.println("num >>> " + num);
		
		call(num);
		
		System.out.println("call() 메소드 호출 후....");
		System.out.println("num >>> " + num);
	}
}

메인 메소드에서 call()메소드를 호출하여 num값을 넘겼으니

당연히 num값이 200에서 100으로 되어야 하는거 아니야? 싶었지만

결과는~

메소드 호출 전....
num >>> 200
call() 메소드 호출 후....
num >>> 200

메소드 호출 후에도 메인 메소드에 있는 num 인자의 값은 변하지 않는다는 걸 볼 수 있다.

 

 2. call by reference(참조에 의한 호출)

- 주소값을 전달하여 호출하는 방식
- 매개변수가 참조자료형(배열, 클래스명) 사용

- 장점 : 복사하지 않고 직접 참조를 하기에 빠르다.

- 단점 : 직접 참조를 하기에 원래 값이 영향을 받는다.(리스크)

 

예문

package Method;

public class Ex06 {
	
	public static void change(int[] array) {
		System.out.println("array >>> " + array); // array의 주소값 출력
		array[0]=100;
		array[1]=200;
		array[2]=300;
	}

	public static void main(String[] args) {
		int[] arr=new int[3]; // 배열 설정
		arr[0]=10; arr[1]=20; arr[2]=30;
		
		System.out.println("change() 메소드 호출 전...");
		System.out.println("arr >>> " + arr); // arr의 주소값 출력
		
		for(int i=0; i<arr.length; i++) {
			System.out.printf("arr[%d] >>> %d\n", i, arr[i]);
		}
		
		System.out.println();	
		
		change(arr);
		
		System.out.println("change() 메소드 호출 후...");
		for(int i=0; i<arr.length; i++) {
			System.out.printf("arr[%d] >>> %d\n", i, arr[i]);
		}
	}

}

결과

change() 메소드 호출 전...
arr >>> [I@15db9742
arr[0] >>> 10
arr[1] >>> 20
arr[2] >>> 30

array >>> [I@15db9742
change() 메소드 호출 후...
arr[0] >>> 100
arr[1] >>> 200
arr[2] >>> 300

Call by reference는 메서드 호출 시

사용되는 인자 값의 메모리에 저장되어있는 주소(Address)를 복사하여 보낸다.

 

https://re-build.tistory.com/3

 

[Java] Call by value와 Call by reference

이번에 다룰 주제는 Call by value, Call by reference 입니다. 함수의 호출 방식에는 Call by value와 Call by reference가 있습니다. 말 그대로 '값에 의한 호출'이냐, '참조에 의한 호출'이냐 라고 할 수 있는..

re-build.tistory.com

 

어떤 분이 둘 차이점을 아주 잘 설명해주셨다.

 

 

매개변수가 있는 메소드 정의

 

형식

[접근제한] 반환형 메서드이름 (type 변수1, type 변수2) {
	메서드 호출 시 실행 문장;
}


 * 실인수와 가인수

 실인수 : 매개변수에 전달할 실제 값 ==> 메서드를 호출할 때 사용함.
 가인수 : 매개변수 ==> 메서드에 정의.
 실인수와 가인수는 반드시 type, 순서, 갯수가 일치해야 함(중요한 내용).

 

 

https://jinnnkcoding.tistory.com/23

 

[Java] 메소드 다중정의(method overloading)

메소드 다중정의(method overloading)   - 동일한 클래스에서 동일한 이름의 메소드가 여러 개 정의되는 자바 문법   - 일관된 이름을 정의할 수 있어서 개발자(사용자)에게 코드의 직

jinnnkcoding.tistory.com

메소드 다중정의(overloading)에 대한 부분은 따로 포스팅 했다.

 

 

아래부터는 예제

 

더보기

4칙연산과 나머지를 구하는 계산기 메소드를 각각 생성하고,

키보드로부터 값과 연산자를 입력받아 실행해보자

package Method;

import java.util.Scanner;		// 스캐너 클래스 호출

public class EX04 {
	
    // 덧셈 메소드
	public static void plus(int num1, int num2) {
		System.out.println("덧셈 >>>" + (num1+num2));
	}
    
    // 뺄셈 메소드
	public static void minus(int num1, int num2) {
		System.out.println("뺄셈 >>>" + (num1-num2));
	}
    
    // 곱셈 메소드 
	public static void mul(int num1, int num2) {
		System.out.println("곱셈 >>>" + (num1*num2));
	}
    
    // 나눗셈 메소드
	public static void divide(int num1, int num2) {
		System.out.println("나눗셈 >>>" + (num1/num2));
	}
    
    // 나머지 메소드
	public static void mod(int num1, int num2) {
		System.out.println("나머지>>>" + (num1%num2));
	}
	
	
    
    // 메인 메소드
	public static void main(String[] args) {
    
		// 1. 키보드로부터 두개의 정수를 입력받는다.
		Scanner sc=new Scanner(System.in);
		System.out.print("첫번째 정수 입력 : ");
		int su1=sc.nextInt();
		System.out.print("두번째 정수 입력 : ");
		int su2=sc.nextInt();
		
        // 2. 연산자를 입력받는다.
		System.out.print("연산자(+, -, *, /, % ) 중 하나를 입력하세요 :  ");
		String op=sc.next();
		
		// 3. 연산자 변수에 입력된 연산기호를 가지고 해당 기호에 맞는 메소드를 호출해주자.
		switch(op) {
		case "+" :
			plus(su1, su2);
			break;
		case "-" :
			minus(su1, su2);
			break;
		case "*" :
			mul(su1, su2);
			break;
		case "/" :
			divide(su1, su2);
			break;
		case "%" :
			mod(su1, su2);
			break;
		}
	}
}

실행창

첫번째 정수 입력 : 3
두번째 정수 입력 : 4
연산자(+, -, *, / ) 중 하나를 입력하세요 :  +
덧셈 >>>7

댓글