소개
아시다시피 Java는 객체지향 프로그래밍 언어입니다. 즉, 기본 개념이기 때문에 기본의 기본은 모든 것이 객체라는 것입니다. 객체는 클래스를 사용하여 설명됩니다.
클래스에는 상태와 동작이 있습니다. 예를 들어, 은행 계좌는 계좌에 있는 금액의 형태로 상태를 가질 수 있으며, 잔액을 늘리고 줄이는 행위를 가질 수 있습니다. 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);
}
}
}
예제에서 볼 수 있듯이
main
Java 프로그램이 매개변수 없이 호출되면 메서드 실행이 중단됩니다.
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의 차이점은 무엇입니까? #비아체슬라프
GO TO FULL VERSION