🌎 Web/Java

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

오늘 ONEUL 2022. 11. 25. 04:20
Chapter 06 클래스
   06-1 객체 지향 프로그래밍
   06-2 필드
   06-3 생성자
   06-4 메소드
   06-5 인스턴스 멤버와 정적 멤버
   06-6 패키지와 접근 제한자

 

 

06 클래스

06-2 필드

시작하기 전에

  • 필드(Field) 란?
    • 객체의 고유 데이터, 객체가 가져가야 할 부품, 객체의 현재 상태 데이터 등을 저장하는 곳을 의미한다.

 

필드 선언

  • 클래스 중괄호 {} 블록 어디서든 존재 가능하다.
  • 생성자와 메소드 중괄호 블록 내부에는 선언 불가하다.
  • 변수와 선언 형태 유사하나 변수 아님에 주의한다.
타입 필드 [ = 초기값];
  • 타입에는 기본 타입과 참조 타입이 모두 올 수 있다.
  • 초기값은 주어질 수도, 생략할 수도 있다.
  • 초기값 지정되지 않은 필드는 객체 생성 시 자동으로 기본 초기값 설정된다.

 

필드 사용

  • 필드를 사용한다? 필드 값을 읽고 변경하는 작업을 의미한다.
  • 클래스 내부 생성자 및 메소드에서 사용하는 경우: 필드 이름으로 읽고 변경한다.
  • 클래스 외부에서 사용하는 경우: 클래스로부터 객체 생성한 뒤 필드 사용한다.
  • 필드와 변수의 차이점은?
    • 변수는 자신이 선언된 생성자 또는 메소드 블록에서만 변경 가능하다.
    • 필드는 생성자와 모든 메소드에서 사용이 가능하다.
  • 도트(.) 연산자란?
    • 객체 접근 연산자로 객체가 가지고 있는 필드나 메소드를 사용하고자 할 때 사용된다.
package chap06.sec02.exam01;

public class Car {
    // 필드
    String company = "현대자동차";
    String model = "그랜저";
    String color = "검정";
    int maxSpeed = 350;
    int speed;
}
package chap06.sec02.exam01;

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); // 초기값 0

        // 필드값 변경
        myCar.speed = 60;
        System.out.println("수정된 속도: " + myCar.speed);
    }
}

 

 

06-3 생성자

시작하기전에

  • 생성자(Constructor)란?
    • 클래스로부터 new 연산자로 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.
  • 객체 초기화란?
    • 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것을 의미한다.
  • 생성자가 성공적으로 실행되면 힙(heap) 영역에 객체가 생성되고 객체 번지가 리턴된다. 리턴된 객체의 번지는 클래스 변수에 저장된다.

 

기본 생성자

  • 클래스 내부에 생성자 선언 생략할 경우 기본 생성자(default constructor)를 바이트 코드에 자동 추가한다.
  • 클래스에 생성자가 1개라도 있으면 컴파일러는 기본 생성자를 추가하지 않는다.

 

생성자 선언

클래스(매개변수선언, ...) {
	// 객체의 초기화 코드
}
  • 메소드와 비슷한 모양이나, 리턴 타입이 없고 클래스 이름과 동일하다.
  • 매개 변수 선언은 생략할 수도 있고 여러 개 선언할 수도 있다.
  • 매개 변수는 new 연산자로 생성자를 호출할 때 외부의 값은 생성자 블록 내부로 전달하는 역할을 한다.
package chap06.sec03.exam01;

public class Car {
    Car(String color, int cc) {};
}
package chap06.sec03.exam01;

public class CarExample {
    public static void main(String[] args) {
        Car mycar = new Car("검정", 3000);
        // 생성자를 명시적으로 선언했기 때문에 기본 생성자 사용할 수 없음
    }
}

 

필드 초기화

  • 필드를 기본 초기값이 아닌 다른 값으로 초기화하고 싶다면?
    • 필드를 선언할 때 초기값을 주는 방법: 동일 클래스로 생성되는 객체는 모두 같은 값을 갖는다.
    • 생성자에서 초기값을 주는 방법: 외부에서 제공되는 다양한 값으로 초기화할 수 있다.
public class Korean {
	// 필드
	String nation = "대한민국";
	String name;
	String ssn;

	// 생성자
	public Korean(String n, String s) {
		name = n;
		ssn = s;
	}
}
Korean k1 = new Korean("박자바", "011225-1234567");
Korean k2 = new Korean("김자바", "930525-0987654");

 

  • 매개 변수 이름은 필드 이름과 유사하거나 동일한 것을 사용한다.
  • 필드와 매개 변수 이름이 완전히 동일할 경우 this.필드로 표현한다.
public Korean(String name, String ssn) {
	this.name = name;
	this.ssn = ssn;
}

 

생성자 오버로딩

  • 생성자 오버로딩(overloading)이란?
    • 매개 변수의 타입, 개수, 순서를 달리하는 생성자를 여러 개 선언하는 것을 의미한다.
public class 클래스 {
	클래스 ([타입 매개변수, ...]) {
		...
	}

	클래스 ([타입 매개변수, ...]) {
		...
	}
}
public class 클래스 {
	Car() {...}
	Car(String model) {...}
	Car(String model, String color) {...}
	Car(String model, String color, int maxSpeed) {...}
}
  • 생성자 오버로딩 시 주의할 점
    • 매개 변수의 타입, 개수, 선언된 순서가 똑같을 경우 매개 변수의 이름만 바꾸는 것은 생성자 오버로딩이 아니다.

 

다른 생성자 호출: this()

  • 생성자에서 다른 생성자를 호출하는 코드
  • 필드 초기화 내용을 한 생성자에만 집중 작성하고 나머지 생성자는 초기화 내용을 가진 생성자를 호출한다.
  • 생성자 첫 줄에서만 허용된다.

 

마무리 핵심 포인트

  • 필드 선언: 클래스 중괄호 {} 블록 어디서든 선언하나, 생성자와 메소드 내부에서는 선언할 수 없다.
  • 필드 사용: 클래스 내부의 생성자와 메소드에서 바로 사용이 가능하나, 클래스 외부에서 사용할 경우에는 반드시 객체를 생성하고 참조 변수를 통해 사용해야 한다.
  • 기본 생성자: 클래스 선언 시 컴파일러에 의해 자동으로 추가되는 생성자이다.
  • 생성자 선언: 클래스로부터 객체를 생성할 때 호출되는 생성자를 명시적으로 선언할 수 있다. 생성자를 선언하면 기본 생성자는 생성되지 않는다.
  • 매개 변수: 생성자 호출 시 값을 전달받기 위해 선언되는 변수를 말한다.
  • 객체 초기화: 객체를 사용하기 전에 준비하는 과정으로 필드를 선언할 때 초기화하거나 생성자 내부에서 필드 값을 초기화할 수 있으며, 메소드를 호출하는 내용으로 구성된다.
  • 오버로딩: 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 말한다.
  • this(): 객체 자신의 또 다른 생성자를 호출할 때 사용한다.

 

 

 

※ 이 내용은 책 [혼자 공부하는 자바]를 보고 정리한 내용입니다.