티스토리 뷰
생성자
- 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드
- 인스턴스 생성 시 수행할 작업(iv 초기화)에 사용
더보기

인스턴스가 생성될 때마다 호출되는 ‘인스턴스 초기화 메서드’
- 생성자는 iv 초기화 메서드 ⭐️
- 객체는 'iv집합'
- 생성자를 만드는 이유 : iv 초기화를 편리하게 하기 위해

인스턴스 생성 시 수행할 작업(iv 초기화)에 사용
- 인스턴스 생성 시 수행할 작업은 { } 안에 작성해준다.
생성자 조건
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴 값이 없다.(void 안 붙임)
- 모든 클래스는 반드시 한 개 이상의 생성자를 가져야 한다.
더보기

1. 생성자의 이름은 클래스의 이름과 같아야 한다.

2. 생성자는 리턴 값이 없다.(void 안 붙임)
3. 모든 클래스는 반드시 한 개 이상의 생성자를 가져야 한다.
- 기본 생성자
기본 생성자
Card c = new Card();
// ↑ Card() : 생성자 호출(기본 생성자)
- 객 체 생성 시 Card() 이 부분이 알고보기 생성자 호출 코드였다.
- 생성자가 있어야 호출을 할 텐데, 우리는 생성자를 만들어준 적이 없다.
- Card()는 기본 생성자라 하는 것인데, 생성자가 하나도 없을 때 컴파일러가 자동으로 추가해준다.
기본 생성자
- 매개변수가 없는 생성자
- 생성자가 하나도 없을 때만, 컴파일러가 자동 추가
더보기
매개변수가 없는 생성자
클래스이름() {} // 기본 생성자
Point() {} // Point클래스의 기본 생성자
생성자가 하나도 없을 때만, 컴파일러가 자동 추가
- 클래스를 작성할 때, 기본 생성자를 꼭 만들어야 한다. ⭐
예제6-11
더보기
The constructor ch06.Data_2() is undefined
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The constructor ch06.Data_2() is undefined
at ch06.Ex6_11.main(ch06.Ex6_11.java:16)
해석 : 기본 생성자가 정의되지 않았기 때문에 에러가 발생했다.
- Data_1클래스는 생성자가 하나도 없기 때문에, 컴파일러가 기본 생성자를 자동 추가하지만,
- Date_2클래스는 '매개변수 있는 생성자'가 정의되어있기 때문에 기본 생성자가 자동 추가되지 않는다.
- 따라서, 클래스를 작성할 때, 기본 생성자를 꼭 만들어야 한다. ⭐
매개변수가 있는 생성자
- 매개변수가 있는 생성자를 사용하면 인스턴스를 생성하는 동시에 원하는 값으로 iv를 초기화할 수 있다.
더보기

위의 양쪽 코드 모두 같은 내용이지만, 오른쪽의 코드가 더 간결하고 직관적이다. 이처럼 클래스를 작성할 때 다양한 생성자를 제공함으로써 인스턴스 생성 후에 별도로 초기화를 하지 않아도 되도록 하는 것이 바람직하다.

매개변수가 있는 생성자를 사용하면 인스턴스를 생성하는 동시에 원하는 값으로 iv를 초기화할 수 있다.
- 인스턴스를 생성할 때는 다음의 2가지 사항을 결정해야 한다.
- 1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
- 2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?
Car c = new Car("white", "Auto", 4);
/*
1. 참조변수 선언(Car c)
2. 객체 생성(new)
3. 객체 초기화(생성자 호출, Car("white", "Auto", 4))
4. 참조변수와 객체 연결(=)
*/
class Car {
String color;
String gearType;
int door;
Car() {} // 기본생성자
Car(String c, String g, int d) { // 매개변수가 있는 생성자
color = c;
gearType = g;
door = d;
}
}


예제6-12
생성자 this()
- 생성자에서 같은 클래스의 다른 생성자 호출할 때 사용
- 다른 생성자를 호출 시 첫 줄에서만 호출 가능
- 코드의 중복을 제거하기 위해 사용
더보기


생성자에서 다른 생성자 호출할 때 사용
class Car {
String color; // 색상
String gearType; // 변속기 종류 - auto(자동), manual(수동)
int door; // 문의 개수
Car() {
this("white", "auto", 4); // Car(String color, String gearType, int door)호출
}
Car(String color) {
this(color, "auto", 4);
}
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
다른 생성자를 호출 시 첫 줄에서만 호출 가능

코드의 중복을 제거하기 위해 사용

예제6-13
참조변수 - this
- 인스턴스 자신을 가리키는 참조변수
- 인스턴스 메서드(생성자 포함)에서만 this 사용 가능
- 지역변수(lv)와 인스턴스변수(iv)를 구별할 때 this 사용
더보기

인스턴스 자신을 가리키는 참조변수
- 인스턴스의 주소가 저장되어 있다.
- 모든 인스턴스메서드(생성자 포함)에 지역변수로 숨겨진 채 존재한다.
- 같은 클래스 내에서 생략 가능
인스턴스 메서드(생성자 포함)에서만 this 사용 가능
- static메서드에서 사용 불가
지역변수(lv)와 인스턴스변수(iv)를 구별할 때 this 사용
- this.변수명 == iv

참조변수 this와 생성자 this()
- this인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어 있다. 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.
- this(), this(매개변수) 생성자. 같은 클래스의 다른 생성자를 호출할 때 사용한다.
| 참고 | this와 this()는 비슷하게 생겼을 뿐 완전히 다른 것이다. this는 '참조변수'이고, this()는 '생성자'이다.
참조변수 super
- 조상클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수
- 조상 멤버와 자신 멤버를 구별할 때 사용(≒ this : 멤버변수와 지역변수 구별할 때 사용)
- 인스턴스 메서드(또는 생성자)내에만 존재(≒ this : static 메서드에서 사용 불가)
예제7-2
더보기

Ex7_2 실습하기 - Child클래스 구조
변수 이름이 x로 동일하지만, this.x와 super.x로 조상 멤버와 자신 멤버를 구별할 수 있다.

예제7-3
더보기

this.x와 super.x가 같은 변수를 가리키는 경우

super() - 조상의 생성자
- 조상의 생성자를 호출할 때 사용
- 조상의 멤버는 조상의 생성자를 호출해서 초기화(생성자, 초기화 블럭 제외)
- 생성자의 첫 줄에 반드시 생성자를 호출해야 한다. ⭐⭐⭐
그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입
더보기


조상의 멤버는 조상의 생성자를 호출해서 초기화
- 생성자, 초기화 블럭 상속 X

생성자의 첫 줄에 반드시 생성자를 호출해야 한다. ⭐⭐⭐

예제PointTest
더보기
class Point4 {
int x;
int y;
Point4(int x, int y) {
this.x = x; // 컴파일 후 - Object(); // 모든 생성자는 첫 줄에 다른 생성자를 호출해야 한다.
this.y = y;
}
String getLocation() {
return "x : " + x + ", y : " + y;
}
}
public class PointTest {
public static void main(String[] args) {
Point4_3D p3 = new Point4_3D(1, 2, 3);
System.out.println(p3.getLocation());
}
}
1. 조상의 생성자 super() 작성 안 할 경우
class Point4_3D extends Point4 {
int z;
Point4_3D(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
} // Implicit super constructor Point4() is undefined. Must explicitly invoke another constructor
String getLocation() {
return "x : " + x + ", y : " + y + ", z : " + z;
} // 오버라이딩
}
결과
Implicit super constructor Point4() is undefined. Must explicitly invoke another constructor
2. 조상의 생성자 super() 작성 할 경우
class Point4_3D extends Point4 {
int z;
Point4_3D(int x, int y, int z) {
super(x, y);
this.z = z;
}
String getLocation() {
return "x : " + x + ", y : " + y + ", z : " + z;
} // 오버라이딩
}
결과
x : 1, y : 2, z : 3
🍪
📄 - 객체지향개념 암기노트 바로가기
'Java의 정석_기초편' 카테고리의 다른 글
상속(Inheritance) (0) | 2022.10.13 |
---|---|
변수의 초기화 (0) | 2022.10.13 |
오버로딩(overloading)과 오버라이딩(overriding) (0) | 2022.10.12 |
변수와 메서드 (0) | 2022.10.11 |
클래스와 객체 (0) | 2022.10.10 |
댓글
공지사항