5. 클래스(2)(정적멤버와static/ final 필드와 상수)
1. 정적 멤버와 static
정적 멤버: 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드
(1) 인스턴스 멤버로 선언할지 정적 멤버로 선언할지 판단하는 기준
객체마다 가지고 있어야 할 데이터 → 인스턴스 필드
객체마다 가지고 있을 필요성 없는 공용적 데이터 → 정적 필드
인스턴스 필드를 이용해 실행해야 함 → 인스턴스 메소드
인스턴스 필드를 이용x → 정적 메소드
(2) 정적멤버의 선언과 사용
필드와 메소드 선언 시 static 키워드를 추가적으로 붙임
public class 클래스{
//정적 필드
static 타입 필드 [=초기값];
//정적 메소드
static 리 타입 메소드( 매개변수선언, ...){...}
}
클래스 이름과 함께 도트(.) 연산자로 접근
클래스.필드;
클래스.메소드(매개값,...);
public class Calculator{
static double pi = 3.14159;
static int plus(int x, int y){...}
static int minus(int x, int y){...}
}
double result1 = 10 * 10 * Calculator.pi;
int result2 = Calculator.plus(10, 5);
int result3 = Calculator.minus(10, 5 );
(3) 정적 초기화 블록
정적 필드는 필드 선언과 동시에 초기값을 주는 것이 일반적이나
따로 초기화를 해주어야 하는 경우도 있다.
이 경우 인스턴스 필드는 생성자에서 초기화,
정적 필드는 정적 블록을 이용해 초기화
(정적 필드는 객체 생성 없이도 사용해야하므로 생성자에서 초기화 할 수 x 때문)
public class Television{
static String company = "Samsung";
static String model = "LCD";
static String info;
//정적 초기화 블록
static{
info = company + "-" + model;
}
}
(4) 정적 메소드와 블록 선언 시 주의점
정적 메소드와 정적 블록 내부에
인스턴스 필드나 인스턴스 메소드, 객체 자신 참조인 this키워드를 사용할 수 x
(정적 메소드와 정적 블록은 객체가 없어도 실행되기 때문임)
정적 메소드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면
객체를 먼저 생성하고 참조 변수로 접근해야 함
2. final 필드와 상수
(1) final 필드
: 초기값이 저장되면 이것이 최종적인 값이 되어 프로그램 실행 도중에 수정할 수 없음
final 타입 필드 [= 초기값];
final필드는 필드 선언 시 초기값을 주거나, 생성자에서 최종 초기화를 마쳐야 함
초기화되지 않은 final 필드를 그대로 남겨두면 컴파일 에러 발생함
public class Person{
final String nation = "Korea";
final String ssn;
String name;
public Person(String ssn, String name){
this.ssn = ssn;
this.name = name;
}
}
(2) 상수(static final)
: 불변의 값을 저장하는 필드
final 필드: 객체마다 저장되고, 생성자의 매개값을 통해 여러가지 값으로 초기화될 수 o
static final 필드: 객체마다 저장되지 않고, 클래스에만 포함되며 한 번 초기값이 저장되면 변경 불가능
static final 타입 상수 [= 초기값];
static final 타입 상수;
static{
상수 = 초기값;
}