필드는 객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 데이터를 저장하는 곳이다. 자동차 객체를 예로 들면 제작회사, 모델, 색깔, 최고 속도는 고유 데이터에 해당되고 현재속도, 엔진 회전 수는 상태 데이터에 해당한다. 그리고 차체, 엔진, 타이어는 부품에 해당한다. 따라서 자동차 클래스를 설계할 때 이 정보들은 필드로 선언되어 있어야 한다.
필드 선언
필드 선언은 크랠스 중괄호 블록 어디서든 존재할 수 있다. 생성자 선언과 메소드 선언의 앞과 뒤 어떤 곳에서도 필드 선언이 가능하다. 하지만 생성자와 메소드 중괄호 블록 내부에는 선언될 수 없다. 생성자와 메소드 중괄호 블록 내부에 선언된 것은 모두 로컬 변수가 된다. 필드 선언은 변수의 선언 형태와 비슷하다. 그래서 일부 사람들은 클래스 멤버 변수라고 부르기도 하는데 될 수 있으면 필드 라는 용어를 그대로 사용하는 것이 좋다.
타입 필드 [ = 초기값];
타입은 필드에 저장할 데이터의 종류를 결정한다. 타입에는 기본타입과 참조타입이 모두 올 수 있다. 필드의 초기값은 필드 선언 시 주어질 수 있고, 생략될 수도 있다.
초기값이 지정되지 않은 필드는 객체 생성 시 자동으로 기본 초기값으로 설정된다. 필드의 타입에 따라 기본 초기값이 다른데, 아래 표는 필드 타입별 기본 초기값을 보여준다.
| 분류 | 타입 | 초기값 | |
| 기본타입 | 정수 타입 | byte char short int long |
0 \u0000 (빈 공백) 0 0 0L |
| 실수 타입 | float double |
0.0F 0.0 |
|
| 논리 타입 | boolean | false | |
| 참조 타입 | 배열 클래스(String 포함) 인터페이스 |
null null null |
|
정수 타입 필드는 0, 실수 타입 필드는 0.0. boolean 필드는 false로 초기화 되는것을 볼 수 있고 참조 타입은 객체를 참조하고 있지 않은 상태인 null 로 초기화가 된다.
필드 사용
필드를 사용한다는 것은 필드값을 읽고 변경하는 작업을 말한다. 클래스 내브의 생성자나 메소드에서 사용할 경우 단순히 필드 이름으로 읽고 변경하면 되지만, 클래스 외부에서 사용할 경우 우선적으로 클래스로부터 객체를 생성한 뒤 필드를 사용해야 한다. 그 이유는 필드가 객체에 소속된 데이터이므로 객체가 존재하지 않으면 필드도 존재하지 않기 때문이다.
// Person 클래스
void method(){
// Car 객체 생성
Car myCar = new Car();
// 필드 사용
myCar.speed = 60;
}
// Car 클래스
int speed;
// 생성자
Car(){
speed = 0;
}
// 메소드
void method(...){
speed = 10;
}
위 코드를 보면 Car 클래스의 speed 필드는 생성자와 메소드에서 변경이 가능하다. 사용 방법은 변수와 동일한데, 차이점으로 변수는 자신이 선언된 생성자 또는 메소드 블록 내부에서만 사용할 수 있는 반면 필드느 생성자와 모든 메소드에서 사용이 가능하다는 점에서 다르다.
하지만 외부 Person 클래스에서 Car 클래스의 speed 필드값을 사용하려면 아래와 같이 Car 객체를 우선 생성해야 한다.
Car myCar = new Car();
myCar 변수가 Car 객체를 참조하게 되면 도트(.) 연산자를 사용해서 speed 필드에 접근할 수 있다. 도트(.) 연산자는 객체 접근 연산자로 객체가 가지고 있는 필드나 메소드를 사용하고자 할 때 사용된다.
아래 코드는 Car 객체의 speed 필드값을 60으로 변경하고 있다.
myCar.speed = 60;