자바 프로그램의 실행 과정
1 소스코드를 작성하고 클래스파일을 생성
2 클래스 파일을 실행
3 클래스 로딩 : 프로그램이 실행될 때 인스턴스가 생성되기 위한 정보를 제공해주기 위해서 클래스가 먼저 메모리로 로딩된다.
4 이때 클래스에 속한 스테틱 변수와 메소드가 같이 로딩됨
5 메인 메소드가 실행
6 인스턴스 생성: 힙에 로딩
7 메소드 호출: 메소드 내에서 선언된 로컬변수가 스택에 생성
클래스에서 : Inner클래스에서만 사용됨
변수에서: 인스턴스에서 공유데이터를 사용할 목적으로 사용
메소드에서 : 객체 없이 메서드를 접근할 목적으로 사용
스테틱 변수는 클래스와 관련있기 때문에 단 한번만 실행되며 프로그램이 실행될 때 생성되고 종료할 때 삭제. 자동으로 기본값으로 초기화.
생성된 모든 인스턴스에서 접근, 공유 가능
package pack2;
public class Product {
private int Price;
String ProdectDay="2022년1월4일";
public String name;
static int count=1; //스테틱은 메소드 밖에서 정의한다.
public Product() {
}
public Product(String name) {
this.name=name;
}
//setter 메소드 : 인스턴스 변수에 저장된 데이터를 수정할 목적으로 사용
void setDay(String ProdectDay){
//this 키워드 - 객체 생성 후에 힙에 생성된 자기 자신의 인스턴스를 의미한다.
this.ProdectDay=ProdectDay; // this-> 매개(로컬)변수가 아닌 인스턴스 변수를 가리킴
}
void setPrice(int Price){
this.Price=Price;
}
/*public void test() {
System.out.println("클래스 일반메소드에서 일반메소드 호출");
}*/
public void display() { //일반멤버는 힙에 생성
System.out.println("name: "+name + ", ProdectDay:" + ProdectDay + ", Price: "+ Price);
staticMethod();//일반메소드는 스테틱을 호출할 수 있다.
//test();
}
public static void staticMethod() { //스테틱에 생성
System.out.println("난 스테틱 메소드");
System.out.println("count: "+count);
//System.out.println("ProdectDay: "+ProdectDay);
//display(); 일반메소드를 부를 수 없다.
//일반멤버와 생성되는 순서가 다르다. 스테틱은 new 전에 먼저 만들어진다.
//인스턴스 변수도 호출 불가
}
//스테틱은 설계도 클래스 이름으로 부르는 게 맞다.
}
package pack2;
public class ProductMain {
public static void main(String[] args) {
System.out.println("\n문제1---------------");
Product Pen = new Product("펜");
Product Book = new Product("책");
Pen.setPrice(100);
Pen.display();
Pen.setDay("2022년 1월8일");
Pen.display();
Book.setDay("2022년 1월8일");
Book.setPrice(200);
Book.display();
Product Eraser = new Product();
Eraser.display();
System.out.println("---------------");
}
}