Starbucks Caramel Frappuccino
본문 바로가기
  • 그래 그렇게 조금씩
JAVA/Java Start

9. 메서드(method)

by Toughie 2024. 2. 10.

" 재사용성, 유지보수 "

input -> function -> output

 

메서드 선언과 본문

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

 

제어자(Modifier)

- public - 접근제어자 (public 수준은 다른 클래스에서 호출 가능함)

- static - 정적 메서드 (데이터 영역에 저장, 한 번만 초기화)

 

반환 타입(Return Type)

메서드 호출 후 반환하는 데이터 타입 지정. 반환값이 없는 경우 void

- int - 반환 타입

 

메서드 이름(Method Name)

메서드 호출 시 사용되는 이름

- add - 함수명

 

매개변수(Parameter)

입력값, 매개변수는 optional

int a, int b - 파라미터 타입과 이름 (파라미터 리스트)

- 지역 변수로 해당 메서드 안에서만 사용된다. (스택 안에서)

 

메서드 본문(Method body)

실제 메서드의 코드가 위치한다. { statements };


Parameter(파라미터, 매개변수, 가인수)

- 함수의 정의 단계에서 나열되는 변수들

 

Argument(아규먼트, 인자, 전달인자, 실인수)

- 함수 호출(call) 시 실제로 전달되는 '값'


Void 

    public static void sayHello() {
        System.out.println("안녕하세요 Toughie입니다.");
//        return;
//        반환 타입이 void인 경우 return; 생략 가능
    }

 

Return

반환 타입이 명시되어 있는 경우 항상 해당 타입을 반환해야 한다.

    public static boolean odd(int i) {
        return (i % 2) == 1;
    }

또한 return을 만나면 즉시 해당 메서드를 빠져나가 호출점으로 복귀한다. (반환 값이 있는 경우 반환 값과 함께)


메서드 호출과 값 전달

'자바는 항상 변수의 값을 복사해서 대입한다.'

    public static void main(String[] args) {
        int num1 = 5;
        System.out.println("원본 값(함수 호출 전)" + num1);
        changeNumber(num1);
        System.out.println("원본 값(함수 호출 후)" + num1);
    }
    
    public static void changeNumber(int num2) {
        System.out.println("변경 전 값: " + num2);
        num2 = num2 * 2;
        System.out.println("변경 후 값: " + num2);
    }

원본의 값을 바꾸고 싶었다면, return type을 void가 아닌 int로 변경 후 반환값을 num1에 할당해줘야 한다.

또한 위 코드에서는 num2는 지역변수이기에 함수실행이 끝나면 소멸한다.


Type Casting

기본적으로는 메서드에 값을 전달할 때 타입을 맞춰주는 것이 맞다.

하지만 필요에 따라 묵시적 형변환이 일어나거나, 명시적 형변환을 해줄 수 있다.

    public static void main(String[] args) {
        double number = 1.0;
//        'printNumber(int)' in 'method.MethodCasting' cannot be applied to '(double)'
//        printNumber(number);
        printInt((int) number);

        int number2 = 2;
        //묵시적 형변환이 일어남 (double > int)
        printDouble(number2);
    }

    public static void printInt(int n) {
        System.out.println("number: " + n);
    }
    public static void printDouble(double n) {
        System.out.println("number: " + n);
    }

메서드 오버로딩 (Overloading)

이름은 같게, 파라미터는 다르게!(타입, 개수, 순서)

반환 타입은 인정하지 않는다. 

 

*메서드 시그니처(method signature) : 메서드 이름 + 파라미터 타입, 순서, 개수

메서드 구분의 기준.

 

개수가 다른 경우

    public static int add(int a, int b) { ... }
    public static int add(int a, int b, int c) { ... }

 

타입이 다른 경우

public static void add(int a, double b) { ... }

public static void add(double a, int b) { ... }

 

반환 타입은 인정하지 않는다.

public static void add(int a, double b) { ... }
// 컴파일 오류
// add(int, double) is already defined
public static double add(int a, double b) { ... }

 

여러 타입으로 오버로딩이 되어 있는 경우, 타입에 맞는 메서드가 먼저 호출되는 것이 원칙.

타입에 맞는 메서드가 없는 경우 자동 캐스팅 되어 호출.


Method Naming

변수는 주로 명사형이었다면, 메서드는 주로 동사형을 사용한다.

addNumbers(), updateNames(), printMenus()


메서드의 장점

1. 재사용성과 확장성

메서드는 특정 기능을 캡슐화(코드 블럭 안에 모음) 하기 때문에 필요할 때마다 해당 메서드를 호출해서 코드를 재사용 할 수 있다.

또한 다른 프로그램에서도 사용이 가능하다. (비슷한 로직이라면)

 

2. 가독성

메서드 이름을 통해서 동작을 예측할 수 있기 때문에 코드 이해에 도움이 된다.

 

3. 모듈화, 디버깅

많은 코드를 작게 모듈화 해서 유지보수를 용이하게 한다.(필요 시 해당 메서드만 수정하면 된다.)

또한 메서드로 코드를 모듈화 하면 독립적으로 테스트하기 용이하다.

 

4. 추상화

메서드를 호출하는 곳에서는 메서드의 구현을 몰라도 된다. (파라미터와 반환 타입인 메서드 시그니처만 알면 된다.)

 


학습 출처

김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음