Beny's Study
07. 상속의 기본 흐름 코드예시 본문
상속의 기본 흐름을 코드예시를 통해 이해해 보자.
우선 부모클래스를 만들어 보자.
SuperClass.java
package com.kh.ex02.test_inherit;
public class SuperClass {// SuperClass : 부모(조상) 클래스
private int privateValue = 5; //외부에서 사용불가 ( private여서)
protected int protectedValue = 10;//외부에서 사용가능
public int publicValue = 20;//외부에서 사용가능
public SuperClass() {
System.out.println("I am a super class");
}
public void publicmethod() {
System.out.println("Call SuperClass's publicMethod!");
}
public int getPrivateValue() {//private라서 getter와 setter 생성자 만듬/.
return privateValue;
}
public void setPrivateValue(int privateValue) {
this.privateValue = privateValue;
}
}
여기서 superClass 는 부모 클래스(조상클래스)라는 의미를 가지고 있다.
부모 클래스의 참조변수의 접근제한자중 private 는 앞에서 배운것 처럼 외부에서 접근이 불가능해서 사용이 불가능하다.
(private 의 참조변수의 getter,setter 생성자를 만들었다)
하단에 자손클래스와 Run파일을 생성해 보았다.
ChildClass.java
package com.kh.ex02.test_inherit;
public class ChildClass extends SuperClass {// extends SuperClass 부모클래스를 ChildClass에 상속시킨다
private int privateValue = 105;
protected int protectedValue = 110;
public int publicValue = 120;
public ChildClass() {// Chil쓰고 엔터치면 자동생성됨. 자동생성
super();// 부모의 생성자 호출, 생략해도 자동으로 생성시켜준다,부모생성자 호출해야 부모클래스->자식클래스
//이게 없어도 Run 의 childClass에서 부모의 생성자 호출이 되서I am a super class가 출력이 됨
// 생성순서 : 부모의 클래스super()->자식의클래스(하단)
int publicValue = 300;
// 자신의 멤버변수 호출
System.out.println("My privateValue : " + this.privateValue);// 얘는 [private int privateValue = 105; ]
System.out.println("My privateValue : " + this.protectedValue);// 얘는[protected int protectedValue = 110;]
System.out.println("My privateValue : " + this.publicValue);// 얘는[public int publicValue = 120;]
System.out.println("Local privateValue : " + publicValue);// 얘는 int publicValue = 300;
// 부모의 멤버변수 호출
// System.out.println("Super privateValue : " + super.privateValue);//호출불가 밖에서 사용 불가능해서
// 얘를 사용하고 싶으면 부모클래스에서 게터세터 만들고 자식클래스에서 super.getprivateValue로 작성하면
System.out.println("Super privateValue : " + super.getPrivateValue());//직접치면 안되고 super.후 스페이스로 get찾아야함
//호출불가 밖에서 사용 불가능해서
// getprivateValue에 접근해서 출력가능!)
// 게터세터는 선언할때 Public으로 접근제한자 니까 불러오는게 가능,
System.out.println("Super protectedValue : " + super.protectedValue);
System.out.println("Super publicValue: " + super.publicValue);
System.out.println("Super publicValue : " + super.publicValue);
}
//상속된 부모에서 가져온 메소드라는것을 표시함 @오버라이드 의 의미
@Override //alt + shift + S
public void publicmethod() {
System.out.println("Call ChildClass's publicMethod");
super.publicmethod();// 강제로 부모의 publicMethod 호출하는 법, 없어도 된다!!(부모꺼 호출할 일 있으면 하는거고 없으면 안해도됨)
}
}
우선 맨 위 상단 클래스명 옆에 붙은 extends SuperClass 키워드를 통해 앞에서 만든 부모클래스를 상속했다.
그후 참조변수값을 다르게 지정했고,public ChildClass() {super(); 를 통해 부모의 생성자를 호출하였다.
자세한 설명은 줄마다 주석처리 후 작성하였다.
Run.java
package com.kh.ex02.test_inherit;
public class Run {
public static void main(String[] args) {
System.out.println(" SuperClass 생성!");
new SuperClass();
System.out.println("SuperClass 생성 끝!");
// 출력
// SuperClass 생성!
// I am a super class
// SuperClass 생성 끝!
// why? new SuperClass();로 부모클래스에서 출력값 받아옴.
System.out.println("ChildClass 생성!");
new ChildClass();
System.out.println("ChildClass 생성 끝!");
// 출력
// ChildClass 생성! //위에 그대로 받아옴
// I am a super class //부모의 생성자 호출
// 즉, public ChildClass() {
// super(); 때문에 부모의 생성자가 호출이 되서 출력이 됨
// My privateValue : 105
// My privateValue : 110
// My privateValue : 120
// Local privateValue : 300
// Super privateValue : 5 //부모클래스에서 getter,setter출력 한후 ChildClass에서 불러옴
// Super protectedValue : 10
// Super publicValue: 20
// Super publicValue : 20
// ChildClass 생성 끝!
System.out.println("강제호출 !");
new ChildClass().publicmethod();;
System.out.println("강제호출 끝!");
// 출력
// 강제호출 !
// I am a super class
// My privateValue : 105
// My privateValue : 110
// My privateValue : 120
// Local privateValue : 300
// Super privateValue : 5
// Super protectedValue : 10
// Super publicValue: 20
// Super publicValue : 20
// Call ChildClass's publicMethod//childClass의 오버라이드 부분중 System.out.println("Call ChildClass's publicMethod"); 출력!
// Call SuperClass's publicMethod!//childClass의 오버라이드 부분중super.publicmethod();로인해 강제로 부모의 클래스 호출해서출력됨
// 강제호출 끝!
}
}
출력결과
첫번째로, new SuperClass();로 부모클래스에서 출력값 받아옴.
그 후 System.out.println("ChildClass 생성!");이 출력이 된 후
I am a super class 가 출력되는데
이는 public ChildClass() {super(); 때문에 부모의 생성자가 호출이 되서 출력이 됨.
그런 후 자식의 멤버변수를 먼저 호출했기 때문에 출력후
부모의 멤버변수가 출력이 됨.
여기서 만약 new ChildClass().publicmethod(); 을 입력하게 되면
childClass의 오버라이드 부분중 System.out.println("Call ChildClass's publicMethod"); 출력!
그리고
childClass의 오버라이드 부분중super.publicmethod();로인해 강제로 부모의 클래스 호출해서출력됨.
"본 인터넷 사이트 내의 모든 이미지, 문구, 콘텐츠, 내용 등에 대한 저작권은 76beny에게 있습니다.
이를 무단으로 도용, 복사, 전재, 재배포, 2차 변형 등을 할 경우
민, 형사상 법적 조치 등 저작권법에 의거하여 처벌 받을 수 있습니다."
'[JAVA] > 08. 상속' 카테고리의 다른 글
09. 오버로딩 (0) | 2022.04.13 |
---|---|
08. 접근제한자 ,다른패키지에서 오버라이드 흐름 코드 예제 (0) | 2022.04.13 |
06. final (마지막의,변동될수없는) (0) | 2022.04.13 |
05. super()와 super.의 차이 (0) | 2022.04.13 |
04. 오버로딩, 오버라이딩오버로딩 차이 (0) | 2022.04.13 |