문제가 밑에 써있는대로 출력이 되어야하며 생물,동물,오리 클래스가 다 있어야한다.
그리고 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 라는 조상 클래스에는
생성자가 얼마나 있는지 모르기 때문에 상속해서 생성자가 몇개냐고 물어보면 모르는게 정답이다.
'Java' 카테고리의 다른 글
| 자바 배열 (array) 알아보기 from 점프 투 자바 (0) | 2022.09.06 |
|---|---|
| 2022-08-31 자바 수업 (static, final) (0) | 2022.09.01 |
| 2022-08-26 자바 (0) | 2022.08.30 |
| 2022-08-25 자바 수업 문제 풀이 (Arrlist 및 생성자) (0) | 2022.08.26 |
| Java(자바) - 상속,접근제한자, 추상클래스 및 오버라이딩 (0) | 2022.08.25 |
댓글