[혼공자] 06-2. 필드

Benjamin·2023년 3월 3일
0

혼공자

목록 보기
16/27

06-2. 필드

필드는 객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 데이터를 저장하는 곳이다.

자동차를 예로 들어보자.
제작회사, 모델, 색깔, 최고 속도는 고유 데이터에 해당하고, 현재 속도, 엔진 회전 수는 상태 데이터에 해당한다. 그리고 차체, 엔진, 타이어는 부품에 해당한다.
따라서 자동차 클래스를 설계할 때 이 정보들은 필드로 선언되어야한다.

필드 선언

필드 선언은 클래스 중괄호 {} 블록 어디서든 존재할 수 있다.
생성자 선언과 메소드 선언의 앞과 뒤 어떤 곳에서도 필드 선언이 가능하다.
하지만 생성자와 메소드 중괄호 {} 블록 내부에는 선언될 수 없다.

생성자와 메소드 중괄호 블록 내부에 선언된 것은 모두 로컬 변수가 된다.
필드 선언은 변수 선언 형태와 비슷해서 일부 사람들은 클래스 멤버 변수라고 부르기도 하는데, 될 수 있으면 필드라는 용어를 그대로 사용하는게 좋다.
타입 필드 [= 초기값];

타입은 필드에 저장할 데이터의 종류를 결정한다.
타입에는 기본타입(byte, short, int, long, float, double, boolean)과 참조타입(배열, 열거, 클래스, 인터페이스)이 모두 올 수 있다.
필드의 초기값은 필드 선언 시 주어질수도있고 생략될 수도 있다.

초기값이 지정되지 않은 필드는 객체 생성 시 자동으로 기본 초기값으로 설정된다.
필드 타입따라 기본 초기값이 다른데, 다음 표는 필드 타입별 기본 초기값을 보여준다.

대분류중분류타입초기값
기본타입정수타입byte0
기본타입정수타입char\u0000 (빈 공백)
기본타입정수타입short0
기본타입정수타입int0
기본타입정수타입long0L
기본타입실수타입float0.0F
기본타입실수타입double0.0
기본타입논리타입booleanfalse
참조타입-배열null
참조타입-클래스(String포함)null
참조타입-인터페이스null

참조타입은 객체를 참조하고 있지 않은 상태인 null로 초기화된다.

필드 사용

필드를 사용한다는 것은 필드 값을 읽고 변경하는 작업을 말한다.
클래스 내부의 생성자나 메소드에서 사용할 경우 단순히 필드 이름으로 읽고 변경하면 되지만,클래스 외부에서 사용할 경우 우선적으로 클래스로부터 객체를 생성한 뒤 필드를 사용해야한다.
그 이유는 필드가 객체에 소속된 데이터이므로 객체가 존재하지 않으면 필드도 존재하지 않기 때문이다.

위 그림을 보면 Car클래스의 speed 필드는 생성자와 메소드에서 변경이 가능하다.
사용 방법은 변수와 동일한데, 차이점으로 변수는 자신이 선언된 생성자 또는 메소드 블록 내부에서만 사용할 수 있는 반면 필드는 생성자와 모든 메소드에서 사용 가능하다.

하지만 외부 Person 클래스에서 Car클래스의 speed 필드값을 사용하려면 Car 객체를 우선 생성해야한다.
Car myCar = new Car();

myCar 변수가 Car 객체를 참조하게 되면 도트(.) 연산자를 사용해서 speed 필드에 접근할 수 있다.
도트(.)연산자는 객체 접근 연산자로 객체가 가지고있는 필드나 메소드를 사용하고자 할 때 사용된다.

package sec02.exam01;

public class Car{
	// 필드
    String company = "현대자동차";
    int maxSpeed = 350;
    int speed;
}
package sec02.exam01;

public class CarExample{
	publuc static void main(String[] args) {
    	Car myCar = new Car();
        
        // 필드값 읽기
        System.out.println(company); //현대자동차
        System.out.println(maxSpeed); //350
        System.out.println(speed); //0 : 초기값 주지않았지만 출력해보면 기본값 0이 저장되어있는것을 알 수 있음 
        
        //필드값 변경
        myCar.speed = 60;
        SYstem.out.println(speed); //60
    }
}

다음은 여러 타입의 필드가 어떤 값으로 자동 초기화되는지 확인해보는 코드다.

package sec02.exam02;

public class FieldInitValue{
	//필드
    byte byteField;
    long longField;
    
    char charField;
    
    float floatField;
    
    int[] arrField;
    String referenceField;
}
package sec02.exam02;

public class FieldInitValueExample{
	publuc static void main(String[] args) {
    	FieldInitValue fiv = new FieldInitValue();
        
        System.out.println(byteField); //0
        System.out.println(longField); //0
        System.out.println(charField); //
        System.out.println(floatField); //0.0
        System.out.println(arrField); //null
        System.out.println(referenceField); //null
        
    }
}

출처
혼자 공부하는 자바

0개의 댓글