Back/JAVA

메소드 - 형식, 기본자료형, 참조자료형, 반환형

시월해 2021. 3. 4. 17:28

메서드(method)?
1. C언어에서의 함수(function)와 같음.
2. 기능을 정의하는 단위(예 : 덧셈 기능 등등)
3. 하나의 기능만을 정의하는 것이 좋음.
4. 자주 반복되는 내용을 정의해 놓고, 필요 시 호출하여 사용함.
    형식) [접근제한] 반환형 메서드이름(매개변수 혹은 인자) {
     메서드 호출 시 실행될 문장;
     }
     
    - 접근제한 : public > protected > default > private
     (클래스, 메서드, 변수 앞에 사용 됨)
     - public : 누군 다, 아무나 접근 가능.
     - protected : 같은 패키지에서 접근 가능.  다른 패키지는 상속 관계는 접근 가능.
     - default : 같은 패키지에서만 접근 가능. 상속 관계라도 접근 안됨.

     - private : 외부에서 접근 불가.


     - 반환형 : - 메서드를 실행하고 특정 타입의 결과를 반환해주겠다고 선언하는 것(리턴타입)
                  - 메서드에서 실행된 결과값을 돌려주는 자료형으로 생략이 불가능함.
                  - 해당 메서드가 어떤 동작이나 기능을 실행한 후 결과를 알려주는 자료형.
                  - 메서드를 호출한 곳으로 결과를 되돌려줄 때 사용하는 자료형.
                  - 만약 결과를 되돌려줄 필요가 없는 경우에는 void라는 키워드를 작성함.
                  - 반환형이 void인 경우를 제외하고 결과를 되돌려주어야 할 때는 메서드 명령문 맨 마지막에 return이라는 키워드를 작성 후, 앞에서 선언한 반환형과 같은 자료형으로 결과를 되돌려준다.
             
   - 메서드 이름 : - 식별자, 소문자로 시작, 두개의 단어가 결합된 경우 두번째 단어의 첫 글자를 대문자로 작성하는 것이 관례임.
                  
   - 매개변수 : - 외부에서 값을 넘겨 받는 변수. 생략 가능.
                   - 메서드 호출 시 전달되는 값의 저장을 위한 용도로 사용이 됨.
                   - 메서드 호출 시 전달되는 값의 자료형과 매개변수의 자료형은 반드시 일치.
                   - 메서드 실행문 : - 해당 메서드가 호출된 경우에만 실행이 됨.
 

* 매개변수가 있는 메서드 정의
형식) [접근제한] 반환형 메서드이름(type 변수1, type 변수2...) {

                           메서드 호출 시 실행 문장;
                      }

* 실인수와 가인수

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

* 메서드 호출 방식 - 2가지
1. call by value
   - 값을 전달하여 호출하는 방식
   - 매개변수가 기본자료형(int, double) 사용.
 2. call by reference
   - 주소값을 전달하여 호출하는 방식.

   - 매개변수가 참조자료형(배열명, 클래스명) 사용.


기본예제) 기본형식

public class Ex01 {
	
	public static void add() {
		System.out.println("add() 메서드 호출~~~~~");
		System.out.println("20 + 10 >>> " + (20 + 10));
	}
	
	public static void input() {
		Scanner sc = new Scanner(System.in);
		int[] arr = new int[3];
		
		for(int i=0; i<arr.length; i++) {
			System.out.print((i+1)+"번째 정수 입력 >>> ");
			arr[i] = sc.nextInt();
		}
		
		for(int i=0; i<arr.length; i++) {
			System.out.println("arr["+i+"] >>> "+arr[i]);
		}
		
		sc.close();
	}

	public static void main(String[] args) {
		
		System.out.println("프로그램 시작");
		
		// 메서드를 호출하자.
		add();
		
		System.out.println("프로그램 종료");

	}

}

결과


예제1) 키보드로부터 정수를 입력받아 해당 정수까지의 합을 구하는 메소드를 작성하여 호출하라.

public class Ex02 {
	
	public static void sum() {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("정수 입력 : ");
		int su = sc.nextInt();
		
		int sum = 0;
		
		for(int i=1; i<=su; i++) {
			sum += i;
		}
		
		System.out.println("1~" + su + "까지의 합 >>> " + sum);
		
		sc.close();
	}

	public static void main(String[] args) {
		System.out.println("프로그램 시작");
		
		// 메서드 호출
		sum();
		
		System.out.println("프로그램 종료");

	}

}

결과


예제2) 시작 정수와 마지막 정수를 키보드로 입력 받아 시작 정수~마지막 정수까지의 합을 구하는 메소드를 작성하여 호출

 

public class Ex03 {

	public static void prn() {
		System.out.println("prn() 메소드가 호출되었습니다.");
	}
	
	public static void total(int num) {
		
		int sum = 0;
		
		for(int i=1; i<=num; i++) {
			sum += i;
		}
		
		System.out.println("1부터" + num + "까지의 합 >>> " + sum);
	}
	
	public static void total(int start, int end) {
		
		int sum = 0;
		
		for(int i=start; i<=end; i++) {
			sum += i;
		}
		
		System.out.println(start +"부터 " + end + "까지의 합 >>> " + sum);
	}
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		System.out.println("프로그램 시작");
		
		// 일반 메소드
		prn();
		System.out.println();
		
		// 매개변수 1개 메소드
		System.out.print("정수 입력 : ");
		total(sc.nextInt());
		
		// 매개변수 2개 메소드
		System.out.print("시작 숫자 입력 : ");
		int start = sc.nextInt();
		
		System.out.print("마지막 숫자 입력 : ");
		int end = sc.nextInt();
		
		total(start, end);
		
		System.out.println("프로그램 종료");

	}

}

결과


예제3) 기본자료형 메소드(call by value)

public class Ex05 {

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

	}

}

call by value기 때문에 메소드 안의 변수는 지역변수로 값이 변경되지 않음.

 


예제4) 참조자료형 메소드(call by reference)

public class Ex06 {
	
	public static void change(int[] array) {
		System.out.println(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);
		
		for(int i=0; i<arr.length; i++) {
			System.out.println("arr["+i+"] >>> " + arr[i]);
		}
		
		System.out.println();
		
		change(arr);
		
		System.out.println("change() 메서드 호출 후.....");
		
		for(int i=0; i<arr.length; i++) {
			System.out.println("arr["+i+"] >>> " + arr[i]);
		}

	}

}

배열은 주소값을 직접 전달하기 때문에 메소드 안에서 값을 변경해도 main 메소드 안의 배열에 적용 된다.


예제5) 매개변수와 리턴타입이 존재하는 메소드(반환형)

public class Ex07 {

	// 숫자가 반환되는 경우
	public static int method1() {
		
		return 155;
	}
	
	// 변수가 반환되는 경우
	public static int method2(int su1, int su2) {
		
		int sum = (su1 * 2) + (su2 * 2);
		
		return sum;
	}
	
	public static int method3(int a1, int a2) {
		
		return a1 + a2;
	}
	
	public static String method4() {
		
		return "홍길동";
	}
	
	public static String method5(String str1, String str2) {
		String result = str1 + str2;
		return result;
	}
	
	public static String method6(String s1, String s2) {

		return s1 + s2;
	}

	public static void main(String[] args) {
		
		System.out.println("프로그램 시작");
		
		//int num = method1();
		
		System.out.println("method1() 메서드 호출 후 반환된 값 : " + method1());
		
		System.out.println("method2() 메서드 호출 후 반환된 값 : " + method2(145,200));
		
		System.out.println("method3() 메서드 호출 후 반환된 값 : " + method3(132,55));
		
		System.out.println("method4() 메서드 호출 후 반환된 값 : " + method4());
		
		System.out.println("method5() 메서드 호출 후 반환된 값 : " + method5("대한","민국"));
		
		System.out.println("method6() 메서드 호출 후 반환된 값 : " + method6("유","관순"));
		
		System.out.println("프로그램 종료");

	}

}

메소드에서는 다양한 방법으로 값들을 리턴 시킬 수 있다.