본문으로 바로가기

1. 메소드

  • 객체의 동작에 해당하는 실행 블록
  • 메소드는 필드를 읽고 수정하는 역할도 있지만, 다른 객체를 생성해서 다양한 기능을 수행하기도 합니다.
  • 메소드는 객체 간의 데이터 전달의 수단으로 사용됩니다. (객체 간 상호작용)
  • 외부로부터 매개 값을 받을 수 있고, 실행 후 어떤 값을 리턴할 수도 있습니다.

 

2. 메소드 선언

리턴타입 메소드이름 ( [매개변수, ...] ) {
	// 실행할 코드를 작성하는 곳
}
  • 메소드 선언부(리턴 타입, 메소드 이름, 매개변수)와 실행 블록으로 구성
  • 메소드 선언부를 메소드 시그니처라고 합니다.
  • 메소드 이름은 관례적으로 소문자로 작성합니다. (그 이후에는 낙타 표기법)

 

3. 매개 변수

  • 메소드가 실행할 때 필요한 데이터를 외부로부터 받기 위해 사용합니다.
  • 매개 변수 간 자동 타입 변환이 가능합니다.
  • int 타입의 매개 변수를 가지고 있다면 byte, short로 자동 타입 변환이 되므로 매개 값으로 전달할 수 있습니다.

 

예시

public class A {
    void sumPrint(int num1, int num2) {
        System.out.println(num1 + num2);
    }

    public static void main(String[] args) {
        A a = new A();

        int num1 = 1;
        int num2 = 2;
        a.sumPrint(num1, num2);

        // 매개 변수 자동 형변환 byte -> int
        byte bNum1 = 3;
        byte bNum2 = 4;
        a.sumPrint(bNum1, bNum2);
    }
}

 

4. 리턴 타입

  • 리턴 값은 있을 수도 있고 없을 수도 있습니다.
  • 리턴 값이 없는 메소드는 리턴 타입에 void가 와야 하며 리턴 값이 있는 메소드는 리턴 값의 타입이 와야 합니다.
  • 리턴 값이 있는 리턴 타입 = 기본 타입(정수, 실수, 논리), 참조 타입(클래스, 배열, 열거, 인터페이스)

 

리턴 값이 있는 메소드

  • 메소드 선언에 리턴 타입이 있는 메소드는 반드시 리턴 문을 사용해서 리턴 값을 지정해야 합니다.
  • return문의 리턴 값은 리턴 타입이거나 리턴 타입으로 변환될 수 있어야 합니다. (자동 타입 변환 가능)
  • return문 이후에 실행문은 결코 실행되지 않습니다.
// 리턴 값이 있는 메소드 (기본 타입)
int sum(int num1, int num2) {
    return num1 + num2;
}

// 리턴 값이 있는 메소드 (참조 타입 : String 클래스)
String helloPrint(String name) {
    String hello = "hello " + name; 
    return hello;
}

 

리턴 값이 없는 메소드

  • void로 선언된 리턴 값이 없는 메소드에서도 return 사용이 가능합니다.
  • return 사용 시 메소드 실행을 강제 종료시킵니다.
// 리턴 값이 없는 메소드
void helloPrint() {
    System.out.println("hello");
}

 

주의) 무한 Loop 반복문 조건에 따라 종료하기 break와 return 차이

break는 Loop를 벗어나는 것이고 return처럼 메소드를 종료하지 않습니다.

public static void run() {
    int i = 0;
    while (true) {
        if(i < 10) {
            System.out.println(i);
            i++;
        } else {
            //break;
            return;
        }
    }
    //System.out.println("hi"); // break 의 경우 이게 실행 가능함
}

 

5. ... 매개 변수

  • 매개 변수로 몇 개가 입력될지 알 수 없는 경우 사용합니다.
  • ... 선언된 매개 변수는 배열 타입이므로 배열을 직접 매개 값으로 사용할 수 있습니다.

 

예시

public class A {
    void sumPrint(int ... num) {
        System.out.println(Arrays.stream(num).sum());
    }

    public static void main(String[] args) {
        A a = new A();
        a.sumPrint(1, 2, 3, 4, 5); // 15

        int[] numberArr = new int[]{6, 7, 8, 9, 10}; // 40
        a.sumPrint(numberArr); // ... 은 배열 타입이므로 배열을 전달해도 사용 가능합니다.
    }
}

 

6. 메소드 오버로딩

  • 메소드 이름은 같고 매개 변수의 타입, 개수, 순서를 다르게 하여 선언합니다.
  • 메소드 오버로딩을 사용하는 이유는 다양한 요구 조건을 받아 처리할 수 있도록 하기 위해서입니다.

 

예시 (String 클래스)

메소드 오버로딩 예시로 String 클래스의 정적 메소드인 valueOf()를 확인해 볼 수 있습니다.

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

    public static String valueOf(boolean b) {
        return b ? "true" : "false";
    }

    public static String valueOf(char c) {
        if (COMPACT_STRINGS && StringLatin1.canEncode(c)) {
            return new String(StringLatin1.toBytes(c), LATIN1);
        }
        return new String(StringUTF16.toBytes(c), UTF16);
    }

    public static String valueOf(int i) {
        return Integer.toString(i);
    }
    
    public static String valueOf(long l) {
        return Long.toString(l);
    }

    public static String valueOf(float f) {
        return Float.toString(f);
    }
    
    public static String valueOf(double d) {
        return Double.toString(d);
    }
    
    // ... (생략)
}

 

사용 예시 (기본 타입 → 문자열 )

// 기본 타입 → 문자열
byte b = 10;
int i = 1;
double d = 1.0;
boolean check = true;

// String.valueOf()
String byteToStr1 = String.valueOf(b);
String intToStr1 = String.valueOf(i);
String doubleToStr1 = String.valueOf(d);
String booleanToStr1 = String.valueOf(check);