열 세번째, static에 관해
개요: 필자가 하도 헷갈린 드디어 그녀석에 대한 풀이를 해보겠다.
https://vaert.tistory.com/101
static
- 정적(static)은 고정된 의미를 가지고 있다.
- static 키워드를 사용하면 static 변수와 static 메소드를 만들수 있다.
- 즉 이것들을 합쳐 정적 멤버라고 한다.
- 이것은 객체에 소속된 멤버가 아니라 클래스에 고정된 멤버입니다.
- Heap 영역에 할당되지 않아서 static 영역에 할당된 메모리는 모든 객체가 공유하여 어디서든지 참조할 수 있다.
- 따라서 프로그램의 종료시까지 메모리가 할당된 채로 존재한다.
- 하지만 너무 남발하면 시스템 성능에 악영향을 줄 수 있다.
정리
- 클래스를 설계할 때 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 붙인다.
- static이 붙은 멤버변수는 인스턴스를 생서하지 않아도 사용할 수 있다. (클래스가 메모리에 올라갈때 자동적으로 생성됐기 때문)
- static이 붙은 메서드에서는 인스턴스 변수 사용 불가능하다.
-
다음은 예시 코드를 통해 알아보자
<static 변수>
public class StudentTest1 {
public static void main(String[] args) {
Student student=new Student();
System.out.println(Student.serialNum);
System.out.println(Student.serialNum);
System.out.println(student.studentId);
Student student1=new Student();
Student student2=new Student();
System.out.println(student1.studentId);
}
}
public class Student {
static int serialNum=0;
int studentId;
String studentName;
public Student(){
serialNum++;
studentId=serialNum;
}
}
2번째 클래스에서 serialNum을 static로 선언해서 값이 공유되게 만들었다.
따라서 1번째 클래스에서 생성자를 생성하면 값이 고정값이 아닌 계속 공유되서 1 .. 2.... 로 증가 되는것을 볼 수 있다.
<static 메서드>
- 인스턴스 변수와 관계없거나 static 변수만을 사용하는 메서드들을 사용할 때 사용한다. 대게 일반적이다.
public class test6 {
public static void main(String[] args) {
System.out.println("hello");
}
}
class test7{
public void show(){
test6.main(null);
}
}
다음과 같이 test6에서 선언된 static 메서드를 test7에서 클래스를 통해 불러올 수 있다.
<static 클래스>
- 일명 정적 클래스라고 한다.
- new 키워드를 사용해서 인스턴스를 만들 수 없다.
- 정적 클래스의 모든멤버는 static으로 선언되어야 한다.
- 정적 클래스는 객체들이 처음 호출될 때 생성되고 프로그램이 종료될 때 해제되기 때문에 어디서든지 접근이 가능하다.
- 정적 클래스는 생성자를 포함할 수 없다.
<내부 static 클래스>
- 이것으로 객체를 2번 생성한다 하더라도 서로 다른 값이 나온다.
클래스는 설계도 인스턴스는 설계도의 구현체이기 때문에 static 단어 하나로 혼동되면 안된다.
But
static으로 선언 안할 때
- 참조값을 담아야 하기 때문에 인스턴스 생성시 시간적, 공간적으로 성능이 낮아진다.
- 외부 인스턴스에 대한 참조가 존재하기 때문에, 가비지 컬렉션이 인스턴스를 수거를 하지 못하면 메모리 누수가 발생한다.
그래서 내부는 static 클래스로 선언하는 편이 좋다.
내부 static 클래스에 관한 내용은 아래 링크를 통해 더 자세하게 설명하겠다!!
링크: https://balhae.tistory.com/m/70
느낀점: 추후 더 추가할 예정이고 헷갈렸던 static을 다시한번 되짚는 공부가 되었다.
참고
https://coding-factory.tistory.com/524
https://mygumi.tistory.com/253