[JAVA] static
public class static01 {
public static void main(String[] args) {
//정적멤버 호출 클래스명.static붙은 변수이름
Animal.num = 100;
//정적 메소드 호출 클래스명.static붙은 메소드
Animal.sleep();
Animal.sound();
Animal cat = new Animal();
Animal dog = new Animal();
cat.name = "R2D2";
cat.age = 149;
cat.num = 0; //이렇게 쓰지 마세요!! 객체명.static
Animal.num = 10; //이렇게 해야함!! 클래스명.static
dog.name = "3PO";
dog.age = 10;
System.out.println(cat.name);
System.out.println(cat.age);
System.out.println(dog.name);
System.out.println(dog.age);
System.out.println(cat.num); //이렇게 쓰지 마세요!!
System.out.println(dog.num); //이렇게 쓰지 마세요!!
}
}
class Animal{
String name; //인스턴스 멤버!!
int age; //인스턴스 멤버!!
static int num; //정적으로 변경, static멤버는 객체명으로 부르지 말고 클래스 명으로 부릅시다!!
//스태틱과 인스턴스 멤버는 메모리 생성 위치가 다르다!
public static void sleep() {
System.out.println("Zzzz");
// eat(); //static이 없으면 객체를 만들고 쓸 수 있으니 안된다!
sound();
// name = "";
}
public static void sound() {
System.out.println("소리 냅니다.");
}
public void eat() {
System.out.println("먹습니다.");
sleep(); //객체 생성 후 나올 eat이니까 사용 가능
work(); //객체 생성 후 나올 eat이니까 사용 가능
}
public void work() {
System.out.println("일 합니다.");
num = 1000;
}
}
//static
/*
* static은 정적이라는 의미를 가지고 있습니다.
* 자바에서는 정적 개념과 동적 개념을 구분하고 있습니다.
* 쉽게 표현하면 정적은 클래스가 로드되는 시점을 이야기하고
* 동적은 로드된 클래스가 실행된 이후를 말합니다.
*
* 이 중 객체는 동적 데이터라고 해서 프로그램이
* 실행된 이후에 발생되는 대표적 형태입니다.
* =========================================================
*
* 정적 멤버, 클래스 멤버 -> 객체를 통하지 않고 사용할 수 있는 멤버
* (ex. OOP01 oop01 = new OOP01();같은 객체생성 X)
* 모든 객체를 통틀어서 하나만 생성되고 모든 객체가 공유(!!)합니다.
*
* 인스턴스 멤버 : 인스턴스 생성 시 가지는 자신의 변수
* 두 개의 고양이 객체의 각각의 이름, 나이 등은
* 각각의 인스턴스 변수 이다!! 객체가 생성되면
* 인스턴스 변수 생성!!
* 별도의 기억 공간을 가지고 객체마다 각각 다른 값을 가집니다.
* 객체명.변수명
*
*
* 정적 멤버 : 같은 클래스에서 나온 모든 객체가 공통적으로 사용하는 변수
* 클래스.변수명
* 인스턴스를 생성하지 않고 사용합니다.
* 하나의 클래스에 생성은 한번만 됩니다!!
* 객체보다 클래스에 의지합니다.(클래스와 연결)
* static을 붙이면 됩니다.
*
* 정적 멤버처럼 정적 메소드도 만들 수 있습니다. = static 붙이면 됩니다!
* main 메소드에 static 붙은 이유? 객체 생성 없이 메인을 호출하기 위해!!!
*
* 사용 시 주의사항!!
* 객체가 생성되지 않은 상태에서 호출되는 메소드 이므로
* 객체 안에서만 존재하는 인스턴스 변수들을 사용할 수 없습니다.
* 정적 변수와 지역변수만 사용 가능합니다.
* 정적 메소드에서 인스턴스 메소드를 호출하면 에러가 납니다.
* (인스턴스 메소드로 객체가 생성되어야 사용할 수 있어서 입니다)
* 정적 메소드에서 정적 메소드를 호출하는 것은 가능합니다.
* 정적 메소드는 this 를 키워드로 사용할 수 없습니다.
* : this가 참조할 인스턴스가 없기 때분입니다.
*
* ex) final을 붙인 상수는 모두 다 같이 쓰는 변수입니다.
* 객체를 만들지 않고 쓰면 좋습니다.
* 그래서 static을 붙여주면 좋습니다!
*
*/