[스터디-자바] 생성자와 문제 풀이

jh5959·2025년 4월 26일
0

스터디를 합시다

목록 보기
4/5

벌써 세번째 발표다

강의 날짜: 4/25(금)

벌써 세번째라니 시간이 빠르다 스터디를 한지 한달 가까이 지났다 두번째 발표를 너무 조져서 세번째는 진짜 별 생각이 안들었다. 발표하는 것에 너무 겁 먹었던거 같다.

같이 발표하는 스터디원과 준비를 하는 과정에서 많이 배웠다. 이틀전에 30분 정도 회의하고 하루 전에 한시간정도 맞췄는데 준비하면서 생성자 개념을 더 배우고 문제 풀면서 이건 뭐지 저건 뭐지 하면서 더 많이 생각하게 되었다.

같이 발표하는 분이 먼저 생성자의 개념과 예시를 설명하시고 나는 연습문제와 예제를 풀이하면서 설명했다.

주제: 생성자와 문제 풀이

생성자란

: 인스턴스를 초기화하는 메서드

  • 생성자 이름 = 클래스 이름
  • 반환타입없음(void 안씀 - 생성자는 객체 생성과 동시에 호출되는 특수한 메서드, 자바 문법상 반환타입 선언X, void도 금지, void를 붙이면 일반 메서드로 인식됨)
  • 다른 생성자 호출은 반드시 첫줄에서 해야함
  • 다른 생성자 호출 시 this()사용

기본생성자

  • 클래스이름(){}
  • 매개변수 없는 생성자
  • 생성자가 하나도 없을 때만 컴파일러가 자동추가
  • Card()

매개변수가 있는 생성자

  • 인스턴스를 생성하는 동시에 원하는 값으로 초기화 가능
  • 코드 간결
  • Card(String k, int num)

Card c = new Card("Heart", 7);

this.x=x

  • this iv와 lv를 구분하기 위해 사용
  • 생성자의 매개변수(lv)와 Child의 iv가 이름이 같기 때무에 구분하려고 사용

getX() 호출 시

  • Child 클래스에 getX()가 오버라이딩 되지 않았기 떄문에 부모클래스의 getX()가 호출됨 -> Parent의 x 사용

🤔만약에 parent의 조상이 있다면 그리고 조상에도 getX()메서드가 있다면 어떤 getX()가 호출될까?

  • parent의 조상인 클래스 GrandParent가 있고 GrandParent에도 getX()가 있다면
  • parent의 getX()가 오버라이딩되지 않았다면 GrandParent의 getX()메서드가 실행되면서 GrandParent의 x의 값이 실행된다
  • parent에도 getX()가 있고 GrandParent에도 getX()가 있으면 자손의 메서드가 실행됨
  • 하위클래스부터 찾는다

연습문제 7-7 풀이

생성자의 호출 순서와 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

예제 7-7

이 코드에서 에러가 나는 이유는?

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);


셀프 피드백

  • 앞에서 개념 설명을 잘 해주셔서 뒤에 문제 풀이하는데 수월했다
  • 이번에는 잘 준비해서 나름 만족스러운 발표였다
  • 발표는 듣는 스터디원분들이 질문을 많이 해주시고 적극적으로 들어주셔서 유익한 발표시간이 되었다
  • 내가 답변을 못한 질문은 아시는 분이 설명해주셔서 나도 그 자리에서 더 배웠다
  • 다만, 말을 두서없이 한 부분이 있어 아쉬웠다. 다른 사람이 더 쉽게 이해할 수 있도록 말로 설명하는 연습이 필요하다고 느꼈다

    상여자로 살아야지

0개의 댓글