보통 다른언어에는 함수라는 것이 별도로 존재한다. 하지만 자바는 클래스를 떠나 존재하는 것은 있을 수 없기 때문에 자바의 함수는 따로 존재하지 않고 클래스 내에 존재한다. 자바는 이 클래스 내의 함수를 메소드라고 부른다.
※ 보통 함수와 메소드가 공존하는 언어(예:파이썬)에서는 두 개를 구분하여 말하기도 하지만 자바는 보통 메소드와 함수를 구분하여 말하지 않는다. 다만 자바에서 사용되는 함수의 정확한 명칭은 메소드이다. |
메소드를 사용하는 이유는?
가끔 프로그래밍을 하다 보면 똑같은 내용을 자신이 반복해서 적고 있는 것을 발견할 때가 있다. 이 떄가 바로 메소드가 필요한 떄이다. 여러번 반복해서 사용된다는 것은 언제고 또 다시 사용할 만한 가치가 있는 부분이라는 뜻이다. 즉, 이러한 경우 이것을 한 뭉치로 묶어서 "어떤 입력값을 주었을 떄 어떤 리턴값을 돌려준다" 라는 식의 메소드를 작성하는 것이 현명한 일이다.
public class Test {
public int sum(int a, int b) {
return a+b;
}
public static void main(String[] args) {
int a = 3;
int b = 4;
Test myTest = new Test();
int c = myTest.sum(a, b);
System.out.println(c);
}
}
위 코드는 sum메소드에 3,4 값을 메개변수로 전달하여 7이라는 값을 돌려받는 예제이다. 실행해보면 7이라는 값이 출력되는 것을 확인할 수 있다.
메소드의 입력값과 리턴값
메소드는 들어온 입력값을 가지고 어떤 처리를 하여 적절한 리턴값을 돌려주는 블랙박스와 같다. 또한 메소드 처리하는 순서도 이러하다.
입력값 ----> 메소드(블랙박스) ----> 리턴값
메소드의 구조
public 리턴자료형 메소드명(입력자료형 1 입력변수1, 입력자료형2 입력변수2, ...) {
...
return 리턴값; //
}
리턴자료형은 메소드 수행 후 돌려줄 값의 자료형을 의미한다. 메소드의 리턴값은 return이라는 명령을 사용한다.
메소드 입출력 유무에 따라 다음과 같이 4가지로 분류할 수 있다.
- 입력과 출력이 모두 있는 메소드
- 입력과 출력이 모두 없는 메소드
- 입력은 없고 출력은 있는 메소드
- 입력은 있고 출력은 없는 메소드
평범한 메소드
입력값이 있고 리턴값이 있는 메소드가 평범한 메소드이다.
public int sum(int a, int b){
return a+b;
}
실제 코드의 예는 이렇게 사용된다.
Test myTest = new Test();
int c = myTest.sum(a,b);
위에서 보듯이 myTest.sum(a,b) 호출 후 리턴값을 저장하는 c의 자료형은 int로 해야만 한다. 왜냐면 sum에 메소드의 리턴타입이 int로 되어 있기 때문이다.
입력값이 없는 메소드
public String say(){
return "Hi";
}
say 메소드의 입출력 자료형은 다음과 같다.
say라는 이름의 메소드를 만들었다. 하지만 입력 인수부분을 나타내는 괄호 안이 비어있다.
Test myTest = new Test();
String a = new myTest.say()
System.out.println(a);
위의 메소드를 쓰기 위해서는 say()처럼 괄호 안에 아무런 값도 넣어주지 않고 써야한다. 위의 메소드는 입력값은 없지만 리턴값으로 "Hi"라는 문자열을 돌려준다. 따라서 String a = myTest.say()처럼 하면 a에는 "Hi"라느 ㄴ문자열이 대입되게되는 것이다.
리턴값이 없는 메소드
public void sum(int a, int b){
System.out.println(a+"과"+b+"의 합은"+ (a+b)+ "입니다.");
}
리턴값이 없는 메소드는 명시적으로 리턴타입 부분에 void라고 표기한다. 리턴값이 없는 메소드는 돌려주는 값이 없기 때문에 다음과 같이 사용한다.
Test myTest = new Test();
myTest.sum(3,4);
입력값도 리턴값도 없는 메소드
public void say() {
System.out.println("Hi");
}
위 say메소드의 입출력 자료형은 다음과 같다.
Test myTest = new Test();
myTest.say();
return의 또 다른 쓰임새
public void say_nick(String nick) {
if("fool".equals(nick)){
return;
}
System.out.println("나의 별명은" +nick+ "입니다.");
}
위의 메소드는 입력값으로 nick이란 변수를 받아서 문자열을 출력하는 메소드이다. 이 메소드는 입력값으로 'fool'이라는 값이 들어오면 문자열을 출력하지 않고 메소드를 즉시 빠져나간다. 이렇게 메소드 수행 시 특정 조건에 따라 메소드를 즉시 빠져나가고 싶은 경우 return 문을 이용하면 된다.
메소드 내에서 선언도니 변수의 효력 범위
class Test {
public void vartest(int a) {
a++;
}
public static void main(String[] args) {
int a = 1;
Test myTest = new Test();
myTest.vartest(a);
System.out.println(a);
}
}
프로그램을 실행시켜 보면 1이라는 결과 값이 나온다. 그 이유는 메소드 내에서 사용되는 변수는 메소드 안에서만 쓰여지는 변수이기 때문이다. 즉 public void vartest(int a) {라는 문장에서 입력 인수를 뜻하는 변수 a는 메소드 안에서만 쓰이는 변수이지 메소드 밖의 변수 a가 아니라는 말이다.
public int vartest(int a) {
a++;
return a;
}
public static void main(String[] args) {
int a = 1;
Test myTest = new Test();
a = myTest.vartest(a);
System.out.println(a);
}
해법은 위 예처럼 vartest메소드에 return문을 이용하는 방법이다. vartest 메소드는 입력으로 들어온 값을 1만큼 증가시켜 리턴한다. 따라서 a = myTest.vartest(a)처럼 하면 a의 값은 다시 vartest메소드의 리턴값으로 대입된다.
'java > 객체지향 프로그래밍' 카테고리의 다른 글
Generic 제너릭 (0) | 2019.07.19 |
---|---|
call by value (0) | 2019.07.10 |
자바 인터페이스(interface) (0) | 2019.04.16 |
자바 실제 객체 (0) | 2019.04.16 |
자바 상속과 다형성 (0) | 2019.04.16 |