[Java] 메소드(method)

수박이삼촌·2024년 1월 26일
0

Java

목록 보기
16/21
post-thumbnail

메소드(Method)

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

메소드의 사용 목적

  1. 중복되는 코드를 메소드로 만들어 코드의 반복 사용을 피할 수 있다.
  2. 코드의 가독성이 좋아진다.
  3. 기능의 변경이 필요한 경우 메소드 부분만 수정하면 되기 때문에, 손쉬운 유지보수가 가능하다.

메소드의 선언

접근제어자 반환타입 메소드이름 (매개변수 목록) {
// 실행할 코드
// 반환타입이 있을경우 반환타입에 맞게 return 작성
// 반환타입이 void인 경우 생략
return ...;
}
  1. 접근 제어자 : 메소드에 접근할 수 있는 범위

    A. public : 어디서나 접근 가능
    B. protected : 상속관계이거나 같은 패키지에서 접근 가능
    C. default(생략가능) : 같은 패키지에서 접근 가능
    D. private : 같은 클래스 내부에서만 접근 가능

  2. 반환 타입(return type) : 메소드가 모든 작업을 마치고 반환하는 데이터의 타입

    A. void : 리턴값 없음

    B. 기본 변수 자료형 : int, float, 등등

    C. 오브젝트형 : String, 이외 사용자 정의타입

  3. 메소드 이름 : 메소드를 호출하기 위한 이름

  4. 매개변수 목록(parameters) : 메소드 호출 시에 전달되는 인수의 값을 저장할 변수들

  5. 실행할 코드 : 메소드의 기능을 수행하는 코드

메소드 호출

package com.ohgiraffers.section01.method;

public class Application1 {

	public static void main(String[] args) {

		/* 수업목표. 메소드의 호출 흐름에 대해 이해할 수 있다. */
		/* 필기.
		 *  메소드란?
		 *  메소드(method)는 어떤 특정 작업을 수행하기 위한 명령문의 집합이라고 할 수 있다.
		 * */

		/* 설명.
		 *  자세한 메소드 사용법은 객체 부분에서 다루게 되니 지금은 호출 흐름에 대해 이해할 수 있도록 하자.
		 * */

		System.out.println("main() 시작됨...");


	    /* 목차. 1. main method 밖에 하단에 methodA라는 메소드를 추가한다.
		 * */
		
		/* 목차. 2. 작성한 메소드를 호출하는 부분을 작성한다. /*
		 * 필기.
		 *  메소드 호출 방법
		 *  클래스명 사용할이름 = new 클래스명();				//객체 생성
		 *  사용할이름.메소드명();								//메소드 호출
		 * */
		Application1 app1 = new Application1();
		app1.methodA();

		System.out.println("main() 종료됨...");
	}

	/* 목차. 1-1. methodA 작성 */
	public void methodA() {

		System.out.println("methodA() 호출함...");

		/* 목차. 1-2. methodB 호출 */
		methodB();			//메소드 호출 방식이 약간 다르다.	 우선 흐름에 집중하고 뒤에서 다시 다룰 부분이다.

		System.out.println("methodA() 종료됨...");
	}

	/* 목차. 1-3. methodB 작성 */
	public void methodB() {

		System.out.println("methodB() 호출함...");

		/* 목차. 1-4. methodC 호출 */
		methodC();

		System.out.println("methodB() 종료됨...");
	}

	/* 목차. 1-5. methodC 작성 */
	public void methodC() {

		System.out.println("methodC() 호출함...");

		System.out.println("methodC() 종료됨...");
	}
}
결과
main() 시작됨...
methodA() 호출함...
methodB() 호출함...
methodC() 호출함...
methodC() 종료됨...
methodB() 종료됨...
methodA() 종료됨...
main() 종료됨...

메소드 호출 흐름

package com.ohgiraffers.section01.method;

public class Application2 {

	public static void main(String[] args) {

		/* 수업목표. 다른 흐름의 메소드 호출 흐름에 대해 이해할 수 있다. */
		
		/* 목차. 1. methodA(), methodB(), methodC()를 차례대로 작성한다.*/
		/* 목차. 2. 작성 후 메소드 호출 확인과 실행 종료 출력 구문을 작성하고 다시 현재 위치로 되돌아온다. */
		/* 목차. 3. 메인메소드 시작을 확인하기 위한 출력 구문을 작성한다.*/
		System.out.println("main() 시작함...");
		
		/* 목차. 4. methodA(), methodB(), methodC()를 차례대로 호출한다. */
		Application2 app2 = new Application2();
		app2.methodA();
		app2.methodB();
		app2.methodC();
		
		/* 목차. 5. 메인메소드 종료를 확인하는 출력 구문을 작성한다. */
		System.out.println("main() 종료됨...");
		
		/* 목차. 6. main()을 실행하여 전체적인 소스코드의 흐름을 파악한다. */
	}
	
	public void methodA() {
		System.out.println("methodA() 호출됨...");
		
		System.out.println("methodA() 종료됨...");
	}
	
	public void methodB() {
		System.out.println("methodB() 호출됨...");
		
		System.out.println("methodB() 종료됨...");
	}
	
	public void methodC() {
		System.out.println("methodC() 호출됨...");
		
		System.out.println("methodC() 종료됨...");
	}
}

아래 그림은 해당 코드가 실행되는 동안 stack 메모리 영역에서 일어나는 일(메소드가 실행되기 위한 공간을 할당해주는 것이라고 생각하면 편하다)이다. 메소드가 호출되면 stack 영역에 메소드를 위한 영역이 할당되고, 호출된 메소드들이 실행이 완료되면 stack 영역에 할당된 메모리 공간은 사라진다. 메소드가 완료된 이후에는 호출했던 위치로 다시 돌아가서 그 이후 작업을 실행하는데, methodA() → methodB() → methodC() 와 같이 호출되었기 때문에 메소드가 끝날 때는 methodC() → methodB() → methodA() 와 같이 돌아가게 된다

image
package com.ohgiraffers.section01.method;

public class Application4 {

	public static void main(String[] args) {
		
		/* 수업목표. 여러 개의 전달 인자를 이용한 메소드 호출을 할 수 있다. */
		/* 필기. 여러 개의 전달인자를 이용한 메소드 호출 테스트 */

		/* 목차. 1. 여러 개의 매개변수를 가진 메소드 호출 */
		Application4 app4 = new Application4();
		app4.testMethod("홍길동", 20, '남');
		//app4.testMethod(20, "유관순", '여');					//값의 갯수는 맞지만 순서가 다르게 전달되면 호출하지 못한다.
		
		/* 목차. 2. 변수에 저장된 값을 전달하며 호출할 수 있다. */
		String name = "유관순";
		int age = 20;
		char gender = '여';
		
		app4.testMethod(name, age, gender);
	}

	public void testMethod(String name, int age, final char gender) {
		
		/* 필기.
		 *  매개변수도 일종의 지역변수로 분류된다.
		 *  매개변수 역시 final 키워드를 사용할 수 있다.
		 *  지역변수에 final 키워드를 붙여 상수를 만드는 것과 동일하다.
		 *  final 매개변수는 상수 네이밍 규칙을 선택적으로 따르는 경향이 있다.
		 * */
		
		System.out.println("당신의 이름은 " + name + "이고, 나이는 " + age + "세 이며, 성별은 " + gender + "입니다.");
	}
}

메소드 리턴

sample#1

package com.ohgiraffers.section01.method;

public class Application5 {

	public static void main(String[] args) {

		/* 수업목표. 메소드 리턴에 대해 이해할 수 있다. */
		/* 필기.
		 *  return 이란?
		 *  모든 메소드 내부에는 return; 이 존재한다.
		 *  void 메소드의 경우 return;을 명시적으로 작성하지 않아도 마지막줄에 컴파일러가 자동으로 추가를 해준다.
		 *  return은 현재 메소드를 강제 종료하고 호출한 구문으로 다시 돌아가는 명령어이다.
		 * */

		System.out.println("main() 메소드 시작함...");
		
		/* 목차. 1. 메소드 리턴 테스트 */
		/* 설명.
		 *  testMethod1()을 작성하고 호출해서 테스트 해보면 정상 동작 하는것을 볼 수 있다.
		 *  testMethod1() 하단에 return; 구문을 추가해보자!!
		 *  추가하고 실행해도 동일한 결과가 출력될 것이다.
		 * */
		Application5 app5 = new Application5();
		app5.testMethod();

		System.out.println("main() 메소드 종료됨...");
	}
	
	public void testMethod() {
		System.out.println("testMethod() 동작 확인...");
		
		/* 필기.
		 *  컴파일러에 의해 자동으로 추가되는 구문이다.
		 *  가장 마지막에 작성해야 하고, 마지막에 작성되지 않을 경우 컴파일 에러를 발생시킨다.
		 * */
//		return;
		
//		System.out.println("test");			//에러 발생, return은 메소드 가장 마지막에 작성해야 한다.
	}
}

sample#2

package com.ohgiraffers.section01.method;

public class Application6 {

	public static void main(String[] args) {

		/* 수업목표. 메소드 리턴값을 이해하고 활용할 수 있다. */
		/* 필기.
		 *  메소드 리턴값 테스트
		 *  메소드는 항상 마지막에 return명령어가 존재한다.
		 *  return은 자신을 호출한 구문으로 복귀하는 것을 의미한다.
		 *  복귀를 할 때 그냥 복귀를 할 수도 있지만, 값을 가지고 복귀할 수 도 있다.
		 *  이 때 가지고 가는 값을 리턴값 이라고 한다.
		 *
		 * 필기.
		 *  return값을 반환받기 위해서는 메소드 선언부에 리턴 타입을 명시해 주어야 한다.
		 *  void는 아무 반환값도 가지지 않겠다는 리턴타입에 사용할 수 있는 키워드이다.
		 *  반환값이 없는 경우 return 구문은 생략해도 컴파일러가 자동으로 추가해주지만,
		 *  반환값이 있는 경우는 return 구문을 반드시 명시적으로 작성해야 한다.
		 *  또한 메소드 선언부에 선언한 리턴타입 반환값의 자료형은 반드시 일치해야 한다.
		 * */
		
		System.out.println("main() 메소드 시작함...");
		
		/* 목차. 1. 메소드 리턴값 확인 */
		/* 설명.
		 *  메소드 작성 후 호출을 해보면 아무련 변화가 없다.
		 *  하지만 호출은 한 것이다.
		 *  아무런 내용이 출력되지 않은것은 당연하다. 출력하는 명령어가 존재하지 않는다.
		 * */
		Application6 app6 = new Application6();
		app6.testMethod();
		
		/* 설명.
		 *  호출한 메소드는 hello world라는 문자열을 반환하도록 해 놓았다.
		 *  호출한 메소드가 종료되면서 호출 구문 자체가 반환값이 된다.
		 * */
		
		String returnText = app6.testMethod();
		System.out.println(returnText);			//hello world 출력됨
		
		/* 설명. 변수에 저장하지 않고 바로 출력도 가능하다. */
		System.out.println(app6.testMethod());
		
		System.out.println("main() 메소드 종료됨...");
	}

	public String testMethod() {
		
		/* 필기.
		 *  public 뒤에 바로 return으로 가지고 갈 타입을 명시한다.
		 *  아무 값도 리턴하지 않는 경우 void, 값을 반환하는 경우에는 반환값의 자료형을 작성해야 한다.
		 * */
		
		return "hello world";
	}
}

sample#3

package com.ohgiraffers.section01.method;

public class Application7 {

	public static void main(String[] args) {

		/* 수업목표. 매개변수와 리턴값을 복합적으로 활용하는 것을 이해하고 활용할 수 있다. */
		/* 필기.
		 *  매개변수와 리턴값 복합 활용
		 *  매개변수도 존재하고 리턴값도 존재하는 메소드를 이용하여 간단한 계산기 만들기
		 * */

		int first = 20;
		int second = 10;
		
		Application7 app7 = new Application7();
		System.out.println("두 수를 더한 결과 : " + app7.plusTwoNumbers(first, second));
		System.out.println("두 수를 뺀 결과 : " + app7.minusTwoNumbers(first, second));
		System.out.println("두 수를 곱한 결과 : " + app7.multipleTwoNumbers(first, second));
		System.out.println("두 수를 나눈 결과 : " + app7.divideTwoNumbers(first, second));
		
	}

	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 divideTwoNumbers(int first, int second) {
		
		return first / second;
	}
}

메소드 활용

static method

package com.ohgiraffers.section01.method;

public class Application8 {

	public static void main(String[] args) {

		/* 수업목표. static 메소드를 호출할 수 있다. */
		/* 필기. static 메소드 호출 */
		/* 설명.
		 *  우리가 지금 작성하고 있는 메소드를 보면 public과 void 사이에 static이라고 하는 키워드가 있다.
		 *  static 키워드에 대해서는 뒤에서 다시 다루게 될 예정이지만,
		 *  static 메소드를 호출하는 방법부터 먼저 학습해보자.
		 *  static이 있는 메소드이건 non-static 메소드이건 메소드의 동작 흐름은 동일하다.
		 * */
		
		/* 필기.
		 *  static 메소드를 호출하는 방법
		 *  클래스명.메소드명();  <- 이런 방식으로 호출한다.
		 * */
		System.out.println("10과 20의 합 : " + Application8.sumTwoNumbers(10, 20));
		
		/* 필기. 동일한 클래스 내에 작성된 static 메소드는 클래스명 생략이 가능하다. */
		System.out.println("20과 30의 합 : " + sumTwoNumbers(20, 30));
	}

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

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

Calculator
package com.ohgiraffers.section01.method;

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;
	}
}
Application
package com.ohgiraffers.section01.method;

public class Application9 {

	public static void main(String[] args) {

		/* 수업목표. 다른 클래스에 작성한 메소드를 호출할 수 있다. */
		/* 필기. 다른 클래스에 작성한 메소드 호출 */
		/* 설명.
		 *  동일한 패키지에 Calculator라는 클래스를 하나 추가하고 메소드를 작성해서 테스트 해 보자
		 *  먼저 Calculator.java를 생성하고 메소드를 작성하고 다시 돌아오자!!
		 *  두 값이 동일한 경우는 존재하지 않는다고 가정한다.
		 * */
		
		/* 필기. 최대값 최솟값을 비교할 두 정수를 변수로 선언 */
		int first = 100;
		int second = 50;
		
		/* 목차. 1. non-static 메소드의 경우 */
		/* 필기.
		 *  클래스가 다르더라도 사용하는 방법은 동일하다
		 *  클래스명 사용할이름 = new 클래스명();
		 *  사용할이름.메소드명();
		 * */
		Calculator calc = new Calculator();
		int min = calc.minNumberOf(first, second);
		
		System.out.println("두 수 중 최소값은 : " + min);
		
		/* 목차. 2. static 메소드인 경우 */
		/* 필기.
		 *  다른 클래스에 작성한 static 메소드의 경우 호출할 때 클래스명을 반드시 기술해야 한다.
		 *  클래스명.메소드명();
		 * */
		//int max = maxNumberOf(first, second);				//클래스명을 생략하면 에러 발생한다.
		int max = Calculator.maxNumberOf(first, second);
		
		System.out.println("두 수 중 최대값은 : " + max);
		
		/* 주의사항.
		 *  static 메소드도 non-static 메소드처럼 호출은 가능하다.
		 *  하지만 권장하지 않는다.
		 *  이미 메모리에 로딩되어 있는 static 메소드는 여러 객체가 공유하게 된다.
		 *  그 때 객체로 접근하게 되면 인스턴스가 가진 값으로 공유된 값에 예상치 못하는 동작을 유발할 수 있기 때문에
		 *  사용을 제한해 달라는 경고이다. 시스템이 복잡해질 수록 객체의 상태를 추적하기 어려워 유지보수에 악영향을 준다.
		 * */
		int max2 = calc.maxNumberOf(first, second);			//static 메소드는 static에 접근하는 방법을 사용하라고 경고가 나온다.
		
		System.out.println("두 수 중 더 큰 값은 : " + max2);		//하지만 정상적으로 실행은 가능하다.
	}
}
profile
Today I Learned

0개의 댓글