1. Static이란?

1. static 변수는 class변수라고도 불린다.

2. static으로 선언된 변수는 변수가 선언된 클래스의 모든 인스턴스가 공유할 수 있다.

3. C/C++의 전역변수라 생각하면 된다.

 

 

2. Static 특징

1. static한 멤버는 객체생성 과정 없이 사용할 수 있다.

원래 객체는 객체 생성을 해야 메모리에 올라가 사용할 수 있는데, static한 멤버는 미리 메모리에 올라가 있어 사용이 가능하다. 그래서 따로 객체 생성 없이도 사용할 수 있다.

Java는 컴파일단계와 실행단계가 있는데, 컴파일에서는 Syntax오류만 검사한다.

Syntax오류가 없으면 class파일을 만들게 되는데 여기서 class file loader과정에서 static멤버가 메모리에 올라가게 된다.

 

2. static 안에서는 this 키워드를 사용할 수 없다.

static과 this는 물과 기름같은 관계이다. 절대 같이 섞일 수 없다.

 

3. static은 static끼리 통한다.

무슨말이냐? 아래 코드는 에러난다....

public class staticExam{
	String name;
    
    static void member(){
    	name = "홍길동";
    }
}

왜?? static은 객체 생성 전에 메모리에 올라가 있어 접근이 가능하다.

그런데, name은 static이 아니므로 staticExam클래스의 객체 생성 이후 사용가능하다.

따라서 static안에 static하지 않은것은 사용 못한다!!

static은 static끼리 묶어야한다.

 

4. static변수는 반드시 필드레벨로만 사용가능. 지역변수처럼 사용 불가능.

 

5. static변수와 멤버변수의 차이점은? (설계시 다음과 같은 특징으로 나눠야함)

5.1. 멤버변수는 각 객체마다 고유한 값을 가진다.

5.2. static멤버는 생성된 객체에서 모두 값을 공유한다. 따라서 서로다른 객체가 같은 값을 가진다.

 

6. static은 class area에 잡힌다.

객체는 Heap에 올라가고, 객체 변수는 stack에 올라가 주소값을 가지고 있다.

하지만 static은 class area에 올라간다.

class area는 가비지 컬렉터가 관여할 수 없어 static을 너무 많이 사용하면 좋지 않다.

 

6. 주로 final(상수값)과 많이 쓰인다.

상수값은 변하지 않기 때문에 static으로 공유해서 많이 사용한다.

 

7. static한 클래스는 객체생성을 하지 못한다.

Integer.parseInt(), System.in, Math.random()과 같이 Integer, System, Math 모두 대문자로 시작하는 클래스 이지만 static하므로 객체생성을 못해 클래스명 뒤에 직접 점(.)을 붙여 사용한다.                                                                    

Posted by Jyoel :