java/객체지향 프로그래밍

자바 메소드(Method)

appmaster 2019. 7. 10. 10:32

보통 다른언어에는 함수라는 것이 별도로 존재한다. 하지만 자바는 클래스를 떠나 존재하는 것은 있을 수 없기 때문에 자바의 함수는 따로 존재하지 않고 클래스 내에 존재한다. 자바는 이 클래스 내의 함수를 메소드라고 부른다.

※ 보통 함수와 메소드가 공존하는 언어(예:파이썬)에서는 두 개를 구분하여 말하기도 하지만 자바는 보통 메소드와 함수를 구분하여 말하지 않는다. 다만 자바에서 사용되는 함수의 정확한 명칭은 메소드이다.

 

 

메소드를 사용하는 이유는?

가끔 프로그래밍을 하다 보면 똑같은 내용을 자신이 반복해서 적고 있는 것을 발견할 때가 있다. 이 떄가 바로 메소드가 필요한 떄이다. 여러번 반복해서 사용된다는 것은 언제고 또 다시 사용할 만한 가치가 있는 부분이라는 뜻이다. 즉, 이러한 경우 이것을 한 뭉치로 묶어서 "어떤 입력값을 주었을 떄 어떤 리턴값을 돌려준다" 라는 식의 메소드를 작성하는 것이 현명한 일이다.

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