Dico

[Java] Method 01 - 구조

메서드 Method

특정 작업을 수행하는 문장들을 하나로 묶은 것.

클래스 안에서 정의되어야 한다.

기능

  • 블랙박스 black box

     내부적으로 어떻게 동작하는 지 몰라도 메서드에 넣을 값과 반환되는 결과만 알면 사용할 수 있다.

  • 재사용성 reusability

     한 번 만들어 놓은 메서드는 몇 번이고 호출할 수 있으며, 다른 프로그램에서도 사용 가능하다.

  • 중복된 코드 제거

     반복되는 문장들을 묶어서 하나의 메서드로 작성해 놓으면, 반복되는 문장들 대신 메서드를 호출하는 한 문장으로 대체할 수 있다.

  • 프로그램의 구조화

     문장들을 작업단위로 나눠서 여러 개의 메서드에 담아 프로그램의 구조를 단순화시킬 수 있다.

메서드 선언부 Method Declaration, Method Header

메서드가 작업을 수행하기 위해 어떤 값들을 필요로 하고, 작업의 결과로 어떤 타입의 값을 반환하는 지에 대한 정보를 제공한다.

public returnType methodName(type parameter)
  • 반환 타입 return type

    메서드의 작업 수행 결과(반환값, return value)의 타입을 적는다.

    작업만 수행하고 반환할 값이 없을 경우 'void'를 적는다.

    참조형일 경우, 객체의 주소값을 주고 받는 다.

public class Test {
    public static void main(String[] args) {

        Variables v1 = new Variables();
        v1.iv = 2;
        System.out.println("v1.iv: " + v1.iv);	 // v1.iv: 2

        Variables v2 = method(v1);
        System.out.println("v2.iv: " + v2.iv);	 // v2.iv: 2
    }
 
    public static Variables method(Variables v) {
        return v;
    }
}

class Variables {
    int iv;
}
  • 메서드의 이름 method name

     변수의 명명규칙대로 작성한다.

     이름만으로 메서드의 기능을 알 수 있도록 함축적이면서도 의미 있게 짓는 것이 좋다.

  • 매개변수 선언 parameter declaration

     매개변수 : 메서드가 작업을 수행하는 데 필요한 값들을 제공받기 위한 것.

     값을 입력 받을 필요가 없다면 괄호 안을 비워도 된다.

     두 변수의 타입이 같아도 변수의 타입을 생략할 수 없다.

void methodName(int lv1, int lv2) { }
void methodName(int lv1, lv2) { }      // error

메서드 구현부 method body {}

메서드를 호출했을 때 수행될 문장들을 넣는다.

public returnType methodName(type parameter) {
    return returnValue;
}
  • return문

     호출한 메서드로 반환값을 전달한다.

     메서드의 반환타입이 'void'가 아닌 경우, 구현부 안에 'return 반환값'이 반드시 포함되어야 한다.

     반환값의 타입은 반환타입과 일치하거나 자동 형변환이 가능한 것이어야 한다.

     if-else문을 사용할 때 항상 결과값이 반환되도록 해야 한다.

int methodName(int lv) {
	if (lv > 0) return lv;
	else return 0;
}
  • 반환값 return value

     주로 변수.

     수식을 사용할 경우, 수식을 계산한 결과가 반환된다.

int methodName(int lv1, int lv2) {
	return lv1 + lv2;
}
  • 지역변수

     서로 다른 메서드라면 같은 이름의 변수를 선언할 수 있다.

int methodNameOne(int lv) {
	return lv;
}
int methodNameTow(int lv) {
	return lv;
}

메서드 호출

methodName(argument1, argument2, ...);

특정 위치에 저장되어 있는 명령들을 수행한다.

메서드를 호출해야만 구현부의 문장들이 수행된다.

public class Test {
    public static void main(String[] args) {	
        methodName(3);
    }

    public static int methodName(int lv) {
        return lv;
    }
}
  • 인자 / 인수 argument

     메서드 호출 시 괄호()안에 지정한 값.

     매개변수에 대입되는 값.

     인자의 개수와 순서는 호출된 메서드에 선언된 매개변수와 일치해야 한다.

     매개변수의 타입과 일치하거나 자동 형변환이 가능해야 한다.

  • 메서드의 실행 흐름

     메서드가 호출되면 지금까지 실행 중이던 메서드는 잠시 실행을 멈추고 호출된 메서드의 문장들을 실행한다.

     같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않고 서로 호출이 가능하다.

     static 메서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없다.

매개변수의 유효성 검사

메서드의 구현부를 작성할 때 매개변수의 값이 적절한 것인지 확인하는 것.

메서드 호출 시 적절치 못한 값을 입력할 수 있기 때문에 가능한 모든 경우의 수에 대해 고민하고 그에 대비한 코드를 작성해야 한다.

적절하지 않은 값이 매개변수를 통해 넘어온다면 매개변수의 값을 보정하거나,

보정하는 것이 불가능하다면 return문을 사용해 작업을 중단하고 호출한 메서드로 돌아간다.

int methodName(int lv1, int lv2) {
	
    if (lv2 == 0){
        return 0;
    }
    return lv1 / lv2;
}

메서드 사용

  • 중복 상태
public class Test {
    public static void main(String[] args) {
		
        for (int i = 0; i < 10; i++) {
            i = i + 3;
        }
	...
        for (int i = 0; i < 10; i++) {
            i = i + 3;
        }
    }
}
  • 메서드 사용
public class Test {
    public static void main(String[] args) {
		
        method2();
	...
        method2();
    }

    public static void method2() {
        for (int i = 0; i < 10; i++) {
            i = i + 3;
        }
    }
}

참고 서적: 자바의 정석 3판