본문 바로가기

프로그래밍/Java 프로그래밍

자바의 메소드

메소드는 객체의 동작에 해당하는 중괄호 {} 블럭을 말합니다. 중괄호 블럭 이름이 메소드 이름이며, 메소드를 호출하면 중괄호 블럭에 있는 모든 코드들이 일괄적으로 실행됩니다. 메소드는 자바에서 어떤 동작을 할 수 있도록 하는 부분이기때문에 알고리즘을 적용할 수 있는 부분이고 실제적으로 코딩이 이루어지는 부분이라 할 수 있어서 굉장히 중요합니다.



메소드 선언


메소드 선언은 선언부(리턴 타입, 메소드 이름, 매개 변선 선언)와 실행 블럭으로 구성됩니다.


리턴 타입


리턴 타입은 리턴값의 타입을 말합니다. 리턴값이란 메소드를 실행한 후의 결과값을 말합니다. 메소드는 리턴값이 있을 수도 있고 없을 수도 있습니다. 하지만 리턴 타입은 선언부에 명시되어야 합니다. 리턴값이 있으면 그 리턴값의 타입을 선언부에 명시하고 리턴값이 없으면 void를 리턴 타입으로 표시합니다.



메소드 이름


메소드 이름은 자바 식별자 규칙에 맞게 작성하면 됩니다.


1. 숫자로 시작하면 안 되고, $와 _를 제외한 특수문자를 사용하지 말아야 합니다.

2. 관례적으로 메소드 이름은 소문자로 시작합니다.

3. 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫글자는 대문자로 작성합니다.


일반적으로 메소드 이름은 소문자로 시작하고 Camel notation을 사용하고 실행 블럭의 내용을 알 수 있도록 작성하면 됩니다.



매개 변수 선언


매개 변수는 메소드가 실행할 때 필요한 데이터를 외부로부터 받기 위해 사용됩니다. 메소드에는 매개 변수가 필요한 경우가 있고 필요 없는 경우가 있습니다. 매개변수가 필요없는 경우는 매개변수를 나열하지 않고 그냥 ()를 사용하면 되고 매개 변수가 있는 경우는 변수 타입과 변수명을 사용하고 하나 이상의 경우에는 콤마(,)로 구분합니다.




첫번째 소스화일은 클래스 Calculator를 선언하였고 두번째 소스화일은 클래스 Calculator의 메소드를 사용해서 결과를 출력했습니다. Calculator에는 모두 4개의 메소드가 있습니다. powerOn, plus, divide, powerOff 입니다. powerOn과 powerOff는 리턴값이 없기 때문에 void라고 리턴타입에 선언이 되어있습니다. plus는 int를 return하기 때문에 리턴타입이 int이고 divide는 double 값을 리턴하기 때문에 double로 선언하였습니다.  powerOn과 powerOff는 매개변수가 없어서 단순히 빈괄호 () 를 사용하였고 plus와 divide는 두개의 int값을 매개변수로 받기 때문에 괄호 안에 (int x, int y)로 선언하였습니다. int는 매개 변수의 타입이고 x와 y는 변수의 이름입니다. 위의 예제처럼 x와 y를 사용할 수도 있지만 실제 프로그램에서는 의미있는 이름을 사용하여 선언부만 보더라도 이해할 수 있도록 하는 것을 추천합니다. 두번째 소스화일에서 Calculator라는 클래스를 사용하려면 먼저 new 연산자를 사용하여 객체화시켜야 합니다. 그래서 Calculator myCalc = new Calculator()를 작성하였습니다. 모든 클래스를 사용하기 전에 객체화하여야 합니다. 그리고 powerOn 메소드를 실행시켰습니다. powerOn 메소드를 실행하기 위해서 도트(.) 연산자를 사용했습니다. 객체명에 도트를 사용하고 메소드 이름을 적습니다. myCalc.powerOn()과 같은 형식을 가집니다. 여기서는 리턴값도 없고 매개변수도 없기 때문에 단순히 메소드 호출만 하였지만 뒤에 있는 plus는 리턴값과 매개변수가 있기 때문에 조금 다릅니다. 먼저 리턴 값을 받기 위해 리턴 타입과 같은 타입의 변수를 선언합니다. 그래서 int result1을 선언하였고 두개의 int형 매개변수를 갖기 때문에 5, 6을 매개 변수로 넣었습니다. 이처럼 리터럴을 사용해도 되고 밑의 divide 처럼 변수를 사용해도 됩니다.



리턴(return) 문


리턴값이 있는 메소드


메소드 선언에 리턴 타입이 있는 메소드는 반드시 리턴문을 사용해서 리턴값을 지정해야 합니다. 리턴값은 리턴 타입이거나 리턴 타입으로 변환할 수 있어야 합니다. 위의 plus 메소드에서 return뒤에 int 타입을 지정하거나 byte, short 같은 변수가 오더라도 int 타입으로 형변환이 가능하므로 상관이 없습니다. 자바에서 return문을 만나면 메소드가 바로 종료되고 리턴값을 반환합니다.



리턴값이 없는 메소드 : void


리턴값이 없는 메소드는 리턴 타입으로 void를 사용합니다. 그런데 void로 선언된 메소드에서도 return문을 사용할 수 있습니다. 이 경우는 return뒤에 아무런 값이 존재해서는 안되고 단순히 return; 이라고 사용해야하고 바로 메소드가 종료됩니다. break문과 return문은 차이가 있습니다. break문은 while, for, switch와 같은 블럭을 종료하는 것이고 return문은 전체 메소드를 종료시키는 것입니다.




위의 프로그램은 Car라는 클래스를 정의하고 그 클래스에 있는 메소드를 사용한 것입니다. 메소드 중에 isLeftGas라는 메소드가 있는데 이런 식으로 is로 시작하는 메소드 이름은 boolean을 리턴타입으로 가집니다. 물론 자바에서 그렇게 정한 것은 아니지만 관례적으로 그렇게 사용합니다. 위의 프로그램은 처음에 setGas 메소드를 사용하여 가스를 주입하고 run 메소드를 통해 가스를 1씩 소비하면서 달립니다. 그리고 가스가 0이 되면 멈춥니다. run 메소드를 살펴보면 가스가 0보다 크지 않으면 return 문을 통해 메소드가 종료됩니다. 비록 return 문에 while문 안에 있지만 바로 종료됩니다. 두번째 소스화일은 라인 9와 10인 다음과 같이 줄여서 쓸 수 있습니다.

if(myCar.isLeftGas()) {

gasState라는 변수를 사용하지 않고 if문안에 myCar.isLeftGas라는 메소드를 사용해서 직접 비교를 해도 됩니다.



메소드 오버로딩


클래스 내에 같의 이름이 메소드를 여러 개 선언하는 것을 메소드 오버로딩(Overloading)이라혹 합니다. 이전 생성자에서 배운 적이 있는데 이것도 마찬가지입니다. 생성자가 아닌 그냥 메소드라는 것이 차이점입니다. 같은 메소드 이름인데 매개 변수의 타입, 개수, 순서 중 하나가 달라야합니다. 메소드 오버로딩이 필요한 이유는 매개값을 다양하게 받아 처리할 수 있도록 하기 위해서입니다. 간단히 예를 들어보겠습니다. 위에서 plus라는 메소드를 사용한 적이 있습니다. 이때는 매개변수를 int 타입으로 했습니다. 그러나 double plus(double x, double y)라고 메소드를 생성한다면 메소드 오버로딩이 되고 정수형이 더하기이던 실수형의 더하기이던 모두 plus라는 메소드로 호출할 수 있게 되는 것입니다.




위 프로그램은 areaRectangle이라는 메소드의 오버로딩에 관한 예제입니다. 사각형의 면적을 구할 때는 가로 곱하기 세로이지만 정사각형의 경우는 가로와 세로의 길이가 같기 때문에 2개의 변수가 필요없습니다. 그래서 매개변수가 하나인 메소드와 두개인 메소드로 오버로딩을 하였습니다.

'프로그래밍 > Java 프로그래밍' 카테고리의 다른 글

자바 싱글톤과 상수  (0) 2020.07.11
자바 인스턴스 멤버와 정적 멤버  (0) 2020.07.10
자바의 필드와 생성자  (0) 2020.07.07
자바 클래스  (0) 2020.07.06
자바의 열거타입  (0) 2020.07.05