JAVA/JAVA 수업

[JAVA] static

샛별KIM 2021. 6. 3. 10:39
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을 붙여주면 좋습니다!
 * 
 */