메서드

2025. 9. 16. 21:30카테고리 없음

반응형

값만 다른 같은 구조의 코드를 여러번 사용해야 된다면 매세드를 사용하여 리팩토링해보자.

자바에서는 함수를 메서드(Method)라고 한다.

 

메서드 정의

public static int add(int a, int b) {
	System.out.println(a + "+" + b + " 연산 수행");
	int sum = a + b;
	return sum;
}

 

  • 메서드의 선언 부분으로, 메서드 이름, 반환 타입, 매개변수(파라미터) 목록을 포함한다.
  • public static
    • `public` : 다른 클래스에서 호출할 수 있는 메서드라는 뜻이다. 접근 제어에서 학습한다.
    • `static` : 객체를 생성하지 않고 호출할 수 있는 정적 메서드라는 뜻이다. 자세한 내용은 뒤에서 다룬다.
    • 두 키워드의 자세한 내용은 뒤에서 다룬다. 지금은 단순하게 메서드를 만들 때 둘을 사용해야 한다고 생각하
      자.
  • int add(int a, int b)
    • `int` : 반환 타입을 정의한다. 메서드의 실행 결과를 반환할 때 사용할 반환 타입을 지정한다.
    • `add` : 메서드에 이름을 부여한다. 이 이름으로 메서드를 호출할 수 있다.
    • `(int a, int b)` : 메서드를 호출할 때 전달하는 입력 값을 정의한다. 이 변수들은 해당 메서드 안에서만
      사용된다. 
    • 이렇게 메서드 선언에 사용되는 변수를 영어로 파라미터(parameter), 한글로 매개변수라 한다.

매개변수가 없거나 반환 타입이 없는 경우

  • 매개변수가 없는 경우
    • 선언: `public static void printHeader()` 와 같이 매개변수를 비워두고 정의하면 된다.
    • 호출: `printHeader();` 와 같이 인수를 비워두고 호출하면 된다.
  • 반환 타입이 없는 경우
    • 선언: `public static void printHeader()` 와 같이 반환 타입을 `void` 로 정의하면 된다.
    • 호출: `printHeader();` 와 같이 반환 타입이 없으므로 메서드만 호출하고 반환 값을 받지 않으면 된다.
    • `String str = printHeader();` 반환 타입이 `void` 이기 때문에 이렇게 반환 값을 받으면 컴
      파일 오류가 발생한다.
  • void와 return 생략
    • 모든 메서드는 항상 `return` 을 호출해야 한다. 그런데 반환 타입 `void` 의 경우에는 예외로 `printFooter()` 와 같
      이 생략해도 된다. 
    • 자바가 반환 타입이 없는 경우에는 `return` 을 마지막줄에 넣어준다. 참고로 `return` 을 만나면 해
      당 메서드는 종료된다.

반환 타입

  • 반환 타입이 있으면 반드시 값을 반환해야 한다.
  • 반환 타입이 있는 메서드는 반드시 `return` 을 사용해서 값을 반환해야 한다.

메서드 호출과 값 전달1

  • 자바는 항상 변수의 값을 복사해서 대입한다.
  • 이 대원칙은 반드시 이해해야 한다. 그러면 아무리 복잡한 상황에도 코드를 단순하게 이해할 수 있다.
num1 = changeNumber(num1);

자동 형변환

package method;

public class MethodCasting2 {
	public static void main(String[] args) {
		int number = 100;
		printNumber(number); // int에서 double로 자동 형변환
	}
	public static void printNumber(double n) {
		System.out.println("숫자: " + n);
	}
}
  • 메서드 오버로딩이렇게 이름이 같고 매개변수가 다른 메서드를 여러개 정의하는 것을 메서드 오버로딩(Overloading)이라 한다.
int add(int a, int b)
double add(int a, int b)
  • 다음 케이스는 메서드 이름과 매개변수의 타입이 같으므로 컴파일 오류가 발생한다. 반환 타입은 인정하지 않는다.

용어: 메서드 시그니처(method signature)

  • 메서드 시그니처 = 메서드 이름 + 매개변수 타입(순서)
  • 메서드 시그니처는 자바에서 메서드를 구분할 수 있는 고유한 식별자나 서명을 뜻한다. 메서드 시그니처는 메서드의 이
    름과 매개변수 타입(순서 포함)으로 구성되어 있다. 쉽게 이야기해서 메서드를 구분할 수 있는 기준이다. 자바 입장에서
    는 각각의 메서드를 고유하게 구분할 수 있어야한다. 그래야 어떤 메서드를 호출 할 지 결정할 수 있다.
    따라서 메서드 오버로딩에서 설명한 것 처럼 메서드 이름이 같아도 메서드 시그니처가 다르면 다른 메서드로 간주한다.
    반환 타입은 시그니처에 포함되지 않는다. 
  • 방금 오버로딩이 실패한 두 메서드를 보자. 두 메서드는 `add(int a, int b)` 로 메서드 시그니처가 같다. 따라서 메서드의 구분이 불가능하므로 컴파일 오류가 발생한다.
public static int add(int a, int b);
public static int add(int c, int d);


변수명 vs 메서드명

 

  • 변수 이름은 일반적으로 명사를 사용한다. 한편 메서드는 무언가 동작하는데 사용하기 때문에 일반적으로 동사로 시작 한다.
  • 이런 차이점 외에는 변수 이름과 메서드 이름에 대한 규칙은 둘다 같다.
    • 변수명 예): `customerName` , `totalSum` , `employeeCount` , `isAvailable`
    • 메서드명 예): `printReport()` , `calculateSum()` , `addCustomer()` , `getEmployeeCount()` ,
      `setEmployeeName()`

퀴즈

        • 코드를 여러 번 반복해서 작성할 때 발생하는 가장 큰 문제점은 무엇일까요?
          • 코드 중복은 동일한 코드를 여러 곳에서 수정해야 하는 유지보수 문제를 야기합니다. 메서드를 사용하면 한 곳만 바꾸면 되죠. 
        • 프로그래밍의 메서드를 수학적 함수의 '블랙 박스'처럼 생각하는 것은 어떤 개념과 관련이 있을까요?
          • 추상화는 복잡한 내부 과정을 숨기고 사용자는 단순히 '무엇'을 하는지에 집중하게 하는 개념입니다. 메서드를 호출할 때 내부 구현을 몰라도 되는 것과 같습니다.
        • Java에서 메서드가 반환하는 값이 없음을 나타낼 때 사용하는 키워드는 무엇일까요?
          • `void`는 메서드가 어떤 값도 호출한 곳으로 돌려주지 않음을 명시적으로 나타내는 반환 타입 키워드입니다.
        • 메서드 실행 중 `return` 문을 만났을 때 어떤 일이 발생하나요?
          • `return` 문은 메서드의 현재 실행을 멈추고 즉시 메서드를 호출한 위치로 돌아가게 하는 역할을 합니다.
             
        • 반환 타입이 명시된 메서드에서 조건문(if)의 결과에 따라 `return` 문이 실행되지 않을 가능성이 있다면 어떤 문제가 발생할까요?
          • Java 컴파일러는 모든 코드 경로에서 반환 타입에 맞는 값이 반환될 수 있는지 확인합니다. 만약 반환되지 않을 가능성이 있다면 컴파일 에러를 발생시켜 미리 알려줍니다.
        • Java에서 기본(primitive) 타입 값을 메서드의 매개변수로 전달할 때, 메서드 내부에서 매개변수의 값을 변경해도 메서드 외부의 원래 변수가 바뀌지 않는 근본적인 이유는 무엇일까요?
          • Java는 기본 타입 변수를 메서드에 넘길 때 원본 값이 아닌 복사된 값을 전달합니다. 따라서 메서드 내부의 변경은 복사본에만 영향을 줍니다.
        • 메서드를 '정의'할 때 메서드 이름 옆 괄호 안에 선언되는 변수를 무엇이라고 부를까요?
          • 메서드 정의 시 괄호 안에 선언되어 메서드로 전달되는 값을 받아오는 역할을 하는 변수를 매개변수라고 합니다. 호출 시 넘기는 실제 값은 인자라고 하죠.
        • `double` 타입 값을 매개변수가 `int` 타입인 메서드에 전달하기 위해 명시적 형변환을 사용할 때, 개발자가 감수해야 할 수 있는 부분은 무엇일까요?
          • 명시적 형변환은 개발자가 강제로 타입을 바꾸는 것이므로, double을 int로 바꿀 때처럼 값의 일부(소수점 이하)가 잘릴 수 있으며 그 책임은 개발자에게 있습니다.
        • 메서드 오버로딩 시, Java가 두 메서드를 서로 다른 메서드로 인식하는 기준인 '메서드 시그니처'에 포함되지 않는 것은 무엇일까요?
          • 메서드 시그니처는 메서드 이름과 매개변수의 타입 및 순서 조합으로 구성됩니다. 반환 타입은 시그니처에 포함되지 않아 오버로딩 기준으로 사용될 수 없습니다.
        • 메서드를 사용함으로써 얻을 수 있는 여러 장점 중, 프로그램의 특정 기능을 하나의 독립적인 블록으로 묶어 코드의 구성이 명확해지는 것과 가장 관련 깊은 것은 무엇일까요?
          • 모듈화는 프로그램을 기능별로 분리하여 메서드와 같은 독립적인 단위로 만드는 것을 의미합니다. 이는 코드 구조를 명확하게 하고 관리를 쉽게 합니다.

 

    •  
 
반응형