return문
- 실행 중인 메스드를 종료하고 호출한 곳으로 되돌아간다.
- 반환 타입이 void라면 생략 가능하다.
package com.seulgae.ch06;
public class printGugudan {
void printGugudan(int dan) {
if(!(2 <= dan && dan <= 9))
return; //dan의 값이 2~9가 아닌경우, 호출한 곳으로 그냥 되돌아간다.
for(int i=1; i<=9; i++) {
System.out.printf("%d*%d=%d%n", dan, i, dan*i);
}
return; // 반환 타입이 void이므로 생략가능. 컴파일러가 자동추가
}
public static void main(String[] args) {
printGugudan dan = new printGugudan();
dan.printGugudan(3);
}
}
- 반환타입이 void가 아닌 경우, 반드시 return문 필요
- if 문 사용시 return문이 참 값이 아닐 경우 반환할 return값이 없어 에러가 발생하는 경우가 있다. 조심하자 ~
int multiply(int x, int y) {
max(x, y);
int result = x * y;
return result; // 반환 타입이 void가 아니므로 생략불가
}
int max(int a, int b) {
if(a > b)
return a; // 조건식이 참일 때만 실행된다.
else // 에러발생!! return문이 없음.
return b; // if문이 참이 아닐때가 있어서 else도 넣어줘야 된다.
}
반환값
- 메서드의 반환타입이 void가 아닐 때 return문 옆에 반환값을 써준다.
- 그리고 반환 타입이 일치하거나, 자동 형변환이 가능한 값이여야 한다.
호출 스택(call stack)
스택(stack) : 밑이 막힌 상자. 위에 차곡차곡 쌓인다.
- FILO(First In, Last Out 선입 후출) 구조
- 메서드 수행에 필요한 메모리가 제공되는 공간
- 메서드가 호출되면 호출스택에 메모리 할당, 종료되면 해제
package com.seulgae.ch06;
public class stackPrint {
public static void main(String[] args) {
System.out.println("stack 공부중");
}
}
기본형 매개변수
🞂 기본형 매개변수 - 변수의 값을 읽기만 할 수 있다.(read only)
복습시. stack 그림 그리면서 이해하자.
package com.seulgae.ch06;
class Data { int x;}
public class PrimitiveParamEx {
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("change() : x = " + x);
}
}
참조형 매개변수
🞂 참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다.(read & write)
- change 메서드한테 참조형 매개변수를 통해서 객체의 주소를 전달해주면 읽기 쓰기 쌉가능!!
복습시. stack 그림 그리면서 이해하자.
package com.seulgae.ch06;
class Data2 { int x;}
public class ReferenceParamEx {
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);
}
}
참조형 반환타입
복습시. stack 그림 그리면서 이해하자.
package com.seulgae.ch06;
public class ReferenceReturnEx {
public static void main(String[] args) {
Data d = new Data();
d.x = 10;
Data d2 = copy(d);
System.out.println("d.x ="+d.x);
System.out.println("d2.x ="+d2.x);
}
static Data copy(Data d) {
Data tmp = new Data(); // 새로운 객체 tmp를 생성한다.
tmp.x = d.x; // d.x의 값을 tmp.x에 복사한다.
return tmp; // 복사한 객체의 주소를 반환한다.
}
}
static 메서드와 인스턴스 메서드
static 메서드란?
- 메서드 앞에 static 이 붙어 있는 것
🞂 인스턴스 메서드
- 인스턴스 생성 후, '참조변수.메서드이름()'으로 호출
- 인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수(iv) 사용가능
🞂 static 메서드(클래스메서드)
- 객체생성없이 '클래스이름.메서드이름()'으로 호출
- 인스턴스 멤버(iv, im)와 관련없는 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수(iv) 사용불가
package com.seulgae.ch06;
class MyMath5{
long a, b; //iv
// 1. 그래서 iv와 im을 사용하기 위해서
long add() { //인스턴스 메서드
return a + b;
}
static long add(long a, long b) { // 클래스 메서드(static메서드)
return a + b;
}
}
public class staticInstance {
public static void main(String[] args) {
System.out.println(MyMath5.add(3, 5)); // static 메서드 객체 생성없이 사용가능
// static 메서드를 언제 쓴다고? iv를 사용하지 않을때
MyMath5 obj = new MyMath5();
//2. 객체를 생성한다.
obj.a = 100L;
obj.b = 200L;
//3. 주소가 가르키는 곳에 값을 넣고
System.out.println(obj.add()); //4. 인스턴스메서드 호출
}
}
개발자라면 static을 언제 사용하고 사용하지 말아야되는지 구분할 수 있어야 된다.
참고.
Q. 객체가 무엇인가?
A. 인스턴스 변수(iv)의 묶음입니다.
A. 변수 묶어놓은거.
Q. 인스턴스 변수(iv)가 무엇인가?
A. 변수 묶어 놓은거.
Q. 인스턴스 메서드를 호출하려면 왜 객체가 필요한가?
A. 인스턴스 변수(iv)로 작업해야되기 때문이다.
static을 언제 붙여야 할까?
🞂 속성(멤버 변수) 중에서 공통 속성에 static을 붙인다.
🞂 인스턴스 멤버(iv, im)을 사용하지 않는 메서드에 static을 붙인다.
class MyMath5{
long a, b; //iv
long add() { //인스턴스 메서드
return a + b;
}
static long add(long a, long b) { // 클래스 메서드(static메서드)
return a + b;
}
}
메서드 간의 호출과 참조
🞂 static 메서드는 인스턴스 변수(iv)를 사용할 수 없다.
class TestClass2{
int iv; //인스턴스 변수
static int cv; // 클래스 변수
void instanceMethod() { // 인스턴스 메서드
System.out.println(iv); // 인스턴스 변수를 사용할 수 있다.
System.out.println(cv); // 클래스 변수를 사용할 수 있다.
}
static void staticMethod() {
System.out.println(iv); //에러 !! 인스턴스 변수를 사용할 수 없다.
//Cannot make a static reference to the non-static field iv
System.out.println(cv); // 클래스 변수는 사용할 수 있다.
}
}
🞂 static 메서드는 인스턴스 메서드(im)를 호출할 수 없다.
class TestClass{
void instanceMethod() {} // 인스턴스 메서드
static void staticMethod() {} // static 메서드
void instanceMethod2() { // 인스턴스 메서드
instanceMethod(); // 다른 인스턴스 메서드를 호출한다.
staticMethod(); // static 메서드를 호출한다.
}
static void staticMethod2() {
instanceMethod(); // 에러!! 인스턴스메서드를 호출할 수 없다.
// Cannot make a static reference to the non-static method instanceMethod() from the type TestClass
staticMethod(); // static 메서드는 호출할 수 있다.
}
}
참고.
Q. static 메서드는 static 메서드 호출가능?
A. 쌉가능
Q. static 메서드는 인스턴스 변수 사용가능?
A. 절대 안되지, 객체 생성하면 쌉가능
Q. static 메서드는 인스턴스 메서드 호출가능?
A. 안되지, 인스턴스 메서드는 인스턴스 변수를 사용해서 작업하니깐
Q. 왜? static 메서드는 인스턴스 멤버를 쓸 수 없나요?
A. static 멤버 호출 시 객체(iv묶음)가 없을 수도 있어서
'Study > Java' 카테고리의 다른 글
객체지향 프로그래밍 7장(20강 ~ 24강) (0) | 2022.06.06 |
---|---|
객체지향 프로그래밍 6장(16강 ~ 19강) (0) | 2022.06.03 |
객체지향 프로그래밍 6장(6강 ~ 10강) (0) | 2022.06.02 |
객체지향 프로그래밍 6장(1강 ~ 5강) (0) | 2022.06.02 |
Java18_멀티스레드 (0) | 2022.05.14 |