본문 바로가기

JAVA/혼자공부하는자바

[JAVA] 메소드(Method), 리턴(return)

728x90

다른 언어에서는 함수가 별도로 존재하지만 자바는 클래스 내 함수가 존재한다.

자바는 이 클래스 내 함수를 메소드라고 부른다.

 

*파이썬은 함수와 메소드가 공존하여 두 개를 구분하지만 자바는 메소드만을 사용함

 

 

wikidocs.net/225

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 


메소드란

public int sum(int a, int b) {
	return a+b;
}

sum메소드는 입력값으로 두개의 값(int 자료형 a, b)을 받아 리턴 값은 두 개의 입력 값을 더한 값(int 자료형)이다.

 

여기서 return은 메소드의 결과 값을 돌려주는 명령어이다.

 

 

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 리턴값; // 리턴자료형이 void인 경우 return 문 필요 없음
}

자바의 메소드 구조이다.

 

메소드는 입출력 유무에 따라 4가지로 나눌 수 있다.

 

 

1.평범한 메소드

public int sum(int a, int b) {
    return a+b;
}

입력 값과 리턴 값이 있는 평범한 메소드이다.

 

  • 입력 값 - int 자료형 a, int 자료형 b
  • 리턴 값 - int 자료형

sum 메소드는 두 개의 입력 값을 받아서 서로 더한 결과 값을 돌려주는 메소드이다.

 

 

리턴값을 받을 변수 = 객체.메소드명(입력인수1, 입력인수2, ...

만든 메소드를 사용하는 방법이다.

 

Test myTest = new Test();
int c = myTest.sum(a, b);

실제코드는 위와 같을 것이다.

 

위에서 보듯이 myTest.sum(a, b) 호출 후 리턴 값을 저장하는 c의 자료형은 int로 해야한다.

sum의 리턴 타입이 int로 되어 있기 때문에.

sum 메소드 리턴 타입은 public int sum(int a, int b) { ... 에서 보듯이 메소드명(sum) 바로 좌측에 표기되어 있다.

 

 

2. 입력값이 없는 메소드

 

public STring say() {
	return "Hi";
}

say 메소드의 입출력 자료형은 다음과 같다.

 

  • 입력 값 - 없음
  • 리턴 값 - String 자료형

say라는 이름의 메소드를 만들었다. 하지만 입력 인수부분을 나타내는 괄호 안이 비어있다.

 

 

Test myTset = new Test();
String a = myTest.say();
System.out.println(a);

이 메소드는 위와 같이 쓸 수 있다.

 

say()처럼 괄호 안에 아무런 값도 넣어주지 않고 써야한다.

위의 메소드는 입력값은 없지만 리턴값으로 'Hi'라는 문자열을 돌려준다.

 

 

 

리턴값이 없는 메소드

 

public void sum(int a, int b) {
	System.out.println(a+"과 "+b+"의 합은 " +(a+b)+ "입니다.");
}

위 sum 메소드 자료형은 다음과 같다.

 

  • 입력 값 - int 자료형 a, int 자료형 b
  • 리턴 값 - void (없음)

리턴 값이 없는 메소드는 명시적으로 리턴 타입 부분에 void라고 표시한다.

 

Test myTest = new Test();
myTest.sum(3, 4);
객체.메소드명(입력인수1, 입력인수2, ...)

즉 위와 같이 사용한다.

 

위 메소드를 호출하면 다음과 같이 출력된다.

3과 4의 합은 7입니다.

'3과 4의 합은 7입니다' 라는 문장은 리턴되어 호출된 값이 아니라

System.out.println으로 사용되는 문장이기 때문에 돌려주는 값은 없다.

 

 

 

입력값도 리턴값도 없는 메소드

 

 

public void say() {
	System.out.println("Hi");
}

위 say 메소드의 입출력 자료형은 다음과 같다.

  • 입력 값 - 없음
  • 리턴 값 - void (없음)

이를 호출하는 방법은 위 방법 단 한가지이다.

Test myTest = new Test();
myTest.say();

즉, 입력값도 리턴값도 없는 메소드는 다음과 같이 사용된다.

객체.메소드명()

 

 


return의 또 다른 쓰임새

특별한 경우 return을 단독으로 사용하여 메소드를 즉시 빠져나갈 수 있다.

 

public void say_nick(String nick) {
	if ("fool".equals(nick)) {
    	return;
    }
    System.out.println("나의 별명은 " +nick+" 입니다.");
}

위 메소드는 nick이라는 변수를 받아 문자열을 출력하는 메소드이다.

이 때 입력값으로 fool이라는 값이 들어오면 문자열을 출력하지 않고 메소드를 빠져나간다.

이 방법은 실제 프로그래밍에서 자주 쓰인다.

 

(return문으로 메소드를 빠져나가는 방법은 리턴 자료형이 void형인 메소드에서만 사용할 수 있다.)

 

 


메소드 내에서 선언된 변수의 효력 범위

메소드 안에서 사용하는 변수를 메소드 밖에서 사용한 이름과 동일하게 사용한다면 어떻게 될지 확인해보자.

 

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);
    }
}

vartest 메소드는 입력 값을 1만큼 증가시키는 기능이 있다.

 

main메소드에서 a라는 int 자료형의 변수를 생성하고 1을 대입했다.

그리고 vartest 메소드를 입력 값으로 변수 a를 주어 호출했다.

그 다음에 a의 값을 출력하게 했다.

vartest 메소드에서 a의 값을 1을 증가시켰으니 2가 출력되어야겠지만

위 프로그램을 실행시키면 1이라는 결과 값이 나온다.

 

그 이유는 메소드 내에서 사용되는 변수는 메소드 안에서만 쓰여지는 변수이기 때문이다.

 

즉 메소드 내에서 사용되는 변수는 메소드 밖 변수들과는 전혀 상관 없다. 그래서 메소드 내의 변수를

로컬 변수(local variable)라고도 말한다.

 

※ 만약 vartest의 입력값이 int 자료형이 아닌 객체였다면 얘기가 다르다. 객체를 메소드의 입력으로 넘기고 메소드가 객체의 속성값(객체변수 값)을 변경한다면 메소드 수행 이후에도 객체는 변경된 속성값을 유지한다. 이러한 차이가 나는 이유는 메소드에 전달하는 입력 자료형의 형태 때문인데 메소드에 값을 전달하느냐 아니면 객체를 전달하느냐에 따라 차이가 난다.

 

var 메소드를 이용해 메소드 외부의 a를 1 증가 시키기 위한 방법은 다음과 같다.

 

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메소드의 리턴 값으로 대입된다. (1만큼 증가된 값으로 a의 값이 변경된다.)

 

 

 

 

객체를 속성값을 변경하는 방법에 대해 알아보자.

 

public class Test {

    int a;  // 객체변수 a

    public void vartest(Test test) {
        test.a++;
    }

    public static void main(String[] args) {
        Test myTest = new Test();
        myTest.a = 1;
        myTest.vartest(myTest);
        System.out.println(myTest.a);
    }
}

 

int a; // 객체변수 a

이전에는 a 변수를 main 메소드에 선언했지만 이번엔 Test클래스에 선언하여 객체변수로 만들었다.

 

public void vartest(Test test) {
	test.a++;
}

vartest 메소드는 다음과 같이 Test 클래스의 객체를 입력받아 해당 객체의 객체변수 a의 값을 1 증가시키도록 했다.

 

myTest.vartest(myTest);

main메소드에서는 vartest메소드에 1이라는 값을 전달하던것을 Test클래스의 myTest객체를 넘기도록 했다.

 

이렇게 수정하고 실행시키면 myTest객체의 객체변수 a값이 1이였지만 vartest메소드 실행 후 2가 출력되는 것을 확인할 수 있다.

 

여기서 주목해야 하는 부분은 vartest메소드의 입력 파라미터가 값이 아닌 Test클래스의 객체라는데 있다.

이렇게 메소드가 객체를 전달 받으면 메소드 내 객체는 전달받은 객체 그 자체로 수행된다.

따라서 입력으로 전달받은 myTest 객체의 객체변수 a의 값이 증가하게 되는 것이다.

 

public class Test {

    int a;  // 객체변수 a

    public void vartest() {
        this.a++;
    }

    public static void main(String[] args) {
        Test myTest = new Test();
        myTest.a = 1;
        myTest.vartest();
        System.out.println(myTest.a);
    }
}

vartest의 입력 파라미터에 test 입력변수를 만들필요 없이

this 키워드를 사용하여 객체에 접근하여 사용할 수도 있다.