Beny's Study

07. 상속의 기본 흐름 코드예시 본문

[JAVA]/08. 상속

07. 상속의 기본 흐름 코드예시

76beny 2022. 4. 13. 18:18

상속의 기본 흐름을 코드예시를 통해 이해해 보자.

우선 부모클래스를 만들어 보자.

 

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차 변형 등을 할 경우

민, 형사상 법적 조치 등 저작권법에 의거하여 처벌 받을 수 있습니다."