관리 메뉴

hhnn_soph

[Java] 클래스 구성 요소(필드 및 생성자) 본문

Language/Java

[Java] 클래스 구성 요소(필드 및 생성자)

hhnn_soph 2021. 9. 13. 04:51

클래스의 구성 멤버는 필드, 생성자, 메서드 3가지! 해당 멤버들은 생략되거나 여러 개 작성될 수 있다.

public class ClassName {
	// 필드
    int fieldName;
    
    // 생성자
    ClassName(){
    }
    
    // 메서드
    void methodName(){
    }
}

 

📙 필드(Field)

객체의 고유 데이터가 저장되는 곳

1. 필드 선언

- 클래스 { } 블록 내부 어디서든 선언 가능

- 생성자와 메서드 전체에서 사용되며 객체가 소멸되지 않은 한 객체와 함께 존재

- 선언 형태는 변수와 비슷하지만 변수라고 부르지 않음  

- 필드의 초기값은 필드 선언 시 주어질 수도 있고 생략될 수도 있음

  : 초기값 생략된 경우, 객체 생성 시 자동으로 기본 초기값(0, 0.0, false, null) 설정됨

// 설명
데이터타입 필드명;
데이터타입 필드명 = 초기값;

// ex. 자동차 클래스
public class Car {
  // 초기값 설정
  String company = "현대자동차";
  String model = "그랜져";
  int maxSpeed = 300;
  
  // 초기값 미설정
  int productionYear;
  boolean engineStart;
  
  // 클래스 타입
  Body body;
  Engine engine;
  Tire tire;
}

 2. 필드 사용

- 필드 값을 읽고 변경하는 작업

- 클래스 외부에서 사용하고자 하면 우선 객체 생성해야 함

- 객체 생성 후 도트( . ) 연산자를 통해 필드에 접근

public class CarExample {
	public static void main(String[] args){
    	// 객체생성
        Car myCar = new Car();
        
        // 필드값 읽기
        System.out.println("제작회사: " + myCar.company);
        System.out.println("모델명: " + myCar.model);
        
        // 필드값 수정
        myCar.productionYear = 2021;
        System.out.println("제작연도: " + myCar.productionYear);
    }
}

// 실행결과
제작회사: 현대자동차
모델명: 그랜져
제작연도: 2021

3. 필드 초기화 방법

1) 필드 선언 시 초기값 주기(위의 방법으로)

  : 동일한 클래스로부터 생성되는 객체들은 모두 같은 데이터를 가짐

2) 생성자에서 초기값 주기(다음 내용 참고)

 

📙 생성자(constructor)

- 모든 클래스는 생성자가 반드시 존재하며 new 연산자로 호출됨

- 객체 생성 시 초기화를 담당하여 필드 초기화 혹은 메서드 호출하여 객체를 사용할 준비함

- 생성자를 실행시키지 않고 클래스로부터 객체 생성 불가

1. 기본 생성자(Default Constructor)

- 가장 기본이 되는 형태

 

     [public] 클래스명( ) { }
public class Car {
	// 기본생성자
	public Car () { 
        }
}

- 생성자 선언 생략 시 컴파일러가 기본 생성자를 바이트 코드에 자동 추가

- 클래스의 접근 제한자가 public이면 생성자에도 작성. 없다면 생성자에도 생략.

- 명시적으로 선언한 생성자가 1개라도 있으면 컴파일러는 기본 생성자 추가하지 않음

 

2. 생성자 선언

- 메서드와 비슷하지만 리턴 타입 없고 클래스 이름과 동일

- 객체를 다양하게 초기화하기 위해 명시적으로 생성자를 선언할 수도 있음

- 생성자 내 매개 변수 선언은 생략 혹은 여러 개 선언 가능

- 매개변수

  : new 연산자로 생성자 호출 시 외부의 값을 생성자 블록 내부로 전달

  : 매개변수명은 필드와 동일한 이름 사용

  : 매개변수명과 필드명이 동일하기 때문에 필드 앞에 this. 를 붙여 명시

// 생성자 선언
public class Car {
	// 필드선언
    String model;
    String color;
    int maxSpeed;
    
	// 명시된 생성자
    public Car(String model, String color, int maxSpeed) {
    	this.model = model;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
}

3. 필드 초기화

- 객체 생성 시점에서 외부에서 제공되는 매개변수 값으로 초기화함

- 중요한 몇 개 필드만 매개변수 통해 초기화하기

// 생성자를 호출해 객체 생성 및 초기화
public class CarExample{
	public static void main(String[] args){
    	Car myCar = new Car("그랜저", "검정", 300);
        // 생성자가 명시된 경우, 기본 생성자가 자동생성되지 않기 때문에
        // 기본 생성자 호출 불가
        // Car myCar = new Car();
    }
}

4. 생성자 오버 로딩(Overloading)

- 매개 변수를 달리하는 생성자를 여러 개 선언하는 것

- 외부의 다양한 데이터 이용해 객체 초기화하기 위해 생성자도 다양화한 것

- 선언한 생성자의 개수만큼 선택하여 활용할 수 있음

public class Car {
    public Car() { ... }
    public Car(String model) { ... }
    public Car(String model, String color) { ... }
    public Car(String model, String color, int maxSpeed) { ... }
}

- 주의 : 매개 변수 타입, 개수, 순서가 같을 경우 오버 로딩이 아님

public class Car {
    public Car(String color, String model) { ... }
    public Car(String model, String color) { ... }
}

5. 다른 생성자 호출

- 매개 변수의 수만 달리하고 필드 초기화 내용이 비슷한 생성자에서 사용 (오버 로딩)

- this( ) : 반드시 생성자의 첫 줄에서 사용

- this( ) 다음엔 추가적인 실행문 작성하여 진행할 수 있음

public class Car {
    String model;
    String color;
    int maxSpeed;
    
	// 생성자
    public Car() {
    }
    
    public Car(String model) {
    	this(model, "은색", 250);
    }
    
    public Car(String model, String color) {
    	this(model, color, 250);
    }
    
    //호출된 생성자(공통실행코드)
    public Car(String model, String color, int maxSpeed) {
    	this.model = model;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
}