[Java] Static이 그래서 뭔데

혜 콩·2024년 3월 8일

Backend

목록 보기
7/9
post-thumbnail

안녕하시소
요즘 자바를 사용하는데 개념을 정확히 모르고 쓰는 문법들이 많은 것 같아서 하나씩 정리해보려고 합니다...

일단 static 너 나와!

Static❓

말 그대로 '정적인', '고정적인' 이라는 의미인데...
특정 인스턴스에 종속되지 않고클래스 자체에 속하는멤버라고 합니다.
JVM이 시작될 때, 어디서든 접근이 가능한 static 영역에 저장되기 때문에 무분별하게 사용할 경우 메모리 효율이 떨어질 수 있습니다.

static은 변수와 메서드에 적용될 수 있는데!

Static 변수

static이 클래스 자체에 속한다고 했으니 당연히 static 변수는 클래스 변수겠죠?
클래스 변수와 인스턴스 변수... 쓰임은 알겠어
근데 정확히 차이가 뭔데??

클래스 변수

  • 클래스가 로드될 때 생성되며, 프로그램이 종료될 때까지 메모리에 유지됩니다.
  • 클래스 이름을 사용하여 접근하며, 객체 인스턴스를 생성하지 않고도 직접 접근할 수 있습니다.

인스턴스 변수

  • 객체 인스턴스가 생성될 때마다 새로운 메모리 공간이 할당되고, 객체가 소멸할 때까지 유지됩니다.
  • 각 객체 인스턴스는 고유한 값을 가지며, 한 인스턴스에서 값을 변경하더라도 다른 인스턴스에는 영향을 미치지 않습니다.
  • 객체를 생성한 후에만 해당 객체의 인스턴스 변수에 접근할 수 있습니다.
public class Person {
    static String name = "hyecong";
    int age = 10;
}
public class Main {
    public static void main(String[] args) {
        // 클래스 변수 접근 (클래스 이름으로 접근)
        System.out.println(Person.name); // >>> hyecong

        // 인스턴스 생성
        Person person1 = new Person();

        // 각 인스턴스의 인스턴스 변수 값 변경
        person1.age = 30;

        // 각 인스턴스의 인스턴스 변수 값 출력
        System.out.println(person1.age); // 출력: 30
    }
}


Static 메서드

아하 그럼 메서드도 비슷하겠네~
static 메서드는 객체 생성 없이 사용이 가능한 메서드겠죠?

public class Person {
    private static int age = 10;				// 객체 생성 없이 클래스 변수로 사용 가능
    private String name;
    
    public Person(String name) {
        this.name = name;
    }
    
    public static int getAge() {  			// 객체 생성 없이 사용 가능
    	return age;
    }
   
    public static void setAge(int age) {        // 객체 생성 없이 사용 가능
    	Person.age = age;
    }
    
    public String getName() {
        return name;
    }
}
public class Main {
    public static void main(String[] args) {
        // 클래스 변수 접근 (클래스 이름으로 접근)
        System.out.println(Person.age); // >>> 10

        // 인스턴스 생성
        Person person1 = new Person("congtwo");

        // 클래수 변수 값 변경
        Person.setAge(30);

        // 클래스 변수 값 출력
        System.out.println(Person.getAge()); // 출력: 30
        System.out.println(person1.getName()); // 출력: congtwo 
    }
}
profile
배우고 싶은게 많은 개발자📚

0개의 댓글