코드 그라데이션
230224 static 개념 정리 본문
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`이며 메서드가 호출되는 객체에 대한 레퍼런스를 가지고 있음
'Java, SpringBoot 추가 공부' 카테고리의 다른 글
제네릭에서 <T>의 의미 (0) | 2023.04.28 |
---|---|
230324 상속 개념 정리 (0) | 2023.04.04 |
230224 클래스, 생성자, this, 오버로딩 간략 정리 (0) | 2023.04.04 |
[Java] Call by Value, Call by Reference (0) | 2023.04.02 |
230327 별찍기 피라미드 / 다이아몬드 모양 추가 정리 (0) | 2023.04.01 |