[JAVA] 문법 정리 - static, final
static
메서드 영역에서 필드, 메서드를 선언할 경우 static 키워드를 사용합니다.
클래스에서 static 필드를 클래스 변수라고 합니다.
메서드 영역 관련한 내용은 다음 링크에 정리했습니다.
[JVM] 데이터 영역
[JVM] 데이터 영역 Chapter 2. The Structure of the Java Virtual MachineConditional branch: ifeq, ifne, iflt, ifle, ifgt, ifge, ifnull, ifnonnull, if_icmpeq, if_icmpne, if_icmplt, if_icmple, if_icmpgt if_icmpge, if_acmpeq, if_acmpne.docs.oracle.comJV
karina-winter.tistory.com
필드
new 키워드를 통해 생성된 인스턴스와 달리 클래스 필드는 메서드 영역에 존재합니다
따라서 인스턴스와 개별적으로 변수, 메서드를 선언할 수 있습니다.
public class User {
static int userCount = 0;
private final String name;
public User(String name) {
this.name = name;
userCount++;
}
}
예를 들어 User 클래스에서 userCount 변수를 static 으로 선언하면
인스턴스를 생성할 때마다 해당 값을 통해 유저의 수를 파악할 수 있습니다.
public class UserMain {
public static void main(String[] args) {
User user1 = new User("A");
User user2 = new User("B");
User user3 = new User("C");
User user4 = new User("D");
System.out.println(User.userCount); // 4;
}
}
메서드
static 메서드는 내부에서 static 필드, 메서드만 접근이 가능합니다.
인스턴스 필드, 메서드는 클래스 로드 시점에 인스턴스가 메모리에 없기 때문에 접근이 불가능합니다.
따라서 static 메서드 내부에서는 this 를 사용할 수 없습니다.
public class User {
static int userCount = 0;
private final String name;
public User(String name) {
this.name = name;
userCount++;
}
// static method
static String getStaticName(){
System.out.println(userCount); // static 필드 접근 가능
// String name = getName(); -> ERROR! // non-static 메서드 접근 불가
// return this.name; -> ERROR! // instance 필드 접근 불가
return "";
}
// instance method
public String getName(){
return this.name;
}
}
final
final 은 변경될 일이 없는 필드, 메서드 등을 정의할 때 사용하는 키워드입니다.
필드
final 클래스 필드는 단 한 번만 할당할 수 있습니다.
public class User {
private final String name; // final 선언
public User(String name) {
this.name = name; // 생성자에서 최초로 name 할당
}
// public void setName(String name) {
// this.name = name; -> ERROR! // 이미 생성자에서 할당했으므로 에러 발생
// }
}
static 과 조합하면 상수[Constant]를 만들 수 있습니다.
정수, 문자열 리터럴을 상수로 선언하면 컴파일 시 Constant Pool에 등록됩니다.
public class User {
static final String USER_TYPE = "HUMAN"; // 상수 선언
...
}
메서드
메서드를 final 로 선언할 경우 Override 를 방지합니다.
상속만 하되 변경하면 안 되는 메서드에 사용됩니다.
// Animal
public class Animal {
final void eat() {
System.out.println("냠냠");
}
void sound(){
System.out.println("동물 소리");
}
}
// Dog
public class Dog extends Animal{
// @Override
// final void eat() {
// System.out.println("냠냠");
// } -> ERROR! final 메서드는 상속이 불가능
@Override
void sound() {
System.out.println("월월");
}
}
매개변수에도 final 을 할당할 수 있습니다.
final 로 선언된 매개변수는 내부에서 변경될 수 없습니다.
public class Animal {
final void eat(final String food) {
// food = "더 좋은 음식!"; -> ERROR!
System.out.println(food + "냠냠");
}
void sound(){
System.out.println("동물 소리");
}
}
클래스
상속이 불가능한 클래스를 만들 때 final 키워드를 사용할 수 있습니다.
final public class Human {
...
}
// class DogHuman extends Human {
//
// } -> 상속 불가!
'Java > Syntax' 카테고리의 다른 글
[JAVA] 문법 정리 - 상속과 다형성, 추상화, 인터페이스 (2) | 2025.04.18 |
---|---|
[JAVA] 문법 정리 - 접근 제어자 (3) | 2025.03.08 |
[JAVA] 문법 정리 - package (0) | 2025.03.08 |
[JAVA] 문법 정리 - class (1) | 2025.03.06 |
[JAVA] 문법 정리 - 제어 흐름 (1) | 2025.02.25 |
[JAVA] 문법 정리 - 연산자 (1) | 2025.02.25 |
[JAVA] 문법 정리 - 변수 (1) | 2025.02.24 |