[Java] 메소드

Bam·2024년 2월 26일
0

Java

목록 보기
25/98
post-thumbnail

지난 포스트에서 메소드를 클래스 내부에서 정의되는 함수라고 간단하게 이야기했었는데요. 오늘은 이 메소드를 조금 더 자세하게 알아보려고 합니다.


메소드

메소드(method)는 코드 블록으로 감싸진 명령 모음입니다. 이렇게말하면 어려워보이지만 간단하게 함수로, 어떤 데이터를 받아서 해당 데이터를 처리하고 결과를 돌려주는 역할을 수행합니다. 물론 경우에 따라서 입력값이 없거나 반환값이 없는 경우도 있습니다.

주로 코드 줄 수를 줄이는데 목적이 있기에 반복되는 코드를 모아 하나의 메소드를 만들고, 해당 코드가 필요한 부분에서 메소드를 호출하는 식으로 사용합니다. 또한 코드를 모아놓았기 때문에 유지보수도 쉬워지는 장점을 갖고있습니다.

메소드는 다음 세 가지를 주의하면서 작성합니다.

  • 하나의 메소드는 하나의 작업만 수행하도록 한다.
  • 반복적으로 수행되는 작업들을 메소드로 만든다.
  • 관련이있는 문장들을 모앟 메소드로 만든다.

위 세 가지를 주의하면서 메소드를 작성하면 메소드의 내부 코드는 몰라도 이름, 파라미터, 반환 결과만 보고도 해당 코드들을 이해하는데 큰 도움을 받을 수 있습니다.

선언하기

메소드는 다음과 같이 선언합니다.

반환값_타입 메소드이름 (매개변수, ...) {
	//메소드의 동작 구현
}
  • 반환값 타입은 결과로 반환하는 값의 타입을 적어줍니다. ex)숫자를 반환하면 int, long 등
    이때 반환값이 없는 메소드라면 void를 사용하고, 반환값이 있다면 메소드 마지막에 return문을 통해서 반환값을 내보내주어야합니다.
  • 매개변수(파라미터)는 상황에 따라 있을 수도 있고 여러개가 올 수도 있습니다.

다음 코드는 int형 매개변수 두 개를 받아 덧셈을하고 int 타입값을 반환하는 메소드입니다.

int add (int num1, int num2) {
	return num1 + num2;
}

메소드의 호출은 참조변수와 .을 이용해서 호출합니다.

참조변수.메소드이름(매개변수, ...);

return

return은 현재 실행 중인 메소드를 종료하고 호출했던 메소드로 돌아가는 명령을 수행합니다.

메소드는 다음 두 가지 상황에서 종료됩니다. (*오류가 아닐경우만)

  • 블록 마지막까지 수행되어 블록이 끝난경우
  • return 문을 수행하는 경우

return은 반환값이 있는 경우와 없는 경우 모두 사용가능합니다. 단, 반환값이 있는 경우 메소드 선언의 타입과 반환값의 타입이 일치해야합니다.(자동형변환이 수행되는 경우도 OK!!!)

return;	//반환값이 없는 경우

return 반환값;	//반환값이 있는 경우

매개변수

매개변수(인자, Parameter)는 메소드에서 작업을 수행하는데 필요한 데이터를 전달받는 메소드 내부에서 사용되는 변수입니다. 메소드에 따라 매개변수가 없을 수도 여러 개일 수도 있습니다.

참고로 함수가 호출될 때 전달하는 변수 또는 값은 전달 인자(인수, Argument)라고 부릅니다.

매개변수는 변수 형태로 받기 때문에 기본형 변수와 참조형 변수 둘 다 올 수 있는데요. 두 형태의 동작이 약간 차이가 있습니다.

먼저 기본형 매개변수는 오직 변수에 저장된 값만을 읽어냅니다. 즉 읽기 전용입니다. 참조형 매개변수는 값을 읽고 쓰고 둘 다 할 수 있습니다. 이러한 이유는 기본형은 값을 직접 저장하는 변수고 참조형은 값이 저장된 주소에 대한 정보를 가진 타입이기 때문입니다.

참조형 매개변수를 이용하면 아래와 같은 코드를 작성해서 실행해도 x[0]를 변경하는 과정에서 오류가 발생하지 않습니다.

int[] x = {1};

int changeX (int[] x) {
	x[0] = 2;
}

클래스 메소드, 인스턴스 메소드

멤버변수 때 처럼 메소드도 또한 static키워드의 유무에 따라 클래스메소드와 인스턴스메소드가 됩니다.

static이 붙으면 클래스메소드, 붙지 않으면 인스턴스메소드가 됩니다. 마찬가지로 클래스메소드는 클래스가 등록될 때 생성되어 인스턴스를 하지 않고도 사용이 가능하며, 인스턴스메소드는 인스턴스화할 때 생성되어 인스턴스를 통해 접근이 가능합니다.

사용처가 비교적 명확한데요. 클래스메소드는 인스턴스와는 인스턴스변수나 인스턴스메소드를 이용하지 않는 메소드를 정의할 때 정의하고, 인스턴스메소드는 인스턴스변수와 관련된 작업을 하는 메소드를 정의할 때 사용하면 좋습니다.

위에서 예시 코드로 나온 add나 changeX가 static을 붙여 클래스메소드로 만들면 딱 좋은 예시입니다.

한 가지 주의할 점은 클래스메소드에서는 인스턴스변수를 사용할 수 없다라는 것입니다. 왜냐하면 클래스 메소드는 클래스가 등록되는 시점에 등록되는데, 이 시점에서 인스턴스화를 하지 않았다면 등록되지도 않은 인스턴스변수를 가져다 사용하는 것이 되기 때문에 사용할 수 없는 것 입니다.

0개의 댓글