본문 바로가기
Programming Language/Java

[Java/개념] 필드(Field)와 생성자(Constructor)

by woongii 2024. 10. 12.

1. 클래스란?

클래스는 객체를 생성하기 위한 설계도이다.자바에서 클래스는 사용자 정의 자료형으로서, 필드와 메소드를 통해 객체의 속성과 동작을 정의한다.  클래스는 메모리 내에서 인스턴스로 생성되며, 객체는 이 클래스의 실체라고 할 수 있다.

 

1) 객체 생성 과정

객체가 생성되는 과정은 다음과 같다.

  • new 연산자를 통해 메모리에 객체가 할당된다.
  • 생성자가 호출되어 필드가 초기화된다.
  • 객체가 완전히 생성되고, 객체의 주소가 반환된다.
Car myCar = new Car("검정", 3000);
 

위 코드에서 myCar 객체는 Car 클래스의 생성자를 통해 생성되고, 필드인 color와 cc가 초기화된다.

2. 필드(Field)

필드는 객체의 상태와 고유한 속성 값을 저장하는 변수이다. 필드는 클래스 내에서 선언되며, 객체가 생성될 때 함께 메모리 상에 할당된다. 필드는 객체의 고유 데이터와 상태 정보를 저장하는 역할을 하며, 인스턴스 필드와 클래스 필드(static field)로 나눌 수 있다.

 

1) 필드 선언 및 사용

필드는 클래스의 중괄호 {} 블록 어디에서든 선언할 수 있다. 하지만 생성자와 메소드 중괄호 내부에는 선언할 수 없다. 필드는 변수와 선언 형태가 유사하지만, 객체의 생성과 함께 메모리에 할당되며, 클래스 전체에서 접근할 수 있는 특성을 가진다.

타입 필드명 = 초기값; // 초기값 생략 가능

 

 

public class Car { 
	String company = "현대자동차"; 
	String model = "그랜저"; 
	String color = "검정"; 
	int maxSpeed = 350; 
	int speed; 
}

 

타입에는 기본 타입(int, boolean 등)과 참조 타입(String, 배열 등)이 모두 올 수 있다. 초기값은 주어질 수도 있고 생략할 수도 있다. 초기값이 지정되지 않은 필드는 객체 생성 시 자동으로 기본 값으로 설정된다.

 

2) 필드의 초기화

필드는 객체가 생성될 때, 자동으로 기본 값으로 초기화된다. 기본 값은 필드의 데이터 타입에 따라 결정되며, 참조형 필드는 null, 숫자형 필드는 0, 불리언은 false로 초기화된다.

 

 

 

3) 필드와 지역 변수의 차이

  • 필드는 클래스 레벨에서 선언되며, 객체가 살아있는 동안 메모리에 존재합니다.
  • 지역 변수는메소드 내에서 선언되며, 메소드 실행이 끝나면 사라집니다.

 

 

4) 필드 사용

필드를 사용하는 것은 필드의 값을 읽고 변경하는 작업을 의미한다. 클래스 내부의 생성자 및 메소드에서 사용할 때는 필드 이름을 그대로 사용한다. 외부에서 필드를 사용하려면 객체를 생성한 후, 그 객체의 필드를 참조해야 한다.

Car myCar = new Car();  // 객체 생성
System.out.println(myCar.color);  // 필드 사용
myCar.speed = 60;  // 필드 값 변경

 

5) 도트(.) 연산자

필드나 메소드를 사용하려면 도트(.) 연산자를 사용하여 객체를 통해 접근한다. 객체가 가진 속성(필드)이나 동작(메소드)을 사용하려는 경우에 도트 연산자를 사용한다.

 

3. 생성자(Constructor)

생성자는 클래스에서 객체가 생성될 때 호출되며, 필드를 초기화하고 객체를 사용할 준비를 하는 역할을 한다. 생성자는 메소드와 비슷한 형태를 띠지만, 반환 타입이 없고, 클래스와 같은 이름을 가져야 한다.

 

1) 기본 생성자

생성자가 따로 정의되지 않은 경우, 자바는 자동으로 기본 생성자(Default Constructor)를 제공한다. 하지만 개발자가 명시적으로 생성자를 선언하면, 기본 생성자는 제공되지 않는다.

 

2) 생성자 선언

생성자는 클래스 내부에서 다음과 같이 선언된다.

public 클래스명(매개변수) { 
	// 필드 초기화 코드 
}
 

예를 들어, Car 클래스의 생성자를 정의하면

public class Car { 
    String color; 
    int cc; 
    
    // 생성자 
    public Car(String color, int cc) { 
        this.color = color; 
        this.cc = cc; 
    }
}

 

생성자를 통해 객체를 생성할 때 필드를 초기화할 수 있다.

Car myCar = new Car("검정", 3000);

 

3) 생성자 오버로딩

생성자는 오버로딩(Overloading)이 가능하다. 이는 동일한 이름의 생성자를 매개변수의 타입이나 개수에 따라 여러 개 정의하는 것을 의미한다.

public class Car {
    Car() {}  // 기본 생성자
    Car(String model) {}  // 오버로딩 생성자
    Car(String model, String color) {}  // 또 다른 오버로딩 생성자
}

 

4) this() 생성자 호출

생성자에서 다른 생성자를 호출할 수 있으며, 이를 this()로 표시한다. this()는 생성자 첫 줄에서만 사용할 수 있다.

public class Car { 
    String model;
    String color; 
    int maxSpeed; 
    
    Car(String model) { 
        this(model, "흰색", 200); // 다른 생성자 호출 
    } 
    
    Car(String model, String color, int maxSpeed) { 
        this.model = model; 
        this.color = color; 
        this.maxSpeed = maxSpeed; 
    } 
}
 

4. 필드와 생성자의 특징

 

 

필드는 객체의 상태를 유지하고, 생성자는 그 필드를 초기화하는 역할을 한다. 생성자를 통해 객체가 초기화되지 않으면 객체는 올바르게 동작할 수 없다. 이러한 이유로, 생성자는 객체의 필드 초기화에 매우 중요한 역할을 한다.