본문 바로가기
프로그래밍 언어/JAVA

[JAVA] 상속(Inheritance)

by E145 2021. 1. 20.
반응형

상속(Inheritance)

 

상속(Inheritance) 이란?

 

 - 하위 클래스가 상위 클래스를 확장(extend) 하는 것.

 

 - 자바에서 상속은 extends 키워드를 이용하여 상속한다.

 

 - 자바에서는 상속을 받지 않은 경우, 기본적으로 java.lang.Object 클래스를 상속 받는다.

 

 - 자바에서는 원칙적으로 단일 상속만 지원한다.

   다중 상속이 필요한 경우 Interface 키워드를 이용한다. 

 

 - 상속 받은 여러 클래스 중 같은 이름을 가진 멤버, 메소드가 있는 경우 어떠한 것을 실행해야 하는지 모호하다.

 

 

 

[JAVA] 인터페이스(Interface)

인터페이스(Interface) 인터페이스(Interface)의 특징  - 100% 순수한 추상 클래스와 비슷하다.  - 추상 메소드들로만 이루어진 모임.  - 다중 상속을 지원한다.  - 구현해야할 껍데기를 만들어 놓는것

9327144.tistory.com

 


 

상속 방법

 

 - 자식 클래스는 extends 키워드를 통해 부모 클래스를 상속 받을 수 있다.

import java.util.*;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		child1 c=new child1();
		c.pMethod();
		c.cMethod();
		
	}

}

class parent{
	public String name;
	public void pMethod() {
		System.out.println("parent Method");
	}
}

class child1 extends parent{
	public child1() {
		this.name="child1";
	}
	public void cMethod() {
		System.out.println(name+" Method");
	}
}

 

실행 결과

 


 

올바른 상속

 

 - IS-A 관계를 살펴본다.

   올바른 상속이 되는 경우 "A is a B" 라는 관계가 성립 된다.

   예를 들어 "Dog is a Animal" 이라는 관계는 성립되지만, "Animal is a Dog" 라는 관계는 성립되지 않는다.

   즉, 상속에서 IS-A 관계는 한 방향으로만 작동한다.

 

 - IS-A 관계는 부모, 자식 관계 뿐만 아니라 그 이하, 그 이상과의 관계에도 성립된다. 

   A is a B 이고 B is a C 인 경우 A is a C도 성립한다.

 


 

상속의 장점

 

 - 부모 클래스는 자식 클래스의 공통적으로 필요한 행동을 상속한다. 그러므로 코드 중복을 방지할 수 있다.

 

 - 부모 클래스를 수정하면 자식 클래스는 자동으로 수정되기 때문에 자식 클래스를 따로 수정할 필요가 없다.

 

 - 일련의 클래스를 위한 공통적인 규약을 정의할 수 있다. 

 


생성자

 

 - 자식 클래스에서 생성자를 호출하는 경우 부모 생성자를 호출해야 한다.

 

 - 자식 클래스 생성자에서 부모 클래스 생성자를 호출하지 않는 경우 자동으로 부모 클래스의 기본 생성자가 추가된다.

   이때 부모 클래스의 기본 생성자가 없는 경우, 에러가 발생한다.

 

 - 부모 클래스의 생성자는 super 키워드를 이용하여 임의로 호출이 가능하다.

   이때 반드시 자식 클래스 생성자 부분 제일 위에서 호출해야 한다.

 

 - 생성자 관련 자세한 내용 참고

 

[JAVA] 객체의 생성, 생성자

객체의 생성 생성자란?  - 객체를 생성할 때 호출하는 메소드  - 생성자를 호출할 때에는 반드시 new 키워드를 앞에 붙여준다. 생성자의 특징  - 생성자는 클래스와 이름이 같다.  (메소드의 이

9327144.tistory.com


 

 

super와 this

 

 - 클래스에서 자기 자신 객체를 참조하기 위해서 this 키워드를 사용한 것 처럼,

   부모 클래스 객체를 참조하기 위한 super 키워드가 존재한다.

 

 - 생성자 : super();

   멤버 변수 : super.member;

   메소드 : super.method();

 

 


자식 인스턴스 생성과 부모 인스턴스

 

 - 자식 클래스가 생성될 때, 부모 클래스의 생성자도 실행된다.

 

 - 즉, 자식 인스턴스가 생성되어 힙에 저장되면, 부모 인스턴스도 생성되어 저장된다.

 

 - 그래서 자식 인스턴스가 부모 클래스의 멤버 변수, 메소드를 사용할 수 있다.

 

 - instanceof 를 이용하여 살펴보면, 자식 인스턴스에 부모, 자식 클래스 모두 있다는 것을 알 수 있다.

 

public class start {

    public static void main(String[] args)  {

        parent p = new child();
        
        /*
		 부모 타입으로 선언해도 참조 값이 가리키는 메모리에는
         자식 인스턴스가 있다.
         자식 인스턴스에는 부모 + 자식 모두 생성되어 있다.
		*/
        
        if(p instanceof child)
            System.out.println("현재 자식 클래스 참조중입니다.");

        if(p instanceof parent)
            System.out.println("현재 부모 클래스 참조중입니다.");
    }
}

class parent{
    ;
}

class child extends parent{
    ;
}

 

 


상속 접근 제한

 

 - 자식 클래스에서 부모 클래스의 멤버 변수나 메소드에 접근할 수 있는 권한을 조정할 수 있다.

 

 - 접근 제어자를 이용하여 접근이 가능한 경우, 접근이 불가능한 경우를 나누어 용도에 따라 사용할 수 있다.

 

접근 제어자

속성

public

모든 접근 허용

protected

해당 패키지 내의 클래스나 상속 받은 클래스에서만 접근 가능
 => 같은 패키지인 경우 항상 접근 가능, 다른 패키지에서 상속 받은 클래스에서만 접근 가능

default

해당 패키지 내에서만 접근 가능
 => 같은 패키지인 경우 항상 접근 가능, 다른 패키지에서 상속 받은 경우, 접근 불가능.

private

해당 클래스 내에서만 접근 가능(상속 불가)

  

 

[JAVA] 정보은닉과 캡슐화, 접근제한자.

정보은닉 정보은닉이란?  - 객체의 구체적인 정보를 노출하지 않고, 외부에서 직접 접근하는 방법을 제한하는 것.  - 인스턴스 변수의 접근 허용 범위를 제한하여 정보를 은닉한다. 자바의 접근

9327144.tistory.com

 


final

 

 - final 키워드를 이용하여 클래스, 메소드를 선언하면 상속과정에서 제한을 만들 수 잇따.

 

 - final 클래스는 상속이 불가능해진다. 

 

 - final 메소드는 상속 시 오버라이딩이 불가능하게 된다.

 

package com.test;

public final class parent {
    int aaa=3;
}
package com.test;

public class child extends parent {
    int aaa=6;
    public child(){
        //aaa=666;
    }
    public void cc(){
        System.out.println(super.aaa);

    }
}

 


 

 

 

 

기타 상속 관련 질문

 

   Q. 상위 클래스에서 하위 클래스의 메소드는 사용할 수 있는가?

   A. 상위 클래스에서 하위 클래스의 메소드는 사용할 수 없다. 

 

   Q. 하위 클래스에서 상위 클래스 버전의 메소드와 오버라이드 버전의 메소드 모두 사용하는 방법이 있는가?

   A. 오버라이드 된 버전은 해당 메소드를 사용하면 되고, 상위 클래스 버전의 메소드는 super 키워드를 이용하면 된다.

import java.util.*;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		child1 c=new child1();
		c.Method();
		
	}

}

class parent{
	public String name;
	public void Method() {
		System.out.println("parent Method");
	}
}

class child1 extends parent{
	public child1() {
		this.name="child1";
	}
	public void Method() {
    	// super 키워드를 이용하여 부모 클래스의 메소드 실행
		super.Method();
		System.out.println(name+" Method");
	}
}

 

실행 결과

 

 

반응형

댓글