본문 바로가기
Programming 기초/Java

[Java] static

by 뭉제 2023. 3. 30.
목차
1. static과 non-static
2. static 변수와 메소드

 

 

static과 non-static


non-static 멤버

· 객체마다 독립적으로 별도 존재

· 객체가 생성될 때 멤버 생성 -> 객체 생성 후 사용 가능

· 다른 객체들과 공유X

 

static 멤버

· 클래스 당 하나만 생성(객체마다 생성X)

· 클래스가 로딩될 때 멤버 생성 -> 객체를 생성하지 않고 사용 가능

· 동일한 클래스의 모든 객체들이 공유

 

=> static 멤버는 클래스당 하나씩 생긴다고 해서 클래스 멤버라고도 부르며,

     non-static 멤버는 각 객체마다 하나씩 생긴다고 해서 인스턴스 멤버라고 부른다.

 

static 멤버와 non-static 멤버

 

[static의 활용]

1. 전역 변수와 전역 함수를 만들 때

· 모든 클래스에서 공유하는 전역 변수나 모든 클래스에서 호출할 수 있는 전역 함수가 필요한 경우

ex) Math 클래스: 모든 멤버가 public static으로 선언 -> 다른 모든 클래스에서 사용 가능

 

2. 공유 멤버를 작성할 때

· static 필드나 메소드는 하나만 생성되어 클래스의 객체들 사이에서 공유

 

 

static 변수와 메소드


static 변수와 메소드는 클래스에서 생성된 모든 인스턴스가 공유하는 자원이다.

인스턴스를 만들지 않아도 클래스에서 직접 호출할 수 있다.

 

class Foo{
	public static String classVar="I class var";
	public String instanceVar="I instance var";
	
	public static void classMethod() {
		System.out.println(classVar); //OK
	//	System.out.println(instanceVar); Error
	}
	
	public void instanceMethod() {
		System.out.println(classVar); //OK
		System.out.println(instanceVar); //OK
	}
}

public class StaticApp {
	public static void main(String[] args) {
		System.out.println(Foo.classVar); //OK
	//	System.out.println(Foo.instanceVar); Error
		
		Foo.classMethod();
	//	Foo.instanceMethod(); 
		 
		Foo f1=new Foo();
		Foo f2=new Foo();
		
		System.out.println(f1.classVar); //I class var
		System.out.println(f1.instanceVar); //I instance var
		
		f1.classVar="changed by f1";
		System.out.println(Foo.classVar); //changed by f1
		System.out.println(f2.classVar); //changed by f1
		
		f1.instanceVar="changed by f1"; 
		System.out.println(f1.instanceVar); //changed by f1
		System.out.println(f2.instanceVar); //I instance var
	}
}

· non-static 멤버는 클래스에서 바로 접근 불가

  -> 인스턴스 생성 후 접근 가능

· static 멤버는 해당 클래스로 생성된 모든 인스턴스가 공유하는 자원 

  -> 모든 인스턴스는 같은 static 변수와 메소드 사용

· non-static 멤버는 인스턴스마다 고유의 값을 가진다.

  -> 인스턴스에서 변경을 해도 다른 인스턴스에 어떠한 영향도 끼치지 않는다.

 

 

[static 메소드의 제약 조건]

1. non-static 멤버 접근 불가

· static 메소드는 객체가 생성되지 않은 상황에서도 실행 가능 -> non-static 메소드와 필드 사용 불가

· 반대로 non-static 메소드는 static 멤버 사용 가능

 

2. this 사용 불가

· static 메소드는 객체가 생성되지 않은 상황에서도 호출 가능 -> 현재 객체를 가리키는 this 사용 불가

 

 

 

'Programming 기초 > Java' 카테고리의 다른 글

[Java] 인스턴스  (0) 2023.04.05
[Java] 클래스  (0) 2023.04.02
[Java] 변수와 메소드  (0) 2023.03.27
[Java] 접근 제어  (0) 2023.03.24
[Java] 객체 지향 프로그래밍  (0) 2023.03.21

댓글