인프런 커뮤니티 질문&답변

David님의 프로필 이미지
David

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

자바의 메소드 (Method), return, 전달 값(Parameter)가 갑자기 헷갈립니다...ㅎ

해결된 질문

작성

·

1.9K

·

수정됨

0

안녕하세요, 다름이 아니라 제가 메소드 (Method), 전달 값 (Parameter), return 개념을 공부하는 도중, 갑작스레 개념이 헷갈려서 이렇게 글을 남깁니다. 나도코딩 자바편에 나온 동영상 강의와 함께, 커뮤니티에도 등록된 글을 보면서 다시 한 번 복습을 하고 있는데요...ㅎ

String getAddress(){
    return "서울시 어딘가";
}

이제 전달 값, 그러니까 Parameter가 없는 메소드인 경우, 그냥 위와 같이 return으로 문장을 출력하는 반면에, 갑작스레 parameter와 return이 함께 있는 메소드가 헷갈리더라구요...ㅎ

(반환 타입) 메소드 이름 (전달값1, 전달값2, ...) 
{
      반환 값 선언 //  예시 : int result = 0
      
      // 메소드가 수행하는 여러 명령문들
      수행 동작 1; // 괄호 안의 전달 값들을 사용 및 동작 수행
      수행 동작 2; // 전달 값1, 2들을 이용하여 수행 2
      수행 동작 3; // 전달 값1, 2들을 이용하여 수행 3
      ...
      return 반환 값; // return result - 결과 값 반환
}
int add (int x, int y)
{
     int result = x + y; // 이미 int result = 0;을 내포함
     return result;
}

제가 위의 메소드들에서 이해 한 부분은 (혹시 몰라서 다른 예시도 들고 왔습니다..ㅎ), void를 제외한 나머지 자료형 타입 (String, int 등...)들은 return을 가지고, 이 때 return을 하는 것은 반환 값이 되는데, 여기서 return 반환 값은 이미 이전에 괄호 안의 전달 값들을 이용하여, 수행 동작들을 마친 다음 반환 값을 저장하는 과정으로 이해하는 게 맞을까요? 이렇게 메소드가 수행 된 다음엔, main 메소드에서 참조변수를 통해 수행되는 과정으로 최종 결과를 출력하는 거구요...ㅎ 이렇게 이해하는게 올바르게 이해 한 것일까요?

(반환 타입) variable = 메소드 이름();
System.out.println(variable);

System.out.println();을 쓰는게 일반적이진 않지만, (다른 메소드를 불러서 처리하거나, 아니면 메소드 안에 이미 print문이 저장되어 있을 수도 있기 때문에) 제 스스로 이해를 돕기 위해서 일련의 과정을 위에 나온 것처럼 제 나름대로 정리해봤습니다. 또한 프로그래밍 공부를 계속하면서, 객체 지향 프로그래밍언어(OOP)의 기초 부분에서 가끔 헷갈릴 때가 있는데 (평상시에는 잘 씀에도 불구하고,) 그 때 마다 좋은 답글을 남겨주셔서 감사합니다. 덕분에 어려운 Java 프로그래밍 공부 잘 헤쳐 나가고 있습니다 :) 다시 한 번 감사합니다 :)

답변 2

1

나도코딩님의 프로필 이미지
나도코딩
지식공유자

아, 이런 경우가 있을 것 같아요 😊
만약 파일에 어떤 내용을 쓰는 메소드가 있다고 가정해볼게요.

public boolean writeFile(String contents) {
    try {
       ... // 파일에 내용을 쓰는 작업
    } catch (Exception e) {
        return false; // 실패 시
    }
    return true; // 성공 시
}

이 메소드는 try 구문 내에서 파일에 어떤 내용을 쓰는 작업을 하는데 파일이 읽기 전용 상태이거나 하드의 용량이 가득 차서 더 이상 내용을 채우지 못한다거나 등의 예외 상황이 발생할 수 있습니다. 그래서 오류가 발생하게 되면 실패했다는 false 를, 정상적으로 내용을 쓰게 된다면 true 를 반환할 수 있겠죠. 이때는 전달값과 무관하게 메소드의 동작 성공 여부를 확인해서 이를 호출한 쪽에서는 실패 시 안내를 해주거나 다른 파일 경로에 새롭게 시도하거나 등의 대안을 고려해볼 수 있을 거에요.

if (writeFile("파일에 쓰세요") == true) {
    System.out.println("쓰기 성공");
} else {
    System.out.println("파일에 쓰는 중 문제가 발생하였습니다");
}

그리고 0, 1, 2 등의 값은 메소드 안의 내장된 값들이라기보다는 사전에 정의된 값이라고 보면 어떨까요? final 을 이용해서 클래스에 미리 이런 값들을 정의해둔 뒤에 그 값들을 반환해주는 것이죠. 아래 예시를 첨부합니다.

class FileUtil {
    public final int SUCCEED = 1; // 성공 시 반환 값
    public final int FAIL = 0; // 실패 시 반환 값
    public int writeFile(String contents) {
        try {
	    ... // 파일에 내용을 쓰는 작업
        } catch (Exception e) {
            return FAIL; // 실패 시
        }
        return SUCCEED; // 성공 시
    }
}

감사합니다 😊

1

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?
메소드에 대해 대체로 잘 이해하고 계십니다 😊 조금 첨언을 드릴게요.

질문 내용 중) return 반환 값은 이미 이전에 괄호 안의 전달 값들을 이용하여, 수행 동작들을 마친 다음 반환 값을 저장하는 과정으로 이해하는 게 맞을까요?

답변) return 반환 값은 반드시 전달 값들을 이용해야 하는 것은 아닙니다. 메소드 내에서 전달값들을 이용하여 적절한 작업을 한 뒤에 단순히 '성공' 또는 '실패' 를 뜻하는 값(true / false)이나 사전에 정의되어 있는 코드값(0, 1, 2 등)을 반환할 수도 있습니다. 그리고 반환 값을 '저장' 하는 것은 아니며 그냥 '반환'까지만 해주는 것이 메소드의 역할입니다. 이 값을 받아서 계속 사용할지 말지는 메소드를 호출하는 쪽에서 정할 일이며, 메소드에서는 그저 '반환'을 해주는 것까지라고 보시면 되겠습니다.
그리고 값을 반환하지 않는 메소드(void)인 경우에도 return 을 사용할 수는 있습니다. 다만 이때는 return 뒤에 아무런 값을 적지 않고 그냥 세미콜론으로 문장을 마칩니다.
가령 아래와 같이 testMethod() 메소드를 만들고 main() 메소드에서 호출했을 때 특정 조건을 만족하는 경우 return; 을 하게 될 수 있습니다. 그러면 그 즉시 메소드를 탈출하게 되며 이후의 문장은 실행되지 않습니다.

public static void main(String[] args) {
    testMethod(-1);
}

public static void testMethod(int value) {
    if (value == -1) {
        System.out.println("잘못된 입력값입니다.");
        return;
    }
    System.out.println("이 문장은 실행되지 않아요.");
}

실행 결과는 이렇습니다.

잘못된 입력값입니다.

계속해서 질문을 너무 잘해주고 계십니다 😉 이해가 되지 않으면 될 때까지 질문 남겨주세요.
감사합니다.

David님의 프로필 이미지
David
질문자

답변 감사합니다. 선생님...ㅎ 선생님께서 올려주신 답변 글은 대체적으로 다 이해를 했는데 몇 가지 세부적인거는 확실하게 하고 싶어서 다시 답글을 적게되네요...ㅎ 위에 답변에서 return 반환 값은 반드시 전달 값(Parameters)들을 이용하는 것이 아니라고 하셨는데, 이는 전달 값(Parameter)가 없는 경우에도 그냥 return문을 쓸 수 있으니까 그런건가요? 물론 쓸지 말지는 public static void main(String[] args) {...} 여기 이 안의 메인 메소드가 정하겠지만요..ㅎ 가령 게임 캐릭터를 예시로 이렇게 코드를 쓸 수 있는가요?:

boolean moves() {
   return true;
} // 전달 값이 없으며 항상 true로 반환함.
Actor mainMan = new Actor();
mainMan.moves(); // 이렇게 true로 반환하니까 항상 움직이는 걸로 간주

그리고 메소드 내에서 전달 값들을 이용하여 적절한 작업을 한 뒤에 단순히 '성공', '실패' (true, false) 아니면 사전에 정의되어 있는 코드 값들 (답변글에서는 int로 0, 1, 2)을 반환한다는 것은 메소드 안의 조건을 만족한다면 '메소드 안에 내장된 값들을 반환'하는 걸로 이해하면 괜찮을까요?

정말로 궁금했던 사항이라 답변 알림을 보자마자 바로 답글을 달았습니다. 그리고 결정적으로 어려운 프로그래밍 공부를 나도코딩 선생님이 하드캐리 해주신 부분도 있어서 자주 보게 되더라구요...ㅎ 항상 좋은 답변 감사합니다. : >

David님의 프로필 이미지
David

작성한 질문수

질문하기