본문 바로가기

Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어]/4. 객체지향 프로그래밍

3. Java 자바 - 클래스의 구성 멤버 [ 필드 ]

클래스에는 객체가 가져야할 구성 멤버가 선언된다.

 

구성 멤버에는

 

필드(Field)

생성자(Constructor)

메소드(Method) 가 있다.

 

이 구성 멤버들은 생략되거나 복수 개가 작성될 수 있다.

 

객체의 구성 멤버

 

- 필드

 

    객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳이다.

    선언된 형태는 변수와 비슷하지만, 필드를 변수라 부르지는 않는다.

    변수는 생성자와 메소드 내에서만 사용되고, 생성자와 메소드가 실행 종료되면 자동 소멸된다.

    필드는 생성자와 메소드 전체에서 사용되며, 객체가 소멸되지 않는 한 객체와 함께 존재한다.

 

- 생성자

 

    new 연산자로 호출되는 특별한 중괄호 { } 블록이다.

    객체 생성 시 초기화를 담당한다. (필드를 초기화하거나, 메소드를 호출해서 객체를 사용할 준비를 한다.)

    메소드와 비슷하게 생겼지만, 클래스 이름으로 되어 있고, 반환 타입이 없다.

 

- 메소드

 

    객체의 동작에 해당하는 중괄호 { } 블록이다.

    중괄호 블록은 이름을 가지고 있는데, 이것이 메소드 이름이다.

    메소드를 호출하게 되면 중괄호 블록의 모든 코드들이 일괄적으로 실행된다.

 

    메소드는 필드를 읽고 수정하는 역할도 하지만, 다른 객체를 생성해서 다양한 기능을 수행하기도 한다.

    메소드는 객체 간의 데이터 전달 수단으로 사용된다.

    외부로부터 매개값을 받을 수 있고, 실행 후 어떤 값을 반환할 수도 있다.

 


 

1. 필드 (Field)

 

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

 

ex) 자동차 객체

    고유 데이터 : 제작회사, 모델명, 색깔, 최고 속도

    상태 데이터 : 현재 속도, 엔진 회전 수

    부품 : 차체, 엔진, 타이어

 

자동차 클래스를 설계 시 위의 정보들은 필드로 선언되어야 한다.

 

 

 

필드 선언

 

필드 선언은 중괄호 블록 어디서든 존재할 수 있다.

생성자 선언과 메소드 선언의 앞, 뒤 어디서든 필드 선언이 가능하다.

 

하지만, 생성자와 메소드 중괄호 블록 내부에는 선언될 수 없다.

생성자와 메소드 중괄호 내부에 선언된 것은 모두 로컬 변수가 된다. (필드라고 하지 않음)

 

필드 선언은 변수의 선언 형태와 비슷하다. (클래스 멤버 변수로 부르기도 한다.)

 

 

필드 선언 형태

 

타입 필드 [ = 초기값];

 

- 타입 : 필드에 저장할 데이터의 종류를 결정한다. (기본 타입, 참조 타입 모두 가능하다.)

 

ex)

 

String company = "KT";
int maxSpeed = 300;
int currentSpeed;
boolean engineStart;

 

만약 초기값이 지정되지 않은 필드들은 객체 생성 시 자동으로 기본 초기값으로 설정된다.

 

분류

데이터 타입

초기값

정수 타입

byte

0

char

\u0000 (빈 공백)

short

0

int

0

long

0L

실수 타입

float

0.0F

double

0.0

논리 타입

boolean

false

참조타입

배열

null

클래스(String 포함)

null

인터페이스

null

 

필드 사용

 

필드를 사용하는 것은 필드값을 읽고, 변경하는 작업을 말한다.

 

클래스 내부의 생성자나 메소드에서 사용할 경우 단순히 필드 이름으로 읽고 변경하면 되지만,

 

클래스 외부에서 사용할 경우 우선적으로 클래스로부터 객체를 생성한 뒤 필드를 사용해야 한다.

필드는 객체에 소속된 데이터이므로 객체가 존재하지 않으면 필드도 존재하지 않기 때문이다.

 

 

 

Car 클래스의 speed 필드는 생성자와 메소드에서 변경이 가능하다. ( 사용 방법이 변수와 동일)

 

변수는 자신이 선언된 생성자 또는 메소드 블록 내부에서만 사용할 수 있는 반면, (지역 변수)

필드는 생성자와 모든 메소드에서 사용 가능하다. ( 전역 변수같은 느낌)

 

외부 Person 클래스에서 Car 클래스의 speed 필드값을 사용하려면, Car 객체를 우선 생성해야 한다.

 

Car myCar = new Car();

 

myCar 변수가 Car 객체를 참조하게 되면 도트 ( . ) 연산자로 speed 필드에 접근할 수 있다.

 

도트 ( . ) 연산자는 객체 접근 연산자로 객체가 가지고 있는 필드, 메소드를 사용하고자 할 때 사용된다.

 

myCar.speed = 60;

Car 객체의 speed 필드값을 60으로 변경

 

ex)

Car.java : Car 클래스 필드 선언

public class Car {
    //필드 선언
    String company = "KIA";
    String model = "Sorento";
    String color = "black";
    int maxSpeed = 280;
    int speed;
}

 

CarExample.java : 외부 클래스에서 Car 필드값 읽고 변경하기

public class CarExample {
    public static void main(String[] args) {
        //객체 생성
        Car myCar = new Car();
        
        //필드값 읽기
        System.out.println("제작회사 : "+ myCar.company);
        System.out.println("모델명 : "+ myCar.model);
        System.out.println("색깔 : "+ myCar.color);
        System.out.println("최고 속도 : "+ myCar.maxSpeed);
        System.out.println("현재 속도 : "+ myCar.speed);
        
        //필드값 변경
        myCar.speed = 60;
        System.out.println("변경된 속도 : "+ myCar.speed);
    }
}

 

ex) 여러가지 타입들의 필드의 자동 초기화 값 확인

 

FieldInitValue.java : 필드 자동 초기화

public class FieldInitValue {
    //필드
    byte byteField;
    short shortField;
    int intField;
    long longField;
    
    boolean booleanField;
    char charField;
    
    float floatField;
    double doubleField;
    
    int[] arrField;
    String referenceField;
}

 

FieldInitValueExam.java : 필드값 출력

public class FieldInitValueExam {
    public static void main(String[] args) {
        FieldInitValue fiv = new FieldInitValue();
        
        System.out.println("byteField : "+ fiv.byteField);    // 0
        System.out.println("shortField : "+ fiv.shortField);  // 0
        System.out.println("intField : "+ fiv.intField);      // 0
        System.out.println("longField : "+ fiv.longField);    // 0
        System.out.println("booleanField : "+ fiv.booleanField);  // false
        System.out.println("charField : "+ fiv.charField);     // 빈 공백
        System.out.println("floatField : "+ fiv.floatField);   // 0.0
        System.out.println("doubleField : "+ fiv.doubleField);  // 0.0
        System.out.println("arrField : "+ fiv.arrField);        // null
        System.out.println("referenceField : "+ fiv.referenceField);  // null
    }
}