package com.java1.day10;
//static를 사용하면 메모리에 바로 등록 된다.
//static는 공유의 개념이다.
//클래스 내에 선언된 변수들 중에 static 이 붙은 변수를 클래스 변수라 하고
//static 이 붙지 않은 변수를 인스턴스 변수라 한다.
//아래 예제는 실전에서는 잘 일어나지 않는경우이다.
//실제로는 같은 클래스 내에서 클래스멤버가 인스턴스멤버를 참조 또는 호출해야하는 경우는 드물다.
//만일 그런 경우가 발생한다면, 인스턴스메서드로 작성해야할 메서드를 클래스메서드로 한 것은 아닌지 한번 더 생각해봐야 한다.
public class MemberCall {
int iv = 10;
static int cv = 20; // static 를 선언하면 인스턴스 생성없이 바로 접근 가능하다.
int iv2 = cv; //static 변수는 일반변수에 넣을수 있다.
// static int cv2 = iv; 에러. 클래스변수는 인스턴스 변수를 사용할 수 없음.
static int cv2 = new MemberCall().iv; // 굳이 사용하려면 이처럼 객체를 생성해야함.
static void classMethod1() {
System.out.println(cv); // static 매서드 안에서는 static 변수만 가능.
// System.out.println(iv); 에러. 클래스메서드에서 인스턴스변수를 바로 사용할 수 없음.
MemberCall c = new MemberCall(); // static 매서드에서 일반 변수를 쓸려면 인스턴스를 생성한뒤 사용
System.out.println(c.iv); // 객체를 생성한 후에야 인스턴스변수의 참조가 가능함.
}
void instanceMethod1() {
System.out.println(cv); // 일반 매서드 에서는 static변수와 일반변수 둘다 사용가능.
System.out.println(iv); // 인스턴스메서드에서는 인스턴스변수를 바로 사용가능.
}
static void classMethod2() {
classMethod1();
// instanceMethod1(); 에러. 클래스메서드에서는 인스턴스메서드를 바로 호출할 수 없음.
MemberCall c = new MemberCall();
c.instanceMethod1(); // 인스턴스를 생성한 후에야 인스턴스메서드를 호출할 수 있음.
}
void instanceMethod2() { // 인스턴스메서드에서는 인스턴스메서드와 클래스메서드
classMethod1(); // 모두 인스턴스생성없이 바로 호출이 가능하다.
instanceMethod1();
}
}