Notice
Recent Comments
Recent Posts
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Today
Total
관리 메뉴

기록 > 기억

[JAVA] 상속 본문

IT국비지원

[JAVA] 상속

BY SON 2021. 10. 24. 20:09

상속

 

● 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