한 걸음 두 걸음

자바 JAVA ] 함수 method / 매개변수/ static함수 / 가변인자 본문

Language/Java

자바 JAVA ] 함수 method / 매개변수/ static함수 / 가변인자

언제나 변함없이 2019. 11. 18. 14:14
반응형

메소드

클래스 내부에 위치한 함수를 메소드라 하는데 JAVA는 객체지향개발언어이므로 모두 클래스 내부에 위치합니다. 때문에 모든 함수는 메소드가 됩니다.

메소드 구조

메소드 구조는 다음과 같습니다.

public class 클래스명{
    접근제한자 반환타입 메소드명(파라미터){
        ...
        return 반환할 값/수식
    }
}

이를 보다 이해하기 쉽게 작성하자면 다음과 같습니다.

public class MyClass{
    public int myMethod(int param){
        return param
    }
}

이러한 형식으로 사용하실 수 있으며, 메소드의 이름은 보통 소문자로 시작하는데 동사로 시작해서 명사나 형용사가 옵니다. 그냥 이해하기 쉽게 camelCase를 지켜서 작성하시면 좋습니다.

static 함수 / 정적메소드

기본적으로 main함수는 static으로 호출이 됩니다. (Static는 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미합니다.) main함수가 static인 이유는 JVM이 객체를 생성할 필요 없이 main함수를 호출하여 실행하기 위함입니다. 그런데 같은 클래스 내에서 static함수에서는 static한 함수만 호출이 가능합니다. static함수는 해당 객체가 생성되었다가 소멸해도 사라지지 않고 프로그램이 시작할 때 생성되었다가 프로그램이 끝날 때 사라집니다.객체가 생성되기 전부터 프로그램 시작 시 만들어져 있기 때문에 객체를 만들지 않고도 접근이 가능합니다. (객체명.변수 혹은 객체명.함수() 로요.)

정적변수를 클래스변수라 하고 정적 메소드를 클래스메소드라 합니다.
그리고 클래스메소드 내에는 클래스변수나 클래스 메소드만 호출할 수 있으며 일반 변수나 일반 메서드는 호출 불가능합니다

값에 의한 호출(call by value)

자바에서는 Primitive data type(8가지 기본 자료형)일 경우 값에 의한 전달을 합니다. 함수에 파라미터로 기본형자료를 넘기면 변수에 값 자체가 복사되어 저장됩니다.


public class Main {
    public static void main(String[] args) {
            int s = 10;
            increase(10);
    }
}

간단하게 이렇게 main에서 increase() 함수를 호출했다고 쳐도, s값은 바뀌지 않습니다.

public int increase(int a){
    a += 10;
    return a ;
}

위의 함수에서는 a를 호출하여 사용했을 때 a에 10이 더해져도 실제로 s값에 영향을 끼치지 않는 반면 참조에 의한 호출은 영향을 받게 됩니다.

참조에 의한 호출 (call by reference)

객체타입의 자료형의 경우 참조에 의한 호출이 이루어집니다. 배열이나 객체가 이에 해당하며, 값이 아니라 객체의 주소 값이 저장되어 함수의 매개변수로 전달됩니다.
매개변수로 전달되는 경우에는 객체가 복사되지 않고 참조 변수 안에 있던 주소값(을 스택 내부에 쌓아놓고)만 복사되기 때문에 같은 객체(Heap내에 존재합니다)를 가리키게 됩니다.

파라미터와 반환 값

모든 데이터가 파라미터로 가고 반환될 수 있는데 그 중에서도 배열은 특이사항이 있으므로 살펴보겠습니다.
배열을 포함한 모든 객체타입은 참조를 통해 전달되므로 파라미터 값을 받아 사용하는 함수에서 변경사항이 있을 때 반영됩니다.

가변인자

JAVA8에서 새로 생긴 가변인자는 파라미터의 개수를 제한하지 않고 여러 개의 파라미터를 받는 것입니다. 하지만, 가변인자는 반드시 메소드의 마지막 파라미터이어야 합니다.

public static double average( double... values){
    double sum = 0;
    for( double v : values ) 
        sum += v;
     return sum / values.length;
}

이러한 average를 계산하는 함수가 있을 때 매개변수의 갯수를 자유롭게 줄 수 있어서 파라미터의 갯수만큼 다르게 함수를 만들어줄 필요가 없습니다.

참고로 중복메소드는 같은 이름의 메소드가 있어도 매개변수가 다르면 다르게 사용할 수 있음을 말하는 것입니다.

반응형