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.javaclass 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 |