public class Ex01_field {
public static void main(String[] args) {
Test1 t1 = new Test1(); // 객체 생성. Test1 클래스의 a와 b필드가 메모리 할당받음.
Test1 t2 = new Test1();
t1.a=50;
System.out.println(t1.a+ " : " + t2.a); // 50:0
int s = t1.sub(10); // 지역변수와 매개변수는 호출 될 때 메모리 할당을 받음.
System.out.println(s);
s = t1.sub(100);
System.out.println(s);
/*
// 클래스 변수를 객체를 통해서 접근 가능 하지만 권장하지 않음. (경고)
t1.c = 50;
System.out.println(t1.c+ " : " + t2.c); // 50:50 메모리 할당이 한 번만 되어서
*/
System.out.println(Test1.c); // 클래스 변수는 클래스명으로 접근
}
}
class Test1 {
// 필드 : 인스턴스 변수 + 클래스 변수
// 인스턴스 변수
// 인스턴스 변수는 객체가 생성될 때 메모리가 생성. 메모리를 할당 받을 때 기본값으로 초기화
// 인스턴스 변수는 객체마다 메모리할당. heap 메모리 영역에 메모리할당 (자바가 메모리관리하는 부분임, 개발자가 관리 불가)
// 인스턴스 변수는 객체가 null이 되거나 오랫동안 사용되지 않으면 Garbage collector가 메모리회수.
// 객체에 종속되므로 객체를 통해서 접근 "객체명.인스턴스 변수" 로 접근
int a; // 생성될때 0으로 초기화
int b=10; // 생성될때 10으로 초기화
// 클래스 변수
// 클래스가 로딩될 때 메모리 할당.
// 객체 생성과 상관없이 하나만 메모리할당되고 모든 객체가 공유.
// "클래스명.클래스 변수"로 접근
// 프로그램이 종료되는 시점에 메모리에서 제거된다.
static int c=100;
// 매개변수, 지역변수 : 스택메모리 영역에 메모리 할당. 초기화하지 않으면 쓰레기값
// 매개변수와 지역변수는 메소드를 호출할 때 메모리가 할당된고 메소드를 빠져나가면 메모리에서 제거됨.
// 인스턴스 메소드 : 객체가 생성되어야 호출되는 메소드로 객체를 통해서 호출
public int sub(int n) { // n:매개변수
int s=0; // 지역변수
for(int i=1; i<=n;i++) {
s+=i;
}
return s;
}
// void는 메소드를 실행 후 결과를 호출한 곳으로 넘길 필요가 없는 경우 사용
public void sub2() {
// 인스턴스 변수는 클래스내의 모든 인스턴스 메소드에서 호출가능하다.
System.out.println(a+" : "+b);
int x = sub(5); // 다른 인스턴스 메소드도 호출 가능.
System.out.println(x);
// 클래스 메소드나 클래스 변수 호출 가능.
System.out.println(c);
demo2();
}
// 클래스 메소드 : 객체 생성과 상관없이 클래스 이름으로 호출하는 메소드
public static void demo() {
// 클래스메소드는 인스터스 변수나 인스턴스 메소드를 직접 호출 불가
// System.out.println(a); // 컴파일 오류
// tt.sub2(); // 컴파일 오류
// 클래스 변수나 클래스 메소드는 호출 가능
System.out.println(c);
// 클래스 메소드에서 객체를 생성하여 인스턴스 변수나 인스턴스메소드 호출
Test1 tt= new Test1();
System.out.println(tt.a+" : "+tt.b);
tt.sub2();
}
public static void demo2() {
System.out.println("demo2 ...");
}
}