Java

[Java] static 알아보기

체리1001 2024. 4. 22.

1. static이란

static 멤버란 정적 멤버를 뜻합니다. 클래스 멤버라고도 부르는 static 멤버는 어떤 객체 소속이 아닌, 클래스에 고정되어 있는 변수나 메서드라는 것을 의미합니다.

 

static 키워드를 통해 생성된 정적 멤버들은 Heap 영역이 아닌 Static 영역에 할당되며, 그렇기 때문에 가비지 컬렉터의 관리 영역 밖에 존재합니다. 프로그램이 시작할 때 메모리에 적재되어서 모든 객체가 공유하여 사용할 수 있다는 장점이 있지만, 프로그램이 시작할 때 생성되어 프로그램이 끝날 때까지 값이 유지되므로 static 멤버를 지나치게 남용하는 것은 시스템 성능에 악영향을 줄 수도 있습니다.

 

2. static의 특징

(1) 메모리에 고정적으로 할당된다.

static이 붙지 않은 메서드나 변수는 객체가 생성될 때마다 새로 생성되어 모두 다른 값을 가지고 있을 수 있습니다. 그러나 static 키워드가 붙은 메서드나 변수는 프로그램이 시작될 때 Static 영역에 적재되어 프로그램이 끝날 때까지 유지됩니다.

(2) 객체 생성 없이 바로 사용할 수 있다.

static 키워드가 붙은 메서드나 변수는 객체에 종속되어 있는 것이 아니기 때문에 객체 생성없이 바로 사용이 가능합니다.

(3) static 메서드 내에서는 인스턴스 변수를 사용할 수 없다.

static 메서드는 객체를 생성하지 않고도 어디서든 사용이 가능하기 때문에 메서드 내부에서 인스턴스 변수를 사용할 수 없습니다.

 

3. static 사용 방법

(1) static 변수 선언 및 사용 방법

static 변수의 선언은 단순합니다. 원하는 변수 앞에 static 키워드를 사용하면 됩니다!

class People {

	static int age = 26; // static 변수
   	String name = "채림"; // 인스턴스 변수

}

public class Main {
	public static void main(String[] args) {
    	System.out.println("나이: " + People.age); // 객체 생성없이 사용 가능
        
        People p = new People();
        System.out.println("이름: " + p.name); // People.name; 으로 사용 불가능
    }

}

(2) static 메서드 사용 방법

class People { 

	static int age = 26; // static 변수
	String name = "채림"; // 인스턴스 변수
    
    static void printAge() {
    	System.out.println("나이: " + age);
    }
    
    void printName() {
    	System.out.println("이름: " + this.name);
    }

}

public class Main {
	public static void main(String[] args) {
    	People.printAge(); // 객체 생성없이 사용 가능
        
        People p = new People();
        p.printName(); // People.pringName(); 으로 사용 불가능
    }

}

 

non-static 메서드는 객체 생성없이는 호출이 불가능합니다!!

 

3. main에 static이 붙어있는 이유

자바에서는 main()이 제일 먼저 호출됩니다. 그런데 이 main 함수 앞에 static이 붙어있는 이유는 무엇일까요?
그것은 바로 우리의 프로그램은 main()으로 시작하기 때문입니다!

public static void main(String[] args) {

}
  • public: 어디서든 접근이 가능해야 합니다.
  • static: 특별한 객체 생성없이 접근이 가능해야 하며, 가비지 컬렉터의 대상이 되어서는 안됩니다.
  • void: main()이 끝나면 프로그램이 끝나는 것이기 때문에 리턴값은 필요가 없습니다.
  • String[] args: 프로그램이 시작할 때 입력으로 줄 데이터가 있을 때 사용합니다.

 

참고
https://coding-factory.tistory.com/524
https://jooona.tistory.com/164

'Java' 카테고리의 다른 글

[Java] 래퍼 클래스(Wrapper Class)란  (0) 2024.04.18
[Java] JVM GC 처리 과정  (0) 2024.04.16
[Java] JVM의 구조와 자바 컴파일 과정  (0) 2024.04.16
[Java] Call by Value vs Call by Reference  (0) 2024.04.16

댓글