목차
1. static과 non-static
2. static 변수와 메소드
static과 non-static
non-static 멤버
· 객체마다 독립적으로 별도 존재
· 객체가 생성될 때 멤버 생성 -> 객체 생성 후 사용 가능
· 다른 객체들과 공유X
static 멤버
· 클래스 당 하나만 생성(객체마다 생성X)
· 클래스가 로딩될 때 멤버 생성 -> 객체를 생성하지 않고 사용 가능
· 동일한 클래스의 모든 객체들이 공유
=> 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 |
댓글