기록 > 기억
[JAVA] 상속 본문
상속
● extends 키워드
public class Child extends Parent { ... }
public class Child extends Parent1, Parent2 { ... } //다중상속 불가
//자식클래스에서는 자신의 필드와 메소드는 물론이고, 부모클래스의 필드와 메소드 호출 가능
//private으로 선언된 필드와 메소드는 호출 불가
//부모클래스가 다른 패키지에 있다면, default 접근의 필드와 메소드도 호출불가
● 부모 생성자 호출
//자식클래스가 부모클래스로부터 상속받음
public class Child extends Parent { ... }
//자식클래스 객체생성
Child c = new Child();
//자식클래스 생성자에서 부모클래스 생성자를 호출함
public Child() {
super(); //맨 위에 위치해야함
//...
}
//부모 클래스
public class Parent {
public String field1;
public int field2;
//매개변수 갖는 생성자 생성
public Parent(String field1, int field2) {
this.field1 = field1;
this.field2 = field2;
}
}
//자식 클래스
public class Child extends Parent{
public String field3;
//컴파일러가 기본 생성자 생성
public Child() {
//부모 기본 생성자 호출
super(); //에러발생 → 매개변수 갖는 생성자를 만들면 컴파일러가 기본생성자를 만들지 않아서!
}
}
↓
//부모 클래스에서 명시적으로 정의한 생성자 호출
public Child(String field1, int field2, String field3) {
super(field1, field2);
this.field3 = field3;
}
● 메소드 재정의 (오버라이드) → 부모 클래스의 메소드를 자식 클래스에서 재정의
public class Parent {
void printMsg() {
System.out.println("Parent printMsg()");
}
}
public class Child extends Parent{
@Override
void printMsg() {
System.out.println("Child printMsg()");
}
}
public class OverrideExam {
public static void main(String[] args) {
Child c = new Child();
c.printMsg(); //Child printMsg() 출력 → 자식클래스에서 재정의한 메소드가 호출됨
}
}
● final 클래스와 final 메소드
public final class Parent { ... } //final 클래스
public class Child extends Parent { ... } //에러발생, final 클래스인 Parent 클래스 상속불가!!
public class Parent {
public final void printMsg() {
System.out.println("Parent 클래스의 final 메소드");
}
}
public class Child extends Parent {
@Override
void printMsg() { //에러발생, 부모클래스의 final 메소드는 자식클래스에서 오버라이드 불가!
System.out.println("Child printMsg()");
}
}
● protected 접근제한자
package a;
public class A {
protected String field; //protected 필드
protected A() { ... } //protected 생성자
protected void method() { ... } //protected 메소드
}
public class B { //클래스 A와 같은 패키지에 있기때문에
public void method() {
A a = new A(); //protected 생성자 접근 가능
a.field = "JAVA"; //protected 필드 접근 가능
a.method(); //protected 메소드 접근 가능
}
}
package b;
public class C { //클래스 A와 다른 패키지에 있기때문에
public void method() {
A a = new A(); //protected 생성자 접근 불가
a.field = "JAVA"; //protected 필드 접근 불가
a.method(); //protected 메소드 접근 불가
}
}
public class D extends A { //클래스 A와 다른 패키지여도 클래스 A를 상속 받았기 때문에
public D() {
super();
this.field = "JAVA"; //protected 필드 접근 가능
this.method(); //protected 메소드 접근 가능
}
}
● 다형성 → 부모 타입에는 모든 자식 객체를 대입 가능 (자동 타입 변환)
public class Parent {
void method1() {
System.out.println("Parent.method1()");
}
void method2() {
System.out.println("Parent.method2()");
}
}
public class Child extends Parent {
@Override
void method2() {
System.out.println("Child.method2()"); //메소드 재정의 (오버라이드)
}
void method3() {
System.out.println("Child.method3()");
}
}
public class PolyExam {
public static void main(String[] args) {
Parent p = new Child(); //부모클래스 = 자식클래스 (자동으로 타입변환)
p.method1(); //Parent.method1() 출력
p.method2(); //Child.method2() 출력 → 자식클래스에서 재정의된 메소드가 호출됨 (다형성) ***
p.method3(); //에러발생 → 부모클래스에 선언되지 않은 메소드는 접근불가 ***
if(p instanceof Child) { //Parent 객체가 Child 타입인지 확인
Child c = (Child)p; //자식클래스의 메소드 호출하려면 강제 타입 변환
c.method3(); //접근가능
}
}
}
● 추상 클래스 → 실체 클래스의 공통 필드와 메소드만 정의해놓은 클래스
//추상 클래스
public abstract class Parent {
public String field; //필드
public Parent(String field) { //생성자
this.field = field;
}
public void parentMethod() { //메소드
System.out.println("parentMethod()");
}
}
//추상 클래스를 상속받은 클래스
public class Child extends Parent {
public Child(String field) {
super(field);
}
public void childMethod() {
System.out.println("childMethod()");
}
}
public class AbstractClass {
public static void main(String[] args) {
Parent p = new Parent(); //에러발생 → 추상클래스는 직접 객체생성 불가
Child c = new Child("abstract"); //추상 클래스를 상속받은 자식 클래스를 통해 객체생성
c.childMethod();
c.parentMethod();
}
}
● 추상 메소드 → 추상 클래스에는 메소드의 선언부만 있고 실행블록이 없음
//추상 메서드는 추상 클래스 안에서만 작성가능
public abstract class Parent {
public abstract void study();
}
//추상 클래스를 상속받은 자식 클래스에서는 추상메서드를 반드시 구현해야 함
public class FirstChild extends Parent {
@Override
public void study() {
System.out.println("공부가 재밌어요.");
}
}
public class SecondChild extends Parent {
@Override
public void study() {
System.out.println("공부하기 싫어요.");
}
}
public class AbstractMethod {
public static void main(String[] args) {
FirstChild fc = new FirstChild();
SecondChild sc = new SecondChild();
fc.study(); //공부가 재밌어요.
sc.study(); //공부하기 싫어요.
Parent p = new FirstChild();
p.study(); //공부가 재밌어요.
p = new SecondChild();
p.study(); //공부하기 싫어요.
}
}
'IT국비지원' 카테고리의 다른 글
[JAVA] 문자열 (String) (0) | 2021.10.26 |
---|---|
[JAVA] 예외 처리 (0) | 2021.10.25 |
[JAVA] 인터페이스 (0) | 2021.10.25 |
[JAVA] 객체와 클래스 (0) | 2021.10.24 |
[JAVA] 참조 타입 (0) | 2021.10.24 |
[JAVA] 조건문과 반복문 (0) | 2021.10.24 |
[JAVA] 연산자 (0) | 2021.10.24 |
Comments