열심히 끝까지
Java1 day05 보충 본문
2-6 ) 클래스메소드 ( static method )와 인스턴스 메소드
- 인스턴스 메소드는 인스턴스 변수와 관련된 작업을 하는,
즉 메소드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메소드
- 인스턴스와 관련없는 ( 인스턴스 변수나 인스턴스 메소드를 사용하지 않는) 메소드는
클래스 메소드로 정의
① 클래스를 설계할 때 멤버변수 중 모든 인스턴스가 공통으로 사용하는 것에 static을 붙힘
- 생성된 각 인스턴스는 서로 독립적이기 때문에 각 인스턴스의 변수는 서로 다른 값을 유지
- 그러나 모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 static을 붙여서
클래스 변수로 정의
② 클래스 변수(static)는 인스턴스를 생성하지 않아도 사용할 수 있음.
- static이 붙은 변수는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문
③ 클래스 메소드는 인스턴스 변수를 사용할 수 없음
- 인스턴스 변수는 인스턴스가 반드시 존재해야만 사용할 수 있는데
클래스 메소드는 인스턴스 생성 없이 호출 가능하므로
클래스 메소드가 호출되었을 때 인스턴스가 존재하지 않을 수도 있음
- 반면에 인스턴스 변수나 인스턴스 메소드에서 static이 붙은 멤버들을 사용 가능
- 인스턴스 변수가 존재한다는 것은 static 변수가 이미 메모리에 존재한다는 것을
의미하기 때문
④ 메소드 내에서 인스턴스 변수를 사용하지 않는다면 메소드에 static을 붙이는 것을 고려
- 메소드 작업 내용중에서 인스턴스 변수를 필요로 한다면 static을 붙일 수 있음.
- 허나 인스턴스 변수를 필요로 하지 않는다면 static을 붙이는 것을 고려
package example02;
public class MemberCallTest {
int iv = 10; // 인스턴스변수
static int cv = 20; // 클래스변수
// static int cv2 = iv; // 에러
/*
* 클래스 변수는 인스턴스 변수를 사용할 수 없다.
* 왜why? 클래스변수가 메모리에 올라갈 때 인스턴스 변수는 생성이 안되어 있을 수도 있다.
* 즉, 만들어지지도 않은 애를 어떻게 변수로 올리는가?
*/
static int cv2 = new MemberCallTest().iv;
// iv를 보기 위해서 MemberCallTest를 열어주고 iv를 가져온다.
int iv2 = cv;
/*
* 인스턴스변수는 클래스변수를 사용할 수 있다.
* 왜why? 인스턴스변수가 메모리에 올라갈 때는 이미 클래스변수는 메모리에 올라가 있기 때문에
*/
static void staticMethod() { // 클래스 메소드
int number = 10; // 지역변수
System.out.println("cv : " + cv);
// System.out.println("iv : " + iv);
// 클래스 메소드에서 인스턴스 변수를 사용할 수 없다.
MemberCallTest c = new MemberCallTest();
System.out.println("c.iv : " + c.iv);
// 이렇게 거의 안씀
}
void instanceMethod() { // 인스턴스 메소드
System.out.println("cv : " + cv);
System.out.println("iv : " + iv);
}
void instanceMethod2() {
// 인스턴스 메소드에서는 인스턴스 메소드, 클래스 메소드 모두 호출 가능
staticMethod();
instanceMethod();
}
static void Method2() {
MemberCallTest.staticMethod(); // 아래와 동일
staticMethod();
// instanceMethod();
// 클래스 메소드에서 인스턴스 변수 사용 불가 사용하려면 아래와 같이
MemberCallTest c = new MemberCallTest();
c.instanceMethod();
new MemberCallTest().instanceMethod(); // 위와 동일
}
}
-------------------------------------------------------------------------------------------------------------
package example02;
public class MyMathEx02 {
public static void main(String[] args) {
System.out.println(MyMath2.add(5, 3));
System.out.println(MyMath2.substract(5, 3));
System.out.println(MyMath2.multiply(5, 3));
System.out.println(MyMath2.divide(5, 3));
MyMath2 mm2 = new MyMath2();
System.out.println(mm2.add(5, 3)); // 사용은 가능하되 지양할 것
MyMath2.add(5, 3);
}
}
class MyMath2{
// 덧셈, 뺄셈, 곱셈, 나눗셈 메소드
// 1. 두 개의 정수를 전달받아 두 수의 합을 return 하는 메소드
static int add(int a, int b) {
// int result = a + b;
//return result; 1번째 방법
return a + b; // 2번째 방법 (바로 넘기기)
}
// 2. 두 개의 정수를 전달받아 두 수의 차를 return 하는 메소드
static int substract(int a, int b) {
// int result = a - b;
return a - b;
}
// 3. 두 개의 정수를 전달받아 두 수의 곱을 return 하는 메소드
static int multiply(int a, int b) {
int result = a * b;
return result;
}
// 4. 두 개의 실수를 전달받아 두 수의 결과를 return 하는 메소드(몫을 return)
static double divide(double a, double b) {
// double result = a / b;
return a / b;
}
}
------------------------------------------------------------------------------------------------
package example02;
public class CallStackTest {
public static void main(String[] args) {
System.out.println("main()이 시작되었음");
method1();
System.out.println("main()이 끝났음");
}
static void method1() {
int number = 10;
System.out.println("method1()이 시작되었음");
method2();
System.out.println("method1()이 끝났음");
}
static void method2() {
int number = 10;
System.out.println("method2()가 시작되었음");
System.out.println("method2()가 끝났음");
}
// LIFO(Last In First Out) 나중에 들어온게 먼저 나간다. - stack
// FIFO(First In First Out) 먼저 들어온게 먼저 나간다. - queue
}
---------------------------------------------------------------------------------------------
package example03;
public class Data {
int x; // 인스턴스 변수(static이 붙지 않은)
}
------------------
package example03;
public class PrimitiveParamEx {
public static void main(String[] args) {
Data d = new Data();
d.x = 10;
System.out.println("main() : " + d.x); // 10
change(d.x); // 기본형
System.out.println("main() : " + d.x); // 10
}
static void change(int x) { // 죽었다 깨도 주소를 가지지 못함
x = 1000;
System.out.println("change() : " + x);
}
}
--------------------------------------
package example03;
public class ReferenceParaEx {
public static void main(String[] args) {
Data d = new Data(); // 인스턴스
d.x = 10; // 장소값
System.out.println("d : " + d);
System.out.println("main() : " + d.x); // 10
change(d); // 같은 것을 가리키게 만듬 - 주소 공유, 주소 자체를 넘긴다.
System.out.println("main() : " + d.x); // 30
}
static void change(Data d1) {
System.out.println("d1 : " + d1);
d1.x = 30;
System.out.println("change() : " + d1.x);
}
}
--------------------------------------------------------------------
package example03;
import java.util.Arrays;
public class ReferenceParaEx {
public static void main(String[] args) {
Data d = new Data(); // 인스턴스
d.x = 10; // 장소값
System.out.println("d : " + d);
System.out.println("main() : " + d.x); // 10
change(d); // 같은 것을 가리키게 만듬 - 주소 공유, 주소 자체를 넘긴다.
System.out.println("main() : " + d.x); // 30
System.out.println();
int [] ar = new int[4]; // 0, 0, 0, 0
System.out.println(Arrays.toString(ar));
plusOne(ar);
System.out.println(Arrays.toString(ar));
}
static void change(Data d1) {
System.out.println("d1 : " + d1);
d1.x = 30;
System.out.println("change() : " + d1.x);
}
static void plusOne(int[] arr) {
for(int i = 0; i < arr.length; i++) {
arr[i]++;
}
}
}
'Java1(주말)' 카테고리의 다른 글
Java1 day07 (0) | 2022.04.30 |
---|---|
Java1 day06 (0) | 2022.04.24 |
Java1 day05 (0) | 2022.04.23 |
Java1 day04 보충 (0) | 2022.04.23 |
Java1 day04 (0) | 2022.04.17 |