코드 그라데이션

230224 static 개념 정리 본문

Java, SpringBoot 추가 공부

230224 static 개념 정리

완벽한 장면 2023. 4. 4. 10:37

Static vs Non-static

**클래스 필드(static field)**

- 클래스 필드는 클래스의 인스턴스가 아닌 클래스 자체와 연관

public class MainClass {

  public static final String TOP_MANAGEMENT = "top";

  public static void main(String[] args) {
    String topManagement = MainClass.TOP_MANAGEMENT;
    // 객체를 만들지 않아도 바로 받을 수 있다.
    // 왜냐면 얘는 인스턴스에 붙는 게 아니라
    // static 키워드를 보면 알 수 있듯이 클래스에 붙는다는 걸 알 수 있지.
public class MainClass {
  String name;
  public static final String TOP_MANAGEMENT = "top";

  public static void main(String[] args) {
    String topManagement = MainClass.TOP_MANAGEMENT;
    
    MainClass mainClass = new MainClass();
    mainClass.name = "Suji";
 
 }
}
반면 이렇게 일반 필드는 객체 생성해서 불러와야 한다.

- 객체가 몇 개이든 클래스 필드는 오직 하나만 존재

- 클래스 필드의 경우 생성자보다도 먼저 초기화되어야 함

(<- 클래스는 생성자와 관련이 없으니까)

- 이를 위해 자바 컴파일러는 클래스 초기화 메소드를 자동으로 생성

- 클래스 필드는 클래스 초기화 메소드의 본문에서 초기화

- 클래스 초기화 메소드는 클래스가 사용될 때([클래스가 최초로 JVM에 로드될 때]

   (https://www.guru99.com/java-virtual-machine-jvm.html)) 한 번 호출

 

- 클래스 초기화 메소드는 내부 메소드로 프로그래머에게 숨겨져 있음

- static initializer를 사용하면 클래스 초기화 시 수행될 일을 작성할 수 있음

 

**클래스 메서드(static method)**

- 클래스 필드와 마찬가지로 객체가 아닌 클래스 자체와 연관

- **클래스 메서드는 인스턴스 필드 또는 메서드를 사용할 수 없음**

public class Main {

  public static class Authority {

    String name;

    public void otherMethod() {
      this.name = name; // 얘는 name을 볼 수 있는데,
    }

    public static void main(String[] args) {
      this.name // 이건 안 됨.(static context에서 참조할 수 없습니다) 이렇게 나옴.

    }


  }
}
왜냐하면 static은 클래스에 붙는 것이다.
객체를 만들지 않아도 Authority의 멤버를 쓸 수 있었다.

같은 맥락으로 main이라는 건 Authority의 객체가 만들어지지 않아도 쓸 수 있는 것.
그런데 main에서 인스턴스를 참조하게 되면, 얘도 인스턴스가 만들어지고 나서야 참조할 수 있게 되는 것. 
=> 모순

static이라고 했으면 객체와 관계 없이 쓸 수 있어야 하는데, 
static에서 static이 아닌 것을 참조하면 에러가 발생할 수밖에 없다.
즉 이 코드대로 간다면
객체가 존재해야만 name이 존재하는 것이 되므로...

- `this` 키워드를 사용할 수 없음

반대로, 인스턴스 메서드에서 클래스 메서드를 볼 수 있을까? 

클래스가 있으면 인스턴스가 있다는 확실한 보장은 없다.

그런데 인스턴스가 있으면 클래스는 확실히 있다.

=> static에서 non static을 볼 수 있지만
   non static에서 static을 볼 순 없다.
   (이건 메서드에서도 마찬가지)
 

**인스턴스 필드(non-static field)**

- `static` 키워드가 붙지 않은 필드

- 인스턴스 필드는 클래스의 인스턴스(객체)와 연관

- 모든 객체는 자신만의 필드값을 가짐

- 인스턴스 필드는 객체의 상태에 대한 정보를 가지고 있고, 따라서 서로 다른 객체를 구분 가능

   (OOP의 핵심)

- 필드 초기화 코드는 자바 컴파일러가 자동으로 모든 생성자에 삽입

 

**인스턴스 메서드(non-static method)**

- 인스턴스 메서드는 특정한 클래스의 인스턴스(객체) 위에서 동작

- `static` 키워드가 붙지 않은 메서드는 인스턴스 메소드

- 인스턴스 메서드는 클래스 멤버에 접근 가능

- 모든 인스턴스 메서드는 메소드 시그니처에서 보이지 않는 implicit 매개변수를 사용하여 구현

   Implicit 매개변수의 이름은 `this`이며 메서드가 호출되는 객체에 대한 레퍼런스를 가지고 있음

 
728x90
Comments