728x90
반응형

 

상속(inheritance)

부모에게 물려받은 것을 자식에게서도 사용할 수 있도록 하는 것
- 부모 : Super, 상위, 기본
- 자식 : Sub, 하위, 파생
확장(extends)
: 반드시 부모와 자식이 동급인 경우
- 부모(Class), 자식(Class) 
- 부모(Interface), 자식(Interface)
public class ChildrenClass extends ParentsClass { } class Pa {
 int a;
 public void setA(int a) {
 this.a = a;
 }
}

class Cha extends Pa {
 int b ;
 public void setB() {
 this.b = b;
 }
}
public interface ChildrenInterface extends Parents Class { }
실채, 실제화(implements, realization)
: 부모와 자식이 급이 다른 경우
인터페이스는 클래스를 상속받지 못한다
public class ChildrenClass implements ParentsInterface { }  
다형성(polymorphism)
: 하나의 객체가 여러개의 자료형을 가지고 있는 것.
=>상속, 형변환 ==>메모리 낭비 줄임.
Pa p = new Cha( );
class Char extends Pa { }
다른 이름인 경우
속성 : 부모만
메소드 : 부모만 
동일 이름인 경우(이름, 매개변수까지 )
속성 : 부모만
메소드 : 자식만
Cha c = new Cha( );
다른 이름인 경우
속성 : 부모, 자식 모두 사용
메소드 : 부모, 자식 모두 사용
동일 이름인 경우
속성 : 자식
메소드 : 자식
Pa p = new Cha( );
class Cha extends Pa { }
  다른 이름인 경우 동일 이름인 경우(이름, 매개변수까지 )
속성 부모만 부모만
메소드  부모만  자식만
Cha c = new Cha( );
  다른 이름인 경우 동일 이름인 경우
속성  부모, 자식 모두 사용 자식만
메소드  부모, 자식 모두 사용 자식만

오버라이딩(Overridding) = 오버라이드(Override)

부모와 자식관계에서 동일한 이름의 메소드가 있는 경우(매개변수까지 동일) 부모 메소드가 가려지고(Hiding) 자식의 메소드로 재정의 되는 현상(덮어쓰기)

<필수>
- 상속관계가 존재해야
- 부모와 메소드가 동일해야
 (매개변수까지)
- 부모이상의 제어자가 선언되어야
private는 자식에게 상속되지 않는다.

private 변수는
자식클래스에서 선언될 수 있다.

super( ) 호출문에도 영향줌
class P {
public void md() {
a = 5;
System.out.println(a + b);
}
}

class C extends P {
public void md() {
System.out.println(a + b);
super.md();
this.md1();
}
}

클래스급이상 (클래스, 추상클래스, 인터페이스)인 경우

형변환은 반드시 상속관계에서만 가능하다.

아니면 String <=> Wrapper클래스간 메소드를 이용한 형변환만 가능하다.

 

 

 

Pa p = new Pa();
부모   부모or자식
Pa p = new Cha();
p = new Cha1();

=> Pa, Cha, Object(숨김)
재선언

 

 

 

InhEx01.java
class AA {
	int i;
	int j;
	
	public void setij(int x, int y) {
		i = x;
		j = y;
	}
}

class BB extends AA { //BB자식 >> AA부모
	int total;
	
	public void sum() {
		total = i + j;
	}
}



public class InhEx01 {

	public static void main(String[] args) {
		BB sub0b = new BB();
		
		sub0b.setij(10, 12);
		sub0b.sum();
		System.out.println("합계 : " + sub0b.total);
	}
}​


합계 : 22
InhEx03.java
class AA {
	int i;
	int j;
	int z = 5;
	
	public void setij(int x, int y) {
		System.out.println("상위");
		i = x;
		j = y;
	}
	
	public void printI() {
		System.out.println("상위: "+ z);
	}
}

class BB extends AA { //BB자식 >> AA부모
	int total;
	String z = "테스트";
	
	public void sum() {
		total = i + j;
	}
	
	public void setij(int x, int y) {
		System.out.println("하위");
		i = x + 5;
		j = y + 5;
	}
	public void printI() {
		System.out.println(z);
	}
}



public class InhEx01 {

	public static void main(String[] args) {
		BB sub0b = new BB();
		
		sub0b.setij(10, 12);
		sub0b.sum();
		System.out.println("합계 : " + sub0b.total);
	}
}​
하위
합계 : 32

sub0b.printI();  //내부에서 접근하는 자식값

System.out.printl("z의 값 : " + sub0b.z); //외부에서 접근하는 부모값

 

InhEx02.java
//오버라이딩
class P {
	int a = 0;
	int b = 5;
	
	public void md() {
		a = 5;
		System.out.println(a + b);
	}
}

class C extends P {
	String a = "오버라이딩";
	
	public void md() {
		System.out.println(a + b);
		super.md(); //super부모에 접근해서. 상속관계의 부모가 존재해야만 사용가능. Object 기본상속
		this.md1(); //C클래스
	}
	
	public void md1() {
		System.out.println("md1()메소드 호출");
	}
}



public class InhEx02 {

	public static void main(String[] args) {
		C c = new C();
		//업캐스팅 - 하위클래스(=서브클래스=자식클래스)자료형이 상위클래스로 변환되는것
		P p = new C();
		c.md();
		p.md();
	}

}​
오버라이딩5
10
md1()메소드 호출
오버라이딩5
10
md1()메소드 호출​
InhEx03.java
class Parent {} //Object가 숨겨져있음
class Child extends Parent {}
class Brother extends Parent {}


public class InhEx03 {
	public static void main(String[] args) {
		//다형성 : 한 객체가 여러개의 타입(자료형)을 갖을 수 있는 것
		Parent p = new Parent(); //Parent, Object
		System.out.println("1번. " + (p instanceof Object)); 
		System.out.println("2번. " + (p instanceof Parent));
		System.out.println("3번. " + (p instanceof Child));
		System.out.println();
		
		Parent c = new Child(); //Parent, Child, Object
		System.out.println("4번. " + (c instanceof Object));
		System.out.println("5번. " + (c instanceof Parent));
		System.out.println("6번. " + (c instanceof Child));
		System.out.println("7번. " + (c instanceof Brother));
		System.out.println();
		
		c = new Brother(); //Parent, Brother, Object
		System.out.println("8번. " + (c instanceof Object));
		System.out.println("9번. " + (c instanceof Parent));
		System.out.println("10번. " + (c instanceof Child));
		System.out.println("11번. " + (c instanceof Brother));
		System.out.println();
		
		Child c1 = new Child(); //Parent, Brother, Object
		System.out.println("12번. " + (c1 instanceof Object));
		System.out.println("13번. " + (c1 instanceof Parent));
		System.out.println("14번. " + (c1 instanceof Child));
//		System.out.println("15번. " + (c1 instanceof Brother)); 
//		선언하고 있는 자료형 자체가 Brother와 연결된 것이 없음
		
	}

}
1번. true
2번. true
3번. false

4번. true
5번. true
6번. true
7번. false

8번. true
9번. true
10번. false
11번. true

12번. true
13번. true
14번. true


InhEx04.java
class Par { int p = 0; }
class Cld extends Par { int c = 1; }
class Bro extends Par { int b = 2; }

public class InhEx04 {
	public static void main(String[] args) {
		Par pa01 = new Par();
		Cld ch = new Cld();
		Par pa02 = new Bro(); //Par, Bro
		Bro br = new Bro();
		
		pa01 = ch;
		//Par pa01 = new Cld();
		//pa01 = (Par) ch; 와 같으며, 타입 변환을 생략할 수 있음.
		
		pa01.p = 2;
		//pa01.c = 2;
		ch.p = 5;
		br.p = 5;
		//pa02.b = 6;
		//타입 변환을 생략할 수 없음. 다운케스팅 : 다시 자식 자료형으로 돌아오는 것
		br = (Bro) pa02;
		//pa02.b = 7;
//		System.out.println("pa02.b: "+ pa02.b);
		br.p = 5;
		br.b = 7;
		System.out.println("br.p : " + br.p + " / br.b : " + br.b);
		//br = (Bro)ch; // 직접적인 상속 관계가 아니므로 오류발생
	}
}
br.p : 5 / br.b : 7
728x90
반응형

'[JAVA]' 카테고리의 다른 글

[12일차 오후]  (0) 2023.12.27
[12일차 오전]  (0) 2023.12.27
[11일차 오전] 아스테리스크  (0) 2023.12.26
[20231222] 10일차 오후  (0) 2023.12.22
[20231222] 10일차  (0) 2023.12.22

+ Recent posts