컴퓨터는 잘못이 없다..

[JAVA]상속과 super, this,오버라이딩 본문

공부/JAVA

[JAVA]상속과 super, this,오버라이딩

도토리까꿍v 2020. 12. 7. 12:52
Contents 접기

[예제코드]

 

Phone.java

package test.main;

public class Phone{
	
	public String s="Phone";
	public int pa;
	
	//디포트 생성자
	public Phone() {
		System.out.println("Phone 디포트 생성자 호출");
	}
	
	//call()메소드 
	public void call() {
		System.out.println("집에서 전화를 Phone으로 걸어요");
	}
	
	
	//reDial() 메소드 
	public void reDial() {
		System.out.println("방금 걸었던 전화를 다시 걸어요.");
	}
	
	
}

 

Handphone.java

package test.main;

public class HandPhone extends Phone{
	public int ha;
	public String s="HandPhone";
	
	//디포트 생성자
	public HandPhone() {
		System.out.println("HandPhone 생성자를 호출");
	}
	
	//오버라이딩
	@Override
	public void call() {
		System.out.println("이동중에 HandPhone으로 전화를 걸어요~");
	}
	
	//HandPhone의 takePicture() 메소드 
	public void takePicture() {
		System.out.println("사진을 찍어요.");
	}
	
	//HandPhone의 test()메소드
	public void test() {
		
		//부모클래스에 접근
		
		//(1)super.~ 키워드로 부모클래스의 필드와 메소드에 접근가능.
		int ha = super.pa; //super.~을 통해 부모의 필드에 접근가능
		super.reDial(); //super.~을 통해 부모의 메소드에 접근 가능 
		
		//(2)또한 super키워드는 생략 가능하다.
		int ha2 = pa;
		reDial();
		
		
		//자기자신의 필드에는 this로 접근가능
		
		//(3)자기자신에 접근 
		this.ha=3;
		
		//(4)this는 생략가능하다. 
		ha=5;

		//(5)단, 부모클래스와, 자식클래스에 동일한 이름의 필드가 있을 때 String s가 부모, 자식에 둘다 존재함.
		//자식클래스에서 this,super을 생략하면 자식클래스 필드를 의미한다. 
		System.out.println(this.s); //HandPhone
		System.out.println(super.s); //Phone
		System.out.println(s); //HandPhone
	}
	
	
	
	
	
}

 

 

MainClass.java

package test.main;

public class MainClass {
	public static void main(String[] args) {
		System.out.println("---(6)new Phone()으로 객체 생성---");
		Phone p=new Phone();
		System.out.println("---(7)new HandPhone()으로 객체 생성---");
		HandPhone h=new HandPhone();
		Phone p2=h; //업캐스팅
		HandPhone h2=(HandPhone)p2; //다운캐스팅
		
		System.out.println("---(8)p.call()--");
		p.call();//부모클래스의 메소드가 호출된다.
		System.out.println("---(9)h.call()--");
		h.call();//자식클래스의 오버라이딩 된 메소드가 호출된다.
		System.out.println("---(10)p2.call()--");
		p2.call(); //자식클래스의 오버라이딩 된 메소드가 출력된다.
		System.out.println("---(11)h2.call()--");
		h2.call(); //자식클래스의 오버라이딩 된 메소드가 출력된다.
		
		h.pa=3;
		System.out.println("---(12)h.pa=3대입 후 h.pa출력--");
		System.out.println(h.pa);
		p.pa=5;
		System.out.println("---(13)p.pa=5대입 후 p.pa출력--");
		System.out.println(p.pa);
		System.out.println("---(14)p2.pa를 출력하면 무엇이 출력될까?--");
		System.out.println(p2.pa);


	}
}

 

▲MainClass.java 실행결과

---(6)new Phone()으로 객체 생성---
Phone 디포트 생성자 호출
---(7)new HandPhone()으로 객체 생성---
Phone 디포트 생성자 호출
HandPhone 생성자를 호출
---(8)p.call()--
집에서 전화를 Phone으로 걸어요
---(9)h.call()--
이동중에 HandPhone으로 전화를 걸어요~
---(10)p2.call()--
이동중에 HandPhone으로 전화를 걸어요~
---(11)h2.call()--
이동중에 HandPhone으로 전화를 걸어요~
---(12)h.pa=3대입 후 h.pa출력--
3
---(13)p.pa=5대입 후 p.pa출력--
5
---(14)p2.pa를 출력하면 무엇이 출력될까?--
3

 

 

[코드설명]

-HandPhone클래스는 Phone클래스를 상속받고 있다.

따라서 HandPhone클래스는 Phone클래스의 필드, 메소드에 접근 가능하다. 

*여기선 부모클래스의 필드, 메소드를 모두 public으로 지정하였다!

 

-부모클래스로의 접근

①부모클래스의 필드, 메소드 접근은 자식클래스에서 super로 가능하다.(super은 생략가능)

②또한 자식클래스로 객체 생성 후 참조값.~~ 으로도 부모클래스의 필드, 메소드에 접근 가능하다. 

*여기선 부모클래스의 필드, 메소드를 모두 public으로 지정하였다!

 

이때 super의 사용과, this의 사용을 (1)~(5), (12)~(14)에서 체크해보자!

 

 

-오버라이딩

상속을 받고 부모클래스의 메소드를 재정의하면 어떤일이 벌어지는지 (8)~(11)에서 체크해보자!

 

Comments