JavaRush /Java Blog /Random-KO /Java의 반환 문
Viacheslav
레벨 3

Java의 반환 문

Random-KO 그룹에 게시되었습니다

소개

아시다시피 Java는 객체지향 프로그래밍 언어입니다. 즉, 기본 개념이기 때문에 기본의 기본은 모든 것이 객체라는 것입니다. 객체는 클래스를 사용하여 설명됩니다. Java의 반환 문 - 1클래스에는 상태와 동작이 있습니다. 예를 들어, 은행 계좌는 계좌에 있는 금액의 형태로 상태를 가질 수 있으며, 잔액을 늘리고 줄이는 행위를 가질 수 있습니다. Java의 동작은 메소드를 사용하여 구현됩니다. 메소드를 설명하는 방법은 Java 학습 여정의 맨 처음에 소개됩니다. 예를 들어, Oracle의 공식 튜토리얼: “ Defining Methods ”. 여기에는 두 가지 중요한 측면이 있습니다.
  • 각 메서드에는 서명이 있습니다. 시그니처는 메소드 이름과 해당 입력 매개변수로 구성됩니다.
  • 메서드는 반환 유형을 지정해야 합니다.
  • 반환 유형은 메서드 서명의 일부가 아닙니다.
다시 말하지만, 이는 Java가 강력한 유형의 언어이고 컴파일러가 가능한 한 어떤 유형이 사용되는지 미리 이해하고 싶어한다는 사실의 결과입니다. 다시 한 번 실수로부터 우리를 보호하기 위해. 일반적으로 모든 것이 유익합니다. 글쎄, 이것은 다시 한 번 우리에게 데이터를 처리하는 문화를 심어주는 것 같습니다. 따라서 메소드의 경우 값 유형이 지정됩니다. 그리고 메서드에서 이와 동일한 값을 반환하려면 키워드가 사용됩니다 return.

Java의 키워드 반환 문

명령문 키워드는 oracle 튜토리얼 " 제어 흐름 명령문 "에서 논의된 " 제어 흐름 명령문return " 을 참조합니다 . 공식 튜토리얼인 " 메서드에서 값 반환하기 " 에서 값을 반환하는 방법에 대해 읽을 수도 있습니다 . 컴파일러는 메서드에서 반환된 값이 메서드에서 지정한 반환 값 유형과 일치하는지 최선을 다해 주의 깊게 모니터링합니다. tutorialspoint의 Online IDE를 예로 들어보겠습니다. 원본 예를 살펴보겠습니다.
public class HelloWorld {
    public static void main(String []args) {
        System.out.println("Hello World");
    }
}
보시다시피, main프로그램의 진입점인 메소드가 여기에서 실행됩니다. 코드 줄은 위에서 아래로 실행됩니다. 우리의 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. 그건 그렇고, 아마도 즉시 질문이 생겼을 것입니다. 왜 return프로그램 흐름 제어 연산자에 적용됩니까? 하지만 이는 프로그램의 위에서 아래로의 정상적인 흐름을 방해할 수 있기 때문입니다. 예를 들어:
public class HelloWorld {

    public static void main(String []args){
        if (args.length == 0)  {
            return;
        }
        for (String arg : args)  {
            System.out.println(arg);
        }
    }

}
예제에서 볼 수 있듯이 mainJava 프로그램이 매개변수 없이 호출되면 메서드 실행이 중단됩니다. return해당 코드가 있으면 액세스할 수 없게 된다는 점을 기억하는 것이 중요합니다 . 그리고 우리의 똑똑한 컴파일러는 이것을 알아차리고 그러한 프로그램을 실행하는 것을 허용하지 않을 것입니다. 예를 들어 다음 코드는 컴파일되지 않습니다.
public static void main(String []args) {
        System.out.println("1");
        return;
        System.out.println("2");
 }
이 문제를 해결하는 더러운 해킹이 있습니다. 예를 들어, 디버깅 목적이나 다른 이유로. 위 코드는 블록 return으로 래핑하여 수정할 수 있습니다.if
if (2==2)  {
    return;
}

오류 처리 시 반환 문

매우 까다로운 상황이 하나 있습니다. 이를 return오류 처리와 함께 사용할 수 있습니다. return블록 에서 사용하는 것은 catch매우 나쁜 형태이므로 피해야 한다는 점을 바로 말씀드리고 싶습니다 . 하지만 예가 필요하죠? 그는 다음과 같습니다:
public class HelloWorld  {

    public static void main(String []args) {
        System.out.println("Value is: " + getIntValue());
    }

    public static int getIntValue()  {
        int value = 1;
        try {
            System.out.println("Something terrible happens");
            throw new Exception();
        } catch (Exception e) {
            System.out.println("Catched value: " + value);
            return value;
        } finally {
            value++;
            System.out.println("New value: " + value);
        }
    }

}
언뜻 보면 2가 finally항상 실행되기 때문에 반환되어야 하는 것처럼 보입니다. 그러나 아니요, 값은 1이 되며 변수의 변경 사항은 finally무시됩니다. 더욱이, 그것이 value객체를 포함하고 있고 우리가 finally말했다 면 value = null, 그것은 catch여전히 ​​객체에 대한 참조를 반환할 것입니다 null. 그러나 블록에서 finally운영자는 return올바르게 작동했을 것입니다. 동료들은 그러한 선물에 대해 분명히 감사하지 않을 것입니다.
그 밖에 읽을 내용:

반환 명세서

무효.클래스

그리고 마지막으로. 와 같은 이상한 구조를 작성할 수 있습니다 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);
        }
 }
둘 사이의 차이점에 대한 다소 흥미로운 토론은 stackoverflow에서 읽을 수 있습니다. java.lang.Void와 void의 차이점은 무엇입니까? #비아체슬라프
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION