📆 2022년 07월 10일
⏰ 23시 00분 ~ 22시 00분
✍ 혼자 공부하는 자바(신용권)
1. 생성자 & 객체 초기화
1) 생성자
- new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당
2) 객체 초기화
- 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것
❕ 생성자를 실행하지 않고는 클래스로부터 객체를 만들 수 없다.
2. 기본 생성자
- 클래스는 생성자가 반드시 존재하고 생성자를 하나 이상 가질 수 있다.
- 클래스 내부에 생성자 선언을 생략했다면 컴파일러는 다음과 같이 중괄호{} 블록 내용이 비어 있는 기본 생성자를 바이트 코드에 자동 추가
//소스 파일(Car.java)
public class Car{
}
/* 컴파일⬇ */
public class Car{
public Car() { } //자동 추가
}
❗ 그러나 클래스에 명시적으로 선언한 생성자가 1개라도 있으면 컴파일러는 기본 생성자를 추가하지 않는다.
- 명시적으로 생성자를 선언하는 이유는 객체를 다양한 값으로 초기화하기 위해서
3. 생성자 선언
- 기본 생성자 대신 우리가 생성자를 명시적으로 선언하려면 다음과 같은 형태로 작성해야 한다.
//생성자 블록
클래스 ( 매개변수선언, ... ){
//객체의 초기화 코드
}
- 생성자 : 메소드와 비슷한 모양을 가지고 있으나, 리턴 타입이 없고 클래스 이름과 동일
- 생성자 내부 : 객체 초기화 코드가 작성, 일반적으로 필드에 초기값을 저장하거나 메소드를 호출하여 객체 사용 전에 필요한 준비를 함
1) 매개 변수
- new 연산자로 생성자를 호출할 때 외부의 값을 생성자 블록 내부로 전달하는 역할
- 선언은 생략할 수도 있고 여러 개를 선언해도 좋음
//Example
public class Car{
//생성자
Car(String model, String color, int maxSpeed) { ... }
}
- 생성자가 명시적으로 선언되어 있을 경우, 반드시 선언된 생성자를 호출해서 객체를 생성
4. 필드 초기화
- 클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정
- 두 가지 방법으로 값 초기화 가능
1) 필드를 선언할 때 초기값을 주는 방법
- 동일한 클래스로부터 생성되는 객체들은 모두 같은 값을 갖게 된다.
- 객체 생성 후 초기값을 변경할 수 있지만, 객체 생성 시점에는 필드의 값이 모두 같다.
public class Korean{
//필드
String nation = "대한민국",
String name;
String ssn;
//생성자
public Korean(String n, String s){
name = n;
ssn = s;
}
}
2) 생성자에서 초기값을 주는 방법
public Korean{
this.name = name;
//필드 //매개변수
this.ssn = ssn;
}
- 필드와 매개 변수 이름은 동일한 이름으로 사용하는 것이 통상적이다.
- 하지만 동일하다면 생성자 내부에서 해당 필드에 접근할 수 없기 때문에 필드 앞에 'this.'을 붙인다.
❕❕this = 객체 자신의 참조
5. 생성자 오버로딩
- 외부에서 제공되는 다양한 데이터들을 이용해서 객체를 초기화하려면 생성자도 다양화될 필요가 있다.
- 다양한 방법으로 객체를 생성을 위해
생성자 오버로딩
매개 변수를 달리하는 생성자를 여러 개 선언하는 것
public class 클래스{
클래스 ([타입 매개변수, ...]) { //생성자의 오버로딩 - 매개 변수의 타입, 개수, 순서가 다르게 선언
...
}
클래스 ([타입 매개변수, ...]) { // (위와 같음)
...
}
}
- 다음은 Car 클래스에서 생성자를 오버로딩한 예
public class Car {
Car() {...}
Car(String model) {...}
Car(String model, String color) {...}
}
❗❗생성자 오버로딩 시 주의할 점❗❗
- 매개 변수의 타입과 개수 그리고 선언된 순서가 똑같을 경우 매개 변수 이름만 바꾸는 것은 생성자 오버로딩이 아님
- 생성자 오버로딩이 많아질 경우, 생성자 간의 중복된 코드가 발생
-----> 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법
6. 다른 생성자 호출 : this()
- 자신의 다른 생성자를 호출하는 코드
- 반드시 생성자의 첫 줄에서만 허용
- 예제
Car(String model){
this.model = model;
this.color = "은색"; //model, color, maxSpeed 중복
this.maxSpeed = 250;
}
Car(String model, String color){
this.model = model;
this.color = color;
this.maxSpeed = 250;
}
Car(String model, String color, int maxSpeed){
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
- this()를 이용
public class Car{
String company = "현대자동차";
String model;
String color;
int maxSpeed;
Car(){
}
Car(String model){
this(model, "은색", 250);
}
Car(String model, String color){
this(model, color, 250);
}
Car(String model, String color, int maxSpeed){
this.model = model;
this.color = color; //위 두 개의 생성자를 호출
this.maxSpeed = maxSpeed;
}
}
'Java' 카테고리의 다른 글
[ch06 클래스] (0) | 2022.08.04 |
---|---|
[ch06 클래스] 객체 지향 프로그래밍 (0) | 2022.07.19 |
[ch04 조건문과 반복문] (0) | 2022.07.18 |
[ch05 참조타입] 열거 타입 (0) | 2022.07.11 |
[ch05 참조타입] 배열 (0) | 2022.07.11 |