아시다시피 Java 언어는 객체 지향 프로그래밍 언어입니다. 즉, 기본 개념, 즉 기초의 기초는 모든 것이 객체라는 것입니다. 개체는 클래스를 사용하여 설명됩니다. 차례로 클래스는 상태와 동작을 정의합니다. 예를 들어, 은행 계좌는 계좌에 있는 금액의 형태로 상태를 가질 수 있으며 계좌 잔고를 늘리거나 줄이는 동작을 가질 수 있습니다. Java에서 동작은 메서드를 통해 구현됩니다. 메소드를 정의하는 방법을 배우는 것은 Java 학습의 맨 처음에 옵니다. 예를 들어 Oracle의 공식 자습서에서 " 메서드 정의 " 라는 제목 아래에 있습니다 . 여기서 주목해야 할 두 가지 중요한 사항이 있습니다.
- 각 메서드에는 서명이 있습니다. 서명은 메소드 이름과 해당 입력 매개변수로 구성됩니다.
- 메서드에 대해 반환 유형을 지정해야 합니다. 메서드 선언에서 메서드의 반환 유형을 선언합니다.
자바에서 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의 차이점은 무엇입니까?
GO TO FULL VERSION