본문 바로가기
Java

2022-08-30 자바 수업

by allwing12 2022. 8. 30.

 

문제가 밑에 써있는대로 출력이 되어야하며 생물,동물,오리 클래스가 다 있어야한다.

그리고 println으로 출력문을 다 때려박는 방법도 있지만 그렇게 풀면 안된다.

 

package com.example.MyJavaProject;


class Main {
    public static void main(String[] args) {

        System.out.println("== 청둥오리객체 생성시작 ==");
        new 청둥오리();
        System.out.println("== 청둥오리객체 생성끝 ==");
      /* 출력
      == 청둥오리객체 생성시작 ==
      생물이 생성되었습니다.
      동물이 생성되었습니다.
      오리가 생성되었습니다.
      청둥오리 생성되었습니다.
      == 청둥오리객체 생성끝 ==
      */
    }
}
class 청둥오리 {
    생물 a생물;
    동물 a동물;
    오리 a오리;

    청둥오리 () {
        a생물 = new 생물 ();
        a동물 = new 동물 ();
        a오리 = new 오리 ();
        System.out.println("청둥오리 생성되었습니다.");
    }
}
class 생물 {
    생물 () {
        System.out.println("생물이 생성되었습니다.");
    }
}
class 동물 {
    동물 () {
        System.out.println("동물이 생성되었습니다.");
    }

}
class 오리 {
    오리 () {
        System.out.println("오리가 생성되었습니다.");
    }
}

 

그래서 내가 풀어본 방식은 객체생성을 청둥오리에 다 때려박아넣었다.

저렇게 해도 되기 때문에...

 

package com.example.MyJavaProject;


class Main {
    public static void main(String[] args) {

        System.out.println("== 청둥오리객체 생성시작 ==");
        new 청둥오리();
        System.out.println("== 청둥오리객체 생성끝 ==");
      /* 출력
      == 청둥오리객체 생성시작 ==
      생물이 생성되었습니다.
      동물이 생성되었습니다.
      오리가 생성되었습니다.
      청둥오리 생성되었습니다.
      == 청둥오리객체 생성끝 ==
      */
    }
}
class 청둥오리 extends 오리{

    청둥오리 () {
        System.out.println("청둥오리 생성되었습니다.");
    }
}
class 생물  {
    생물 () {
        System.out.println("생물이 생성되었습니다.");
    }
}
class 동물 extends 생물{
    동물 () {
        System.out.println("동물이 생성되었습니다.");
    }

}
class 오리 extends 동물{
    오리 () {
        System.out.println("오리가 생성되었습니다.");
    }
}

 

근데 수업에서는 문제를 이렇게 풀었다.

마지막 클래스 생성한 순서가 좀 이상하긴 한데 일단 super에 대해서 배웠다.

기본적으로 저게 왜 되는지를 알아야하는데 new ~() 를 한적이 없는데 생물,동물,오리가 실행되는 건

super 라는 생성자가 숨어있기 때문이다.

여기에서 super는 부모 클래스를 부르는 생성자이며 super가 있기 때문에 실행이 되는거라고 생각하면 된다.

 

그리고 자바는 기본적으로 생성자 하나를 만들어주지만 매개변수가 필요한 생성자를 사용했다면
그 이후에는 따로 생성해주지 않기 때문에 추가적으로 생성자가 필요하다면 따로 만들어야함.

class 사과 {
	사과 () {
    }
 }
 
 // 위는 기본적으로 사과(){} 생성자를 만들어줌
 
 class 사과 () {
    사과 (String 이름){
      }
}

// 위는 매개변수가 있는 생성자를 생성했기 때문에 자바가
// 따로 생성자를 안만들어주기 때문에 추가적으로 생성자를 사용하려면 만들어야함

 

 

// 문제 : 아래와 같이 출력되도록 해주세요. init() 메세드에 의해서 출력되어야 합니다.[정답]
// 조건 : 사람 클래스의 생성자는 사용할 수 없습니다.
// 힌트 : 모든 생성자는 자신의 일을 하기 전에 super(); 부터 실행합니다.
// 힌트 : 모든 생성자는 자신의 일을 하기 전에 부모클래스의 생성자 부터 실행합니다.

class Main {
	public static void main(String[] args) {
		new 사람();
		new 사람();
		new 사람();
		// 출력 : 사람이 초기화 됩니다.
	}
}

class 동물 {
	// 이 메서드는 사람 클래스로 복사됩니다.
	동물() {
		super(); // 부모클래스의 생성자 실행, 생략가능
		
		// 사람 클래스에는 이미 init(); 이 있기 때문에 이 코드는 결국 `동물`의 `init()` 이 아닌 `사람`의 `init()` 을 호출합니다.
		init();
	}
	
	// 이 메서드는 사람 클래스로 복사됩니다.
	void init() { 
		
	}
}

class 사람 extends 동물 {
	// 아래 메서드는 자동으로 만들어 집니다.
	/*
	사람() {
		super(); // 이 코드는 부모 클래스의 생성자 `동물()`을 실행시킵니다., 생략가능
	}
	*/
	
	void init() {
		System.out.println("사람이 초기화 됩니다.");
	}
}

 

위에는 기본적으로 만들어지는 생성자와 super 라는 것에 대한 이해가 있어야지 풀 수 있더라.

근데 아직 헷갈림...

 아그리고 자바에는 object 라는 모든 객체의 조상이 있다고 한다 근데 이 object 라는 조상 클래스에는

생성자가 얼마나 있는지 모르기 때문에 상속해서 생성자가 몇개냐고 물어보면 모르는게 정답이다.

 

댓글