JAVA

열 세번째, static에 관해

seung_ho_choi.s 2023. 3. 30. 13:30
728x90

개요: 필자가 하도 헷갈린 드디어 그녀석에 대한 풀이를 해보겠다. 
https://vaert.tistory.com/101
 

static

https://coding-factory.tistory.com/524

- 정적(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

728x90