AAA.java
package com.aaa;
public class AAA {
private int abc;
public AAA() {
System.out.println("AAA 생성");
}
public AAA(int abc) {
//this : 나(객체)
this.abc = abc;
System.out.println("AAA 생성 -> abc : " + abc);
}
public int getAbc() {
return abc;
}
public void setAbc(int abc) {
this.abc = abc;
}
public void prn() {
System.out.println("AAA의 prn() 메소드");
}
}
BBB.java
package com.bbb;
import com.aaa.AAA;
// super : 부모(상속)
public class BBB extends AAA {
private int bcd;
public BBB() {
// super();
System.out.println("BBB 생성");
}
public BBB(int abc) {
// 부모생성자(param) 호출
super(abc);
bcd = 10;
System.out.println("BBB 생성 -> abc : " + abc);
}
public BBB(int abc, int bcd) {
super(abc);
this.bcd = bcd;
System.out.printf("BBB 생성 -> abc : %d, bcd : %d\n", abc, bcd);
}
public int getBcd() {
return bcd;
}
public void setBcd(int bcd) {
this.bcd = bcd;
}
public int getSum() {
int sum = super.getAbc() + this.getBcd();
return sum;
}
@Override//재정의
public void prn() {
System.out.println("BBB.prn()");
}
}
MTest.java
package com.bbb;
import com.aaa.AAA;
public class MTest {
public static void main(String[] args) {
// type 변수 = 값;
// type 변수 = new 생성자();
AAA myA = new AAA();
myA.prn();
AAA paramA = new AAA(10);
paramA.prn();
System.out.println("abc : " + paramA.getAbc());
paramA.setAbc(100);
System.out.println("abc : " + paramA.getAbc());
System.out.println("----------------------------");
BBB b1 = new BBB();
b1.setAbc(10);
b1.setBcd(20);
System.out.println(b1.getSum());
BBB b2 = new BBB(15);
System.out.println(b2.getSum());
BBB b3 = new BBB(20, 50);
System.out.println(b3.getSum());
System.out.println("----------------------------");
AAA a1 = new AAA();
AAA a2 = new BBB();
// BBB a3 = new AAA(); //자식은 부모를 쓸수 있음 부모는 자식을 못씀
a1.prn();
a2.prn();
a2.getAbc();
// a2.getBcd(); //AAA형태라서 에러
((BBB)a2).getBcd(); //BBB로 형변환 한다음에 사용가능
}
}
위에 클래스가 3개가 있습니다.
com.aaa 패키지 안에 AAA 클래스가 있고 com.bbb 패키지 안에 BBB 클래스 왜 MTest 클래스가 있습니다.
BBB 클래스는 AAA 클래스에 상속받고 있으며 MTest는 main()메소드를 통해 AAA와 BBB를 호출하고 있습니다.
그럼 main()메소드를 한 줄씩 보면서 해석해볼게요!
AAA myA = new AAA();
AAA 클래스의 타입으로 myA 이름의 객체를 생성했습니다. AAA 클래스의 기본 생성자가 호출됩니다.
public AAA() {
System.out.println("AAA 생성");
}
myA.prn();
AAA 클래스의 prn() 메서드를 호출합니다.
public void prn() {
System.out.println("AAA의 prn() 메소드");
}
AAA paramA = new AAA(10);
AAA클래스릐 타입으로 paramA라는 이름의 객체가 생성되지만 매개변수에 10이 들어가 있습니다.
생성자가 오버로딩 되어있나 봅니다.
AAA 클래스 내에 int 타입의 매개변수 1개가 들어간 생성자를 호출합니다.
public AAA(int abc) {
//this : 나(객체)
this.abc = abc;
System.out.println("AAA 생성 -> abc : " + abc);
}
abc라는 변수의 내부 호출을 위해 this.abc를 사용하였습니다.
paramA.prn();
AAA 클래스의 prn() 메서드를 다시 한번 호출합니다.
public void prn() {
System.out.println("AAA의 prn() 메소드");
}
System.out.println("abc : " + paramA.getAbc());
게터를 호출하네요.
public int getAbc() {
return abc;
}
앞서 abc는 10이라는 값이 이미 들어가 있었습니다.
그렇기 때문에 10이 출력이 됩니다.
abc : 10
println문의 내용으로 위와 같이 출력이 되겠네요
paramA.setAbc(100);
세터에 100을 넣어줍니다.
public void setAbc(int abc) {
this.abc = abc;
}
이제 AAA 클래스의 abc의 값은 100이 됩니다.
System.out.println("abc : " + paramA.getAbc());
다시 게터를 호출해볼까요?
public int getAbc() {
return abc;
}
abc : 100
다음과 같이 출력이 됩니다.
BBB b1 = new BBB();
BBB 타입의 객체가 생성이 됩니다.
public BBB() {
// super();
System.out.println("BBB 생성");
}
BBB 클래스의 생성자가 출력이 되겠죠?
근데 BBB 클래스는 AAA 글라스를 상속받고 있기 때문에 BBB() 생성자에는 super(); 이게 생략되어 있습니다.
그래서 AAA 클래스의 AAA() 생성자를 먼저 호출하게 됩니다.
AAA 생성
BBB 생성
으로 출력이 됩니다.
b1.setAbc(10);
b1.setBcd(20);
System.out.println(b1.getSum());
b1은 BBB 타입입니다.
그렇지만 BBB는 AAA를 상속받고 있기 때문에 setAbc를 사용할 수 있습니다.
abc의 값이 10으로 초기화되고 bcd의 값은 20이 됩니다.
public int getSum() {
int sum = super.getAbc() + this.getBcd();
return sum;
}
BBB의 getSum을 보시면 sum을 리턴합니다.
또한 sum은 부모 클래스의 abc와 자신의 클래스 bcd를 더한 값입니다.
BBB b2 = new BBB(15);
System.out.println(b2.getSum());
BBB 클래스에 int 타입 매개변수를 가진 BBB 생성자를 찾아봅니다.
public BBB(int abc) {
// 부모생성자(param) 호출
super(abc);
bcd = 10;
System.out.println("BBB 생성 -> abc : " + abc);
}
abc의 값으로 15를 넣었네요. 부모 클래스의 abc는 15가 되고 bcd의 값은 10이 됩니다.
합은 25입니다.
BBB b3 = new BBB(20, 50);
System.out.println(b3.getSum());
이제 감이 좀 오시죠?
BBB 클래스에서 int 타입 매개변수 2개가 들어갔네요.
public BBB(int abc, int bcd) {
super(abc);
this.bcd = bcd;
System.out.printf("BBB 생성 -> abc : %d, bcd : %d\n", abc, bcd);
}
abc는 20 bcd는 50이 됩니다.
합은 70입니다.
AAA a1 = new AAA();
AAA a2 = new BBB();
// BBB a3 = new AAA(); //자식은 부모를 쓸수 있음 부모는 자식을 못씀
a1.prn();
a2.prn();
a2.getAbc();
// a2.getBcd(); //AAA형태라서 에러
((BBB)a2).getBcd(); //BBB로 형변환 한다음에 사용가능
이 코드도 다형성에 대한 코드입니다.
AAA a2 = new BBB();를 type 변수 = 값; 처럼 보면 AAA 타입의 변수 a2는 BBB()의 값을 가지고 있다고 이해하시면 됩니다.
BBB가 AAA를 상속받고 있기에 가능합니다.
하지만 부모 클래스는 자식 클래스를 사용할 수 없기다고 했었기 때문에 BBB a3 = new AAA();와 같이 선언하면 에러가 발생합니다.
또한 a1은 AAA 클래스 내에 있는 메소드만 호출이 가능하며 a2는 BBB의 값을 가지고 있기 때문에 prn메소드를 호출하면 BBB에 있는 prn()메소드를 호출합니다.
또 AAA 타입이 기 때문에 bcd를 호출하기 위해서는 BBB로 타입 변환을 해야 합니다.
'Java 관련 > Java' 카테고리의 다른 글
[Java] 인터페이스(interface)를 이용한 도형의 넓이 구하기 & 캡슐화 (0) | 2021.11.07 |
---|---|
[Java] 추상클래스(abstract class) (0) | 2021.11.06 |
[Java] 다형성(polymorphism) (0) | 2021.11.04 |
[Java] 상속(inheritance) (0) | 2021.11.03 |
[Java] 오버로딩(Overloading), 오버라이딩(Overriding) (0) | 2021.11.02 |