[Java의 정석]Chapter6.객체지향 프로그래밍(20~22)

Hello_Wendy·2022년 4월 15일
0

자바의 정석

목록 보기
41/61
post-thumbnail

Chapter 6. 객체지향 프로그래밍

20. return문

  • return문 : 현재 실행중인 메서드를 종료하고 호출한 메서드로 되돌아감
  • 반환값이 있을 때만 return문을 썼지만, 원래는 반환값의 유무에 관계없이 모든 메서드에는 적어도 하나의 return문이 있어야 함
  • 하지만 반환타입이 void인 경우, return문 없이도 문제 없었던 이유는 컴파일러가 메서드의 마지막에 'return;'을 자동적으로 추가해주기때문
void printGugudan(int dan) {
	for(ont i = 1; i <= 9; i++) {
    	System.out.printf("%d * %d = %d%n", dan, i, dan*i);
    }
    return; // 반환타입이 void이므로 생략가능. 컴파일러가 자동추가
}
  • 반환타입이 void가 아닌 경우, 즉 반환값이 있는 경우, 반드시 return문이 있어야 함. 없을 시 컴파일 에러(error: missing return statement)발생
int multiply(int x, int y) {
	int result = x * y;
    
    return result; //반환타입이 void가 아니므로 생략불가
}

🍹 ex) 두 값 중에서 큰 값을 반환하는 메서드

  • 이 메서드의 리턴타입이 int이고 int타입의 값을 반환하는 return문이 있지만, return문이 없다는 에러 발생
  • 왜냐하면 if문 조건식의 결과에 따라 return문이 실행되지 않을 수도 있기 때문
  • 이 경우 if문의 else블럭에 return문을 추가해서, 항상 결과값이 반환되도록 해야함
int max(int a, int b) {
	if(a > b)
    	return a; //조건식이 참일 때만 실행. return문 실행되지 않을 수 있음
}

▶결과값 반환되도록 수정(else블럭에 return문 추가)

int max(int a, int b) {
	if(a > b)
    	return a; //조건식이 참일 때 실행
    else
    	return b; //조건식이 거짓일 때 실행
}

21. 반환값

  • return문의 반환값으로 주로 변수가 오긴 하지만 항상 그런것은 아님
int add(int x, int y) {
	int result = x + y;
    return result;
}

▶ 아래의 코드로 간단히 작성 가능

int add(int x, int y) {
	return x + y;
}return문의 반환값으로 'x+y'라는 수식이 적혀 있지만, 
수식이 반환되는 것은 아니고, 수식을 게산한 결과가 반환됨

🍤 예를들어 메서드 diff와 메서드 abs 사용

int diff(int x, int y) {
	int result = abs(x-y);
    	return result;
}

▶수정
int diff(int x, int y) {
	return abs(x-y);
}

:diff메서드는 두 개의 정수를 받아 그 차이를 절대값으로 반환함. 
아래의 코드 역시 메서드를 반환하는 것이 아니라
메서드 abs를 호출하고, 그 결과를 받아서 반환.
메서드 abs의 반환타입이 메서드 diff의 반환타입과 일치하기 때문에 가능

🍣 간단한 메서드의 경우 조건연산자 사용

int abs(int x) {
	if(x>=0) {
    	return x;
    } else {
    	return -x;
    }
}if문 없이 조건연산자 사용하여 수정

int abs(int x) {
	return x>=0 ? x : -x;
}
:메서드 abs는 입력받은 정수의 부호를 판단해서 음수일 경우 
부호연산자(-)를 사용해서 양수로 반환

22. 호출스택(call stack)

  • 호출스택 : 메서드의 작업에 필요한 메모리 공간을 제공
  • 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당
  • 할당된 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간 결과 등을 저장하는데 사용
  • 메서드가 작업을 마치면 할당되었던 메모리 공간은 반환되어 비워짐

🥑 호출스택의 특징

  • 호출스택을 조사해보면 메서드 간의 호출 관계와 현재 수행중인 메서드가 어느 것인지 알 수 있음
  • 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받음
  • 메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거 됨
  • 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드
  • 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드
  • 반환타입(return type)이 있는 메서드는 종료되면서 결과값을 자신을 호출한 메서드(caller)에게 반환
  • 대기상태에 있던 호출한 메서드(caller)는 넘겨받은 반환값으로 수행을 계속 진행
profile
안녕 나의 새로운 세상

0개의 댓글