본문 바로가기
Backend/JAVA_Basic

19. JAVA, 상속(inheritance, override, super, Object 클래스)

by 개발개발빈이 2022. 6. 3.

 상속 (inheritance)

    - 객체지향 프로그래밍의 특징 중 하나 (참고 : OOP의 특징)

    - 기존의 클래스(부모)가 가지고 있는 필드와 메소드를 그대로 물려받아 새로운 클래스(자식)를 만드는 것

    - 쉽게 말하면, 클래스의 재활용
    - 부모와 자식, 조상과 후손(파생), superclass와 subclasses

    - 종단(final) 클래스는 상속받을 수 없다 (참고 : JAVA, final )

    - private 속성은 상속받을 수 없다

    - 클래스 간의 상속은 단일 상속만 가능하다 (하나의 클래스만 상속받을 수 잇음)

    - extends 확장 / implements 구현

    - 형식) class 자식(서브)클래스 extends 부모(슈퍼)클래스 { 서브클래스 내용 }

               class 자식(서브)클래스 implements 부모인터페이스 { 서브클래스 내용 }

 

package oop0408;

// final class AA {} → 종단 클래스는 상속받을 수 없다

class AA{

	private void zero() {}	//상속되지 않음
	public void one() {
		zero();
		System.out.println("AA.one()...");
	}
	public void two() {
		System.out.println("AA.two()...");
	}

}//AA class end


class BB extends AA{ //자식클래스BB, 부모클래스AA
	
	//one(), two()가 보이지 않지만 상속되어서 사용가능
	public void three() {
		System.out.println("BB.three()...");
	}

}//BB class end


class CC extends BB{ //자식클래스CC, 부모클래스BB
	
	public void four() {
		System.out.println("CC.four()...");
	}
	
}//CC class end

/*

class DD{}
class EE extends AA, DD {}  에러, 클래스간의 상속은 단일상속만 가능하다 (다중상속 불가)

*/


public class Test03_inheritance {

	public static void main(String[] args) {
			
		AA aa=new AA();
		
		aa.one();
		aa.two();
		//aa.zero();  에러, private속성은 클래스 내부에서만 접근 가능하다


		BB bb=new BB();
	
		bb.one();
		bb.two();
		bb.three();
		// bb.zero();  에러, private속성은 상속되지 않는다
	
		
		CC cc=new CC();
		
		cc.one();
		cc.two();
		cc.three();
		cc.four();

		
	}//main() end

}//class end

 

  override

    - Method Override, 함수 재정의

    - 상속관계에서 물려받은 메소드를 다시 수정(리폼)

    - final메소드는 상속은 가능하지만 오버라이드는 할 수 없다 (참고 : JAVA, final )

package oop0408;

class Korea {
	
	String name="대한민국";
	final void view() {
		System.out.println("Korea.view()...");
	}//view() end
	void disp() {
		System.out.println("Korea.disp()..."+name);
	}//disp() end	
	
}//class end


class Seoul extends Korea {}//class end


class Busan extends Korea {

	String name="부산광역시";
	
	@Override
	void disp() {
		System.out.println("Busan.disp()..."+name);
	}
	
/*
	@Override
	void view() {}	에러, final메소드는 오버라이드할 수 없다
*/
	
}//class end


public class Test04_override {

	public static void main(String[] args) {
		
		// 1) 오버라이드 하기 전							
		Seoul seoul = new Seoul();
		seoul.disp(); //Korea.disp()...대한민국
		seoul.view(); //Korea.view()...
		
		// 2) 오버라이드 한 후		
		Busan busan = new Busan();
		busan.disp(); //Busan.disp()...부산광역시
		busan.view(); //Korea.view()...
			
	}//main() end

}//class end

 

○ super

    - super : 부모, 조상

    - superclasses(부모클래스들) / subclasses(자식클래스들)

    - 상속관계에서 생성자 함수 호출순서 : 부모생성자가 먼저 호출되고 자신의 생성자 함수가 호출

package oop0411;

class School extends Object {
	String name="학교";
	public School() {
		System.out.println("School()...");
	}
}//class end


class MiddleSchool extends School {

	public MiddleSchool() {
		super(); //부모 생성자 함수 호출(생략가능)
		System.out.println("MiddleSchool()...");
	}
	
	public void disp() {
		System.out.println(name); // 학교(부모에게 물려받은 값)
	}
	
}//class end


class HighSchool extends School {

	String name="고등학교";
	
	public HighSchool() {
		super();
		System.out.println("HighSchool()...");
	}
	
	public void disp() {
		String name="종로고등학교";
		System.out.println(name);       // 종로고등학교(지역변수)
		System.out.println(this.name);  // 고등학교(나의 멤버변수_
		System.out.println(super.name); // 학교(부모의 멈버변수)
	}
    
}//class end


public class Test01_super {

	public static void main(String[] args) {
		
		//school() → MiddleSchool()
		MiddleSchool ms=new MiddleSchool(); //School()... MiddleSchool()...
		ms.disp(); //학교
		
		//school() → HighSchool()
		HighSchool hs=new HighSchool(); //School()... HighSchool()...
		hs.disp(); //종로고등학교 고등학교 학교
		
	}//main end

}//class end

 

    - super 와 this 비교 (부모 super, 나 this)

package oop0411;

class Parent {
	
	int one, two;
	public Parent() {}
	public Parent(int one, int two) {
		this.one=one;
		this.two=two;
	}
	
}//class end


class Child extends Parent {
	
	int three;
	public Child() {}
	public Child(int a, int b, int c) {
		
		//상속받은 멤버변수(one, two)에 초기값 전달
		super(a,b);
		this.three=c;
	}
	
}//class end


public class Test02_super {

	public static void main(String[] args) {
		// super, super(), this, this()	활용한 클래스 설계
		
		Child child = new Child(10, 20, 30);
		
		System.out.println(child.one);   //10
		System.out.println(child.two);   //20
		System.out.println(child.three); //30
		
	}//main() end

}//class end

 

○ Object 클래스

    - 자바의 최고 조상 클래스 : Object클래스 
    - 자바의 기본 패키지(java.lang)에 선언되어 있음 → java.lang.Object
    - 자바의 모든 클래스는 무조건 Object클래스를 상속 받는다
    - 자바의 모든 클래스는 Object클래스의 후손들이다

package oop0408;

class Jeju extends Object {
	@Override
	public String toString() {
		return "제주도";
	}
}//class end

class Suwon extends Object {
	private String id="soldesk";
	private String pw="1234";
	
	@Override
	public String toString() {
		return "Suwon [id=" + id + ", pw=" + pw +"]";
	}
}//class end

class Incheon extends Object {
	private String name="인천광역시";
	private String phone="789-8745";
	
	@Override
	public String toString() {
		return "Incheon [name=" + name + ", phone=" + phone + "]";
	}
}//class end


public class Test05_Object extends Object { //extends Object 생략가능

	public static void main(String[] args) {
		
		Jeju jeju=new Jeju();
		System.out.println(jeju.toString());
		
		Suwon suwon=new Suwon();
 	    System.out.println(suwon.toString());	
		
		System.out.println(jeju);
		System.out.println(suwon);

		Incheon incheon=new Incheon();
		System.out.println(incheon.toString());
		System.out.println(incheon);
		
	}//main() end

}//class end

댓글