CodeGym /Java Blog /무작위의 /자바 반환 키워드
John Squirrels
레벨 41
San Francisco

자바 반환 키워드

무작위의 그룹에 게시되었습니다
아시다시피 Java 언어는 객체 지향 프로그래밍 언어입니다. 즉, 기본 개념, 즉 기초의 기초는 모든 것이 객체라는 것입니다. 개체는 클래스를 사용하여 설명됩니다. 차례로 클래스는 상태와 동작을 정의합니다. 예를 들어, 은행 계좌는 계좌에 있는 금액의 형태로 상태를 가질 수 있으며 계좌 잔고를 늘리거나 줄이는 동작을 가질 수 있습니다. Java에서 동작은 메서드를 통해 구현됩니다. 메소드를 정의하는 방법을 배우는 것은 Java 학습의 맨 처음에 옵니다. 예를 들어 Oracle의 공식 자습서에서 " 메서드 정의 " 라는 제목 아래에 있습니다 . 여기서 주목해야 할 두 가지 중요한 사항이 있습니다.
  • 각 메서드에는 서명이 있습니다. 서명은 메소드 이름과 해당 입력 매개변수로 구성됩니다.
  • 메서드에 대해 반환 유형을 지정해야 합니다. 메서드 선언에서 메서드의 반환 유형을 선언합니다.
반환 유형은 메서드 서명의 일부가 아닙니다. 다시 말하지만 이것은 Java가 강력한 유형의 언어이고 컴파일러가 어떤 유형이 어디에서 사용되는지 사전에 가능한 한 많이 알고 싶어한다는 사실의 결과입니다. 다시 말하지만 이것은 실수로부터 우리를 구하기 위한 것입니다. 기본적으로 좋은 목적을 위한 것입니다. 그리고 이것은 다시 한번 우리에게 데이터를 다루는 문화를 심어주는 것 같습니다. 따라서 반환 값의 유형은 메서드에 대해 지정됩니다. 그리고 Java의 return 키워드는 실제로 반환을 수행하는 데 사용됩니다. Java 반환 키워드 - 1

자바에서 return은 무엇을 하는가

return 키워드는 여기 Oracle 자습서에 설명된 대로 제어 흐름 문 입니다 . 공식 튜토리얼의 " Returning a Value from a Method " 섹션 에서 값을 반환하는 방법에 대해 읽을 수도 있습니다 . 컴파일러는 메서드의 반환 값이 메서드의 지정된 반환 유형과 일치하는지 확인할 수 있는지 여부를 주의 깊게 추적합니다. Tutorialspoint의 온라인 IDE를 사용하여 예를 살펴보겠습니다. 원시 예제를 살펴보겠습니다.

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
보시다시피 프로그램의 진입점인 main 메서드가 여기에서 실행됩니다. 코드 라인은 위에서 아래로 실행됩니다. 우리의 주요 방법은 값을 반환할 수 없습니다. 거기에 값을 반환하려고 하면 "Error: Main method must return a value of type void" 오류가 발생합니다 . 따라서 메서드는 단순히 화면에 출력합니다. 이제 문자열 리터럴을 메시지 생성을 위한 별도의 메서드로 이동해 보겠습니다.

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println(getHelloMessage());
    }
    
    public static String getHelloMessage() {
        return "Hello World";
    }
    
}
보시다시피 return 키워드를 사용하여 반환 값을 표시한 다음 println 메서드에 전달했습니다. getHelloMessage 메소드 의 선언은 메소드가 String 을 리턴함을 나타냅니다 . 이를 통해 컴파일러는 메서드의 작업이 선언된 방식과 일치하는지 확인할 수 있습니다. 당연히 메서드 선언에 지정된 반환 유형은 코드에서 실제로 반환된 값의 유형보다 더 광범위할 수 있습니다. 즉, 중요한 것은 유형 변환이 가능하다는 것입니다. 그렇지 않으면 컴파일 시 "Error: incompatible types" 오류가 발생합니다 . 그건 그렇고, 당신은 아마도 질문이 있을 것입니다: 반품이 왜제어 흐름 설명으로 간주됩니까? 프로그램의 정상적인 하향식 흐름을 방해할 수 있기 때문입니다. 예:

public class HelloWorld {

    public static void main(String[] args) {
        if (args.length == 0) {
            return;
        }
        for (String arg : args) {
            System.out.println(arg);
        }
    }
    
}
예제에서 알 수 있듯이 Java 프로그램에서 인수 없이 호출되는 경우 main 메서드를 중단합니다. return 문 뒤에 코드가 있으면 액세스할 수 없다는 점을 기억하는 것이 중요합니다. 우리의 똑똑한 컴파일러는 그것을 알아채고 당신이 그러한 프로그램을 실행하는 것을 막을 것입니다. 예를 들어 다음 코드는 컴파일되지 않습니다.

public static void main(String[] args) {
        System.out.println("1");
        return;
// we use output method after return statement, which is incorrect 
        System.out.println("2");
 }
이 문제를 해결하기 위한 더러운 해킹이 하나 있습니다. 예를 들어, 디버깅 목적 또는 다른 이유로. 위의 코드는 return 문을 if 블록 으로 래핑하여 수정할 수 있습니다 .

if (2==2) {
    return;
}

오류 처리 중 반환 문

매우 까다로운 다른 것이 있습니다. 오류 처리와 함께 return을 사용할 수 있습니다. catch 블록 에서 return 문을 사용하는 것은 매우 나쁜 형식이므로 피해야 한다고 바로 말씀드리고 싶습니다 . 하지만 우리는 예가 필요합니다, 그렇죠? 여기있어:

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Value: " + getIntValue());
    }
    
    public static int getIntValue() {
        int value = 1;
        try {
            System.out.println("Something terrible happens");
            throw new Exception();
        } catch (Exception e) {
            System.out.println("Cached value: " + value);
            return value;
        } finally {
            value++;
            System.out.println("New value: " + value);
        }
    }
    
}
언뜻 보기에 2가 반환되어야 하는 것처럼 보입니다. finally 는 항상 실행되기 때문입니다. 하지만 아닙니다. 반환 값은 1이고 finally 블록의 변수에 대한 변경 사항은 무시됩니다. 또한 value 에 객체가 포함되어 있고 finally 블록 에서 value = null 이라고 가정합니다 . 그러면 null이 아닌 해당 개체가 catch 블록 에 반환됩니다 . 그러나 return 문은 finally 블록 에서 올바르게 작동합니다 . 분명히 동료들은 반품 진술과 관련된 작은 놀라움에 대해 감사하지 않을 것입니다.

무효 클래스

그리고 마지막으로. 작성할 수 있는 이상한 구조가 있습니다: void.class . 흠. 왜 그리고 무엇을 의미합니까? 이것이 매우 유용할 수 있는 Java Reflection API 와 관련된 다양한 프레임워크와 까다로운 사례가 실제로 있습니다 . 예를 들어 메서드가 반환하는 유형을 확인할 수 있습니다.

import java.lang.reflect.Method;

public class HelloWorld {

    public void getVoidValue() {
    }

    public static void main(String[] args) {
        for (Method method : HelloWorld.class.getDeclaredMethods()) {
            System.out.println(method.getReturnType() == void.class);
        }
    }
}
이는 메소드의 실제 코드를 대체해야 하는 테스트 프레임워크에서 유용할 수 있습니다. 그러나 이렇게 하려면 메서드가 어떻게 작동하는지(예: 반환하는 형식)를 이해해야 합니다. 위의 코드에서 main 메서드를 구현하는 두 번째 방법도 있습니다 .

public static void main(String[] args) {
        for (Method method : HelloWorld.class.getDeclaredMethods()) {
            System.out.println(method.getReturnType() == Void.TYPE);
        }
 }
스택 오버플로에서 둘 사이의 차이점에 대한 매우 흥미로운 토론을 읽을 수 있습니다. java.lang.Void와 void의 차이점은 무엇입니까?
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION