- 학습 목표 달성 확인 목록
- [] 클래스 로딩이 무엇인지 설명할 수 있는가?
.class 파일에 들어있는 명령을 실행하기 위해 메모리에 배치하는것을 말한다.
- [] 스태틱 필드와 인스턴스 필드의 생성 시점을 이해하는가?
먼저 스태틱 필드(클래스 변수)는 클래스 로딩한 후 자동으로 변수 선언을 한다.
인스턴스 필드(스태틱이 붙지않는 변수)는 인스턴스가 생성될 때의 시점이다.
- [] Method Area와 Heap, Stack 메모리 영역의 쓰임새를 이해하는가?

- [] 가비지가 무엇인지 설명할 수 있는가?
public class MyClass {
int b = 200;
}
public class App {
public static void main(String[] args) {
//인스턴스와 가비지
MyClass v1 = new MyClass();
System.out.println(v1.b);//결과:200
v1.b = 300;
/*
다름과 같이 새 인스턴스를 만든 다음에
그 주소를 v1에 저장하면
이전 인스턴스의 주소는 잃어버린다
따라서 이전 인스턴스는 사용할 수 없다
이렇게 주소를 잃어 버려 사용할 수 없는 인스턴스를 가비지라 부른다
*/
System.out.println(v1.b);//결과:300
}
}

- [] 스태틱 필드의 쓰임새를 아는가?
먼저 스태틱이 붙은 변수는 인스턴스 생성없이 바로 사용이 가능하다.
그래서 객체를 생성하지않아도 되므로 편리하고 속도도 빠르다.
자주 변하지 않는 일정한 값이나 설정 정보같은 공용자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽어들이는 것보다
일종의 전역변수와 같은 개념을 통해서 접근하는 것이 비용도 줄이고 효율을 높일 수 있다.
그리고 인스턴스 생성 없이 바로 사용가능하기 때문에 프로그램내에서 공통으로 사용되는 데이터들을 관리 할 때 자주 이용한다.
- [] 인스턴스 필드의 쓰임새를 아는가?
먼저 인스턴스 필드는 static이 붙지않은 것을 말한다.
그렇기에 공용이 아닌 독립적으로 사용되는 변수이기에 같은 클래스로 두개의 다른 인스턴스화를 하여 각자 변수에 접근하여 값을 바꾸면
public class t {
public static void main(String[] args) {
tt t1 = new tt();
System.out.println(t1.aa);//이때는 아직 111
t1.aa = 100;
System.out.println(t1.aa);
System.out.println("==============");
tt m2 = new tt();
System.out.println(t2.aa);//이때는 아직 111
t2.aa = 200;
System.out.println(t2.aa);
}
}
public class tt {
int aa = 111;
}
//결과
111
100
==============
111
200
- [] 인스턴스 메서드의 쓰임새를 아는가?
먼저 반대인 클래스 메서드는 메서드 앞에 static이 붙어있다.
클래스 메서드도 클래스 변수처럼 객체를 생성하지 않고 ‘클래스이름.메서드이름(매개변수)’와 같이 호출가능하다.
인스턴스 메서드는 반드시 객체(인스턴스화)해야만 호출이 가능하다.
메서드의 작업내용중에 인스턴스 변수를 필요로 한다면 static을 붙일 수 없다.
반대로 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
- [] 인스턴스 메서드의 내장 변수인 this를 설명할 수 있는가?
객체 내부에서 인스턴스 멤버(인스턴스 필드,인스턴스 메소드들을 말한다)에 접근하기 위해 this를 사용할 수 있다.
객체 자신 = this
public class a1 {
int a = 1;
void aa() {
System.out.println(a);//1
this.a = 10;
System.out.println("===");
System.out.println(a);//10
}
void aaa() {
System.out.println(a);//10
this.a = 20;
System.out.println("===");
System.out.println(a);//20
}
public static void main(String[] args) {
a1 a = new a1();
a.aa();
System.out.println("===");
a.aaa();
}
}
//결과
1
===
10
===
10
===
20