벌써 세번째라니 시간이 빠르다 스터디를 한지 한달 가까이 지났다 두번째 발표를 너무 조져서 세번째는 진짜 별 생각이 안들었다. 발표하는 것에 너무 겁 먹었던거 같다.
같이 발표하는 스터디원과 준비를 하는 과정에서 많이 배웠다. 이틀전에 30분 정도 회의하고 하루 전에 한시간정도 맞췄는데 준비하면서 생성자 개념을 더 배우고 문제 풀면서 이건 뭐지 저건 뭐지 하면서 더 많이 생각하게 되었다.
같이 발표하는 분이 먼저 생성자의 개념과 예시를 설명하시고 나는 연습문제와 예제를 풀이하면서 설명했다.
: 인스턴스를 초기화하는 메서드
Card c = new Card("Heart", 7);
🤔만약에 parent의 조상이 있다면 그리고 조상에도 getX()메서드가 있다면 어떤 getX()가 호출될까?
생성자의 호출 순서와 x의 실행결과를 작성하시오
class Parent {
int x = 100;
Parent() { //3️⃣, this()로 매개변수가 있는 생성자를 호출하면서 값을 넘겨줌
this(200);
}
Parent(int x) {// 4️⃣, 다른 생성자를 호출하지 않았기 때문에 컴파일러가 첫 줄의 조상의 기본생성자를 호출한다 -> 모든 클래스의 조상인 Object()가 호출됨
this.x = x; // iv 변수 x의 전달받은 값을 대입함 x=200
}
int getX() {
return x;
}
}
class Child extends Parent {
int x = 3000;
Child() { // 1️⃣ , this()로 매개변수가 있는 생성자를 호출하면서 값을 넘겨줌
this(1000);
}
Child(int x) {// 2️⃣ , 다른 생성자를 호출하지 않았기 때문에 컴파일러가 첫 줄의 조상의 기본생성자를 호출한다
// super();
this.x = x; // Child의 x
}
}
class Exercise7_7 {
public static void main(String[] args) {
Child c = new Child(); //Child 객체 생성과 Child의 기본 생성자 호출
System.out.println("x=" + c.getX());
}
}
생성자 호출 순서: Child() -> Child(int x) -> Parent() -> Parent(int x) -> Object()
x의 실행 값: x=200
이 코드에서 에러가 나는 이유는?
class Point{
int x,y;
//super();를 호출했지만 기본생성자는 없고 매개변수만 있는 생성자만 존재하기 때문에 에러가 남
Point(int x, int y){
this.x=x;
this.y=y;
}
}
class Point3D extends Point{
int z;
Point3D(int x, int y, int z){ //생성자 첫 줄에 다른 생성자를 호출하지 않으면 컴파일러가 조상의 기본생성자를 자동으로 호출한다
//super();
this.x=x;
this.y=y;
this.z=z;
}
}
에러 잡는 방법 두 가지
1️⃣ Point클래스의 기본생성자를 만들어 준다 -> Point3D () {}
2️⃣ Point3D 클래스의 생성자 첫 줄에 Point(int x,int y)를 호출하도록 변경하면 됨 -> super(x,y);