정적 멤버는 클래스에 고정된 멤버로 객체를 생성하지 않고 바로 사용할 수 있는 필드와 메소드를 의미한다.
static 영역은 클래스의 원본이 자리잡은 곳.
member에게 static 키워드를 붙이면 static 영역에 저장이 된다.
public class Example{
// 정적 필드
static int val;
// 정적 메서드
static String exMethod(){
(...)
}
}
객체(인스턴스)마다 가지고 있어야할 데이터 / 메서드 = 인스턴스 필드 / 메서드
객체(인스턴스)들이 공통으로 가지고 있는 데이터 / 메서드 = 정적 필드 / 메서드
public class Inner {
public static void main(String[] args) { // static 이므로 원본영역
// 같은 클래스에서 영역이 같으면 그냥 호출 가능
st_msg("hello static member"); // st_msg -> static 영역
// 같은 클래스라 하더라도 static 영역에서 일반영역에 있는 member를 호출 할때 생성자를 호출한뒤 사용
Inner inner = new Inner();
inner.h_msg("Hello Java"); // h_msg -> heap영역
}
static void st_msg(String msg) {
System.out.println("static 멤버 메세지 : "+msg);
}
void h_msg(String msg) {
System.out.println("일반 영역 메세지 : "+msg );
// 일반 메서드에서 static메서드를 호출할때?
Inner.st_msg(msg+" from heap"); // 클래스에 직접 접근하여 메서드 호출
}
}
final키워드는 변수, 메서드, 클래스에 사용된다. 이 중 어디에 사용되냐에 따라 다른 의미를 가지고 있지만 공통적으로 무언가를 제한 한다는 의미를 가지고있다.
- final은 한번 지정되면 프로그램 종료시 까지 변경이 불가능하다
- 생성자에 의해서만 초기화가 가능하다
static final의경우 객체화 초기화가 되지 않아 불변의 값으로 간주한다.
이것을 상수(Contant)라고 하며 모두 대문자로 표기한다.
예제 )
public class Person {
final String nation;
final String name;
// 상수는 전체 대문자로 표기한다 ( tip : ctrl + shift + x (전체 대문자 단축키 )
static final String SSN = "230811-1234567";
/*
* final은 초기화를 해줘야만 한다
* 필드 기본값을 주지 않으면 생성자에서라도 무조건 초기화를 해주어야함
*/
public Person(String nation, String name) {
this.nation = nation;
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person("KOREA", "김이박");
// final은 한번 초기화 되면 바꾸지 못한다.
// person.name = "KimLeePark";
System.out.println(person.nation);
System.out.println(person.name);
System.out.println(Person.SSN);
}
}