다른 패키지에서 쓰니까 접근권한자 public 넣어줘야 함. 생성자는 타입 없음
공간확보하고 찍어줘라. = 오른쪽 부분 new에서 찍음.
용어는 외워야 한다.
/main/Main.java
package main;
import model.Child;
import model.Parent;
public class Main {
public static void main(String[] args) {
Parent p = new Parent(); // 클래스를 만들어 보자 new
p.name = "봄동";
p.age = 50;
p.money = 1000000000;
p.print();
}
}
/model/Parent.java
package model;
public class Parent {
public String name;
public int age;
public int money;
public void print(){
System.out.println(name);
System.out.println(age);
System.out.println(money);
}
}
/model/Parent.java
package model;
public class Parent {
public String name;
public int age;
public int money;
public Parent(){
System.out.println("부모 생성자 호출됨!");
}
public void print(){
System.out.println(name);
System.out.println(age);
System.out.println(money);
}
}
아래
// public String name;
// public int age;
// public int money;
//
// public void print(){
// System.out.println(name);
// System.out.println(age);
// System.out.println(money);
/model/Child.java
package model;
public class Child extends Parent {
public String hobby;
public Child() {
System.out.println("자식 생성자 호출됨!");
}
public void printChild(){
System.out.println(name);
System.out.println(age);
System.out.println(money);
System.out.println(hobby);
}
}
/main/Main.java
package main;
import model.Child;
import model.Parent;
public class Main {
public static void main(String[] args) {
Parent p = new Parent(); // 클래스를 만들어 보자 new
p.name = "봄동";
p.age = 50;
p.money = 1000000000;
p.print();
System.out.println("--------------------------------");
Child c = new Child();
c.name = "머루";
c.age = 23;
c.money = -1000000000;
c.hobby = "게임";
}
}
부모 생성자 호출됨!
봄동
50
1000000000
--------------------------------
부모 생성자 호출됨!
프린트 결과가 이렇게 나오는 이유는 new Parent()를 통해 메모리에 공간을 만든 후 "부모 생성자 호출됨!"이라는 문장을 프린트하는 생성자가 작동하기 때문이다. 출력 결과를 통해 아래의 c에 아직 데이터를 입력하거나 출력을 하지 않았지만, new를 통해 상속해 주는 Parent()를 거쳐 상속받는 Child까지 메모리에 공간을 만드는 작업을 진행했음을 알 수 있다.
/model/Parent.java
package model;
public class Parent {
public String name;
public int age;
public int money;
public Parent(){
System.out.println("부모 생성자 호출됨!");
}
public void print(){
System.out.println(name);
System.out.println(age);
System.out.println(money);
}
}
/model/Child.java
package model;
public class Child extends Parent {
public String hobby;
public Child() {
System.out.println("자식 생성자 호출됨!");
}
public void printChild(){
System.out.println(name);
System.out.println(age);
System.out.println(money);
System.out.println(hobby);
}
}
/main/Main.java
package main;
import model.Child;
import model.Parent;
public class Main {
public static void main(String[] args) {
Parent p = new Parent(); // 클래스를 만들어 보자 new
p.name = "봄동";
p.age = 50;
p.money = 1000000000;
p.print();
System.out.println("--------------------------------");
Child c = new Child();
c.name = "머루";
c.age = 23;
c.money = -1000000000;
c.hobby = "게임";
// c의 데이터를 출력
c.printChild();
System.out.println("--------------------------------");
}
}
부모 생성자 호출됨!
봄동
50
1000000000
--------------------------------
부모 생성자 호출됨!
자식 생성자 호출됨!
머루
23
-1000000000
게임
--------------------------------
Parent의 money를 프라이빗private으로 설정할 경우 : child에서 상속은 여전히 받는다. 다른 class에서 노출을 직접적으로 안 할 뿐이다. 그럴 경우, getter와 setter 함수를 설정해주면 money를 사용할 수 있다.
getter와 setter 함수를 설정하는 것이 좋은 이유 중 하나는,
함수 안에 조건 등 다양한 내용을 포함시켜 접근하는 데이터의 규칙을 통제할 수 있기 때문이기도 하다.
package model;
public class Parent {
public String name;
public int age;
private int money; // 머니를 프라이빗으로 설정.
public Parent(){
System.out.println("부모 생성자 호출됨!");
}
public void print(){
System.out.println(name);
System.out.println(age);
System.out.println(getMoney());
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
if (money < 0) {
this.money = 0;
}else {
this.money = money;
}
}
}
Parent의 멤버 변수 money를 private로 돌리고 나면
printChild()함수에서도 money 대신 getMoney() 함수를 사용해야 한다.
package model;
public class Child extends Parent {
public String hobby;
public Child() {
System.out.println("자식 생성자 호출됨!");
}
public void printChild(){
System.out.println(name);
System.out.println(age);
System.out.println(getMoney());
System.out.println(hobby);
}
}
main 함수에서도 setMoney(), getMoney()를 사용하도록 한다.
package main;
import model.Child;
import model.Parent;
public class Main {
public static void main(String[] args) {
Parent p = new Parent(); // 클래스를 만들어 보자 new
p.name = "봄동";
p.age = 50;
p.setMoney(1000000000);
p.print();
System.out.println("--------------------------------");
Child c = new Child();
c.name = "머루";
c.age = 23;
c.setMoney(-1000000000);
c.hobby = "게임";
// c의 데이터를 출력
c.printChild();
System.out.println("--------------------------------");
c.print();
}
}