🌎 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(): 객체 자신의 또 다른 생성자를 호출할 때 사용한다.
※ 이 내용은 책 [혼자 공부하는 자바]를 보고 정리한 내용입니다.