티스토리 뷰
# retrun문 , 반환값
retrun문은 실행 중인 메서드를 종료하고 호출한 곳으로 되돌아가는 것이다.
void printGugudan(int dan) {
if(!(2 <= dan && dan <= 9)){
return;
}
for(int i = 1; i <=9; i++) {
System.out.printf("%d * %d = %d%n", dan, i ,dan*i);
}
// return; //반환 타입: void - 생략가능 , 컴파일러가 자동으로 추가해줌
반환값의 유무에 관계없이 모든 메서드에는 적어도 하나의 return문이 필요하지만 반환 타입이 void인 경우에는 생략이 가능하다. 그 이유는 컴파일러가 자동적으로 'return;' 자동적으로 추가하기 때문이다.
long max(long a, long b){
if(a>b)
return a; //조건식이 참일 때 실행
else
return b; //조건식이 거짓알 때 실행
그러나 반환타입이 void가 아닌 경우에는 반드시 return문이 있어야 한다.
반환 타입이 void가 아니라는 것은 메서드가 작업한 결과를 반환한다는 것이기에 return문이 필요하다.
그리고 조건식을 쓰는 경우는 참과 거짓에 따른 return문을 작성해야 하며, 반환 값은 반환 타입과 같고 자동 형변환이 되어야 한다.
# 호출 스택
호출 스택은 메서드 수행에 필요한 메모리가 되는 공간이다.
메서드가 호출되면 수행에 필요한 만큼 메모리를 스택에 할당받고, 수행을 마치고 나면 사용했던 메모리를 반환하고 스택에서 제거된다.
*스택(stack) : 밑이 막힌 상자로 차곡차곡 쌓이며 윗부분부터 차례대로 수행된다.
호출 스택의 특징
- 메서드가 호출되면 수행에 필요한 만큼의 메모리 스택을 할당받는다.
- 메서드가 수행을 마치고 나면 사용했던 메모리를 반환하고 스택에서 제거된다.
- 맨 위의 메서드 하나만 실행 중이고, 나머지는 대기 중이다.
- 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.
class Ex{
public static void main(String[] args) {
System.out.println("Hello");
}
}
코드의 진행과정을 설명한 것이 위의 그림이다. 실행 순서는 왼쪽에서 오른쪽으로 진행된다.
1. 코드를 실행하면 JVM에 의해서 main메서드가 호출되어 프로그램이 시작된다.
이때, 호출 스택에는 main메서드를 위한 메모리 공간이 할당된다.
2. main메서드에서 println()을 호출한 상태이다. 이때 main메서드는 대기 상태이고, println()의 수행이 시작된다.
pirntln메서드에 의해 'Hello'가 화면에 출력된다.
수행을 완료한 println메서드는 스택 호출에서 사라지고, main메서드로 돌아간다.
3. 대기 중이었던 main메서드는 println메서드 호출 이후로 실행을 재개한다.
main메서드에 더 이상 수행할 코드가 없음으로 종료가 되며, 호출 스택 또한 완전히 비워지게 되어 프로그램은 종료된다.
# 기본형 매개변수
기본형 매개변수는 변수의 값을 읽기만 할 수 있다. 따라서 변경이 불가능하고, 메서드의 매개타입이 기본형이다.
예제 ) 기본형 매개변수
class Data {int x;}
public class Ex6_6 {
public static void main(String[] args) {
Data d = new Data();
d.x = 10;
System.out.println("main() : x = " + d.x);
change(d.x);
System.out.println("After change(d.x)");
System.out.println("main() : x = " + d.x);
}
static void change(int x) { //기본형 매개변수
x = 1000;
System.out.println("chage() : x = " + x);
}
}
위의 코드의 실행 순서를 순서대로 살펴보자.
호출 스택에 main메서드를 위한 메모리 공간이 생기고, 그 안에 참조 변수 d가 먼저 생성된 후, new Data();를 통해 '객체 int x'가 생성된다.
'd.x = 10;' 이 문장은 d가 가리키는 '객체 x'에 10을 저장하라는 뜻으로 다음 문장에서 println메서드가 x값으로 10을 출력한 다.
'change(d.x);'로 change메서드를 호출한다. d.x값에는 10이라는 값이 저장되어 있고, 그 값이 매개변수 x값에 저장된다.
다음 문장인 'x = 1000;'로 x에 1000이 저장되고, 다음 문장에서 println()에서 x값이 1000으로 출력된다.
chage메서드의 수행이 완료되면 메서드를 호출한 곳으로 돌아가 다음 문장 수행하면 된다.
출력문 두 번째 'println("main() : x = " + d.x);'의 x의 값이 10인 이유는, change메서드의 매개변수가 기본형이라 변경이 불가하기 때문이다. 또한 change메서드의 'x'는 지역 함수로 d.x와 x는 전혀 다른 공간을 가지며, x라는 값만 복사한 것이지 객체의 주소를 복사한 것은 아니다.
* 출력 결과
main() : x = 10
chage() : x = 1000
After change(d.x)
main() : x = 10
# 참조형 매개변수
참조형 매개변수는 변수의 값을 읽고 변경할 수 있으며, 메서드가 참조 변수를 통해 객체의 주소를 복사하면 메서드에서 참조변수를 이용하여 복사한 객체를 다룰 수(읽고, 쓰기) 있다.
예제 ) 참조형 매개변수
class Data2 {int x;}
public class Ex6_7 {
public static void main(String[] args) {
Data2 d = new Data2();
d.x = 10;
System.out.println("main() : x = " + d.x);
change(d);
System.out.println("After change(d)");
System.out.println("main(): x = " + d.x);
}
static void change(Data2 d) {//참조형 매개변수
d.x = 1000;
System.out.println("change() : x = " + d.x);
}
}
기본형 매개변수와 다른 점을 비교해 보면서 살펴보자.
chage메서드를 호출하면 'Data2 d'에 cahnge(d)의 참조 변수가 복사된다.
즉, main 함수에 있는 d가 chage메서드에 있는 참조변수 d에 객체의 주소가 복사되는 것을 뜻한다.
객체 주소가 복사되면 메서드는 참조 변수를 이용하여 복사한 객체를 변경할 수 있다.
다음 문장인 'd.x = 1000;'에서 x의 값에 1000이 저장되고, println메서드에서 그 값을 출력한 후 change메서드를 호출한 곳으로 되돌아간다.
main메서드에 있는 마지막 수행 문장인 "main(): x = " + d.x"에서 '출력 값 1000'이 나오는 것은 메서드가 참조 변수를 통해서 객체의 주소를 넘겨줬기 때문이다.
'개발 공부 > JAVA' 카테고리의 다른 글
[Java] 오버로딩(overloading) (0) | 2022.02.17 |
---|---|
[Java] static 메서드와 인스턴스 메서드 (0) | 2022.02.17 |
[Java] 선언 위치에 따른 변수 종류, 메서드 호출 및 실행 (0) | 2022.02.03 |
[Java] 객체지향언어, 객체, 클래스, 인스턴스 (0) | 2022.01.24 |
[Java] 2차원 배열의 선언, 인덱스, 초기화 (0) | 2022.01.17 |
- Total
- Today
- Yesterday
- string 배열
- 객체 배열
- 메서드 간의 호출과 참조
- 생활코딩
- 호출스택
- 두 수의 나눗셈
- 코테
- Lv.0
- Java
- 자바의 정석
- 매개변수가 있는 생성자
- JAVA 의 정석
- 조건문 if
- 2차배열 예제
- JAVA의 정석
- 기본형/참조형 매개변수
- java의 정석기초
- 객체지향
- 프로그래머스
- java의정석 기초
- 인스턴스 메서드
- return문
- 기본 생성자
- 객체의 구성요소
- do-while문
- SQL
- 클래스와 객체
- MySQL
- 객체지향 언어
- 프로글개머스 `
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |