안녕하시소
요즘 자바를 사용하는데 개념을 정확히 모르고 쓰는 문법들이 많은 것 같아서 하나씩 정리해보려고 합니다...
일단 static 너 나와!
말 그대로 '정적인', '고정적인' 이라는 의미인데...
특정 인스턴스에 종속되지 않고클래스 자체에 속하는멤버라고 합니다.
JVM이 시작될 때, 어디서든 접근이 가능한 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 메서드는 객체 생성 없이 사용이 가능한 메서드겠죠?
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
}
}