static 제어자 (Java)


http://www.yes24.com/Product/Goods/103389317

 

Do it! 자바 완전 정복 - YES24

이 책은 ‘이제 막 프로그래밍에 입문한 사람’에게 꼭 필요한 기본기부터 ‘찐개발자’라면 꼭 알아야 할 내용까지 국내 집필서 중 가장 많은 도해와 그림을 이용해 설명한다. 특히 프로그래

www.yes24.com

Do it! 자바 완전 정복 책을 공부하며 요약・정리한 내용입니다.


인스턴스 멤버(instance member)

앞에 static이 붙어 있지 않으며 클래스의 객체를 생성해야 다른 클래스에서 사용 가능

 

정적 멤버(static member)

앞에 static이 붙어 있으며 다른 클래스에서 객체 생성 없이 클래스명.멤버명 으로 바로 사용 가능

 

인스턴스 필드와 정적 필드

인스턴스 필드

class A {
	int x = 3;       // 인스턴스 필드
}

public Class B {
	public static void main(String[] args) {
		// 인스턴스 필드 활용 : 객체 생성후 사용
		A a = new A();
		System.out.println(a.x);
	}
}
//--==>> 3

인스턴스 x는 객체 내부에 저장 공간이 생성되기에 반드시 객체를 먼저 생성해야 한다. 또한 저장 공간이 힙 메모리에 위치하므로 해당 저장 공간에 값을 읽기 위해 참조 변수명을 사용해야 한다.

 

정적 필드

class A {
	static int y = 4;      // 정적 필드
}

public class B {
  public static void main(String[] args) {
		System.out.println(A.y);
		// 정적 필드 활용 : 객체 생성 없이 클래스 명으로 사용
    
		A a = new A();
		System.out.println(a.y);
		// 객체 생성을 한 이후 사용할 수 있지만
		// 이렇게 사용하면 적정 필드임을 나타내기 어려워서 권장하지 않음
	}
}

정적 필드는 클래스 내부에 저장 공간을 지니고 있다. 즉 객체가 생성되기 전에 먼저 생성 그러니까 객체 생성 없이 바로 사용할 수 있다.

또한 클래스 내부에서 클래스 내부에 저장되기 때문에 객체 간 공유하는 성질이 있다.

아래 예시를 보면 쉽게 이해할 수 있다.

e.g.

class A{
    int x = 3;           //인스턴스 필드
    static int y = 4;    //정적 필드
}

public class B {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new A();
	
				// 인스턴스 필드
        a1.x = 30;
        a2.x = 300;
        System.out.println("a1.x : " + a1.x);
        System.out.println("a2.x : " + a2.x);

				// 정적 필드
        a1.y = 40;
        a2.y = 400;
        System.out.println("a1.y : " + a1.y);
        System.out.println("a2.y : " + a2.y);
    }
}
//--==>>
/*
a1.x : 30
a2.x : 300
a1.y : 400
a2.y : 400
*/

 

인스턴스 메서드와 정적 메서드

인스턴스 메서드

class A {
	void inMethod () {       //인스턴스 메서드
		System.out.println("Instance Method");
	}
}

public class B {
	public static void main(String[] args) {
		// 인스턴스 메서드 활용 : 객체 생성후 사용
		A a = new A();
		a.inMethod();
	}
}
//--==>> Instance Method

정적 메서드

class A {
	void stMethod() {        // 정적 메서드
		System.out.println("Static Method");
	}
}

public class B {
	public static void main(String[] args) {
		//정적 메서드 활용 : 객체 생성 없이 클래스 명으로 사용
		A.stMethod();
		
		A a = new A();
		a.stMethod();
		// 객체 생성을 한 이후 사용할 수 있지만
		// 권장하지 않음
	}
}
//--==>> Static Method

정적 메서드 내에서는 정적 필드, 정적 메서드만 사용 가능!!

인스턴스 필드나 인스턴스 메서드는 사용 불가!!

왜냐하면 인스턴스 필드나 인스턴스 메서드는 객체를 생성한 이후에 사용 가능하다.

하지만 객체 생성 이전에 실행하려는 정적 메서드 내부에는 객체 생성하기 전에 사용할 수 있는 요소(정적 멤버)들로만 구성되어야 하기 때문이다.

이는 정적 메서드 내부에서는 클래스 자신의 객체를 가리키는 this 키워드를 사용할 수 없다는 것 또한 의미한다.