[자바 무료 강의] 상속은 유전과 같다 - 코드라떼
Lesson List button
코스자바로 배우는 프로그래밍
hamburger button
강의상속은 유전과 같다최종수정일 2021-11-21
아이콘약 4분

상속은 유전과 같습니다. 부모의 클래스의 요소들을 자식 클래스가 가지는 것을 상속이라고 합니다. 이번 강의는 상속과 관련된 가장 첫 번째 강의입니다.

추가 노트

목차


  1. 상속

  2. 접근제어 지시자 복기

1. 상속


자식 클래스가 부모 클래스가 가지고 있는 요소들에 접근 할 수 있도록 하고 요소들을 가질 수 있도록 하는 것을 상속이라고 합니다.


extends

상속을 하는 방법은 extends 키워드를 이용합니다.

public class ParentDog {

}

public class ChildDog extends ParentDog {

}

extends 키워드를 이용한 상속은 다중 상속이 불가능하며 자식 클래스는 하나의 부모 클래스에서만 상속 받을 수 있습니다.

또한 조부모 클래스, 부모 클래스, 자식 클래스로 구성할 수도 있습니다.

public class GrandParentDog {

}

public class ParentDog extends GrandParentDog {

}

public class ChildDog extends ParentDog {

}

상속을 받는 요소

부모 클래스로 부터 상속을 받을 수 있는 요소는 변수와 메서드입니다.

public class ParentDog {
    protected String color = "black";
    static protected int age = 10;

    protected void bark() {
        System.out.println("왈왈!");
    }
}

public class ChildDog extends ParentDog {
    // color, age 변수와
    // bark(); 메서드의 요소를 상속 받는다
}
public class Main {

    public static void main(String[] args) {
        // ChildDog 클래스에 변수나 메서드를 선언하지 않아도 접근할 수 있습니다.
        ChildDog childDog = new ChildDog();
        System.out.println(childDog.color);
        childDog.bark();
    }

}

ParentDog 상속받은 요소를 ChildDog에서 사용할 수 있습니다,


protected 지시자

접근 제어 지시자 protected를 선언할 경우 같은 패키지뿐만 아니라 다른 패키지에서도 접근 가능하며, 상속도 같은 패키지, 다른 패키지 둘 다 접근이 가능합니다. 이 같은 특징은 public 지시자와 과 유사한 면이 있으며, public 지시자 다음으로 가장 열려있는 지시자입니다.

package com.codelatte.inheritance.dog;

public class GrandParentDog {
    String leg = "long";
    void bite() {
        System.out.println("으르릉! 깨물다");
    }
}
package com.codelatte.inheritance.dog;

public class ParentDog extends GrandParentDog {
    protected String color = "black";
    protected void bark() {
        System.out.println("왈왈!");
    }
}
package com.codelatte.inheritance.outdog;
import com.codelatte.inheritance.dog.ParentDog;

public class ChildDog extends ParentDog {
    public void info() {
        System.out.println(leg); // 접근 불가능
        System.out.println(color);
    }

    public void howling() {
        bite(); // 호출 불가능
        bark();
        System.out.println("아오오오~~");
    }
}

2. 접근제어 지시자 복기


접근 지시자

설명

사용할 수 있는 곳

public

모든 곳에서 접근 가능하다. inner 클래스에서도 접근 가능

클래스, 생성자, 변수, 메서드

protected

같은 패키지 뿐만 아니라 다른 패키지에서도 접근 가능하며 상속도 같은 패키지, 다른 패키지 둘다 접근 가능하다. 다만 클래스 내부가 아닌 클래스 외부에서 메서드나 변수에 직접 접근할 수 없다.

생성자, 변수, 메서드

default

같은 패키지내에서만 접근 가능하며 상속도 같은 패키지 내에서만 접근 가능하다

클래스, 생성자, 변수, 메서드

private

클래스 내부에서만 접근 가능하다.

inner 클래스, 생성자, 변수, 메서드

도전자 질문
아이콘marunose(2021-07-27 08:47 작성됨)
protected 예제 설명하는 부분 코드에 GrandParent 클래스, Parent 클래스, Child 클래스 모두 같은 패키지에 있으므로 leg변수와 bite메소드를 Child 클래스에서 사용할 수 있는거 아닌가요?
아이콘코드라떼(2021-07-27 12:57 작성됨)
안녕하세요^^

영상에서 나온 예제를 보고 말씀하신 것 같습니다.^^

일단 leg 변수와 관련하여 ChildDog 클래스는 com.rclass.interitance.outdog 패키지에 있고, leg 변수를 가지고 있는 GrandParentDog은 com.rclass.interitance.dog 패키지에 있으므로 엄연하게 다른 패키지라 leg 변수를 사용할 수 없습니다.

그리고 bite() 메서드와 관련하여 ChildDog 클래스도 com.rclass.interitance.outdog 패키지에 있고, bite() 메서드를 가지고 있는 GrandParentDog은 com.rclass.interitance.dog 패키지에 있으므로 이 또한 다른 패키지라 해당 메서드를 사용할 수 없습니다. 

폴더 구조로 봤을 때 com.rclass.interitance가 동일한 패키지라고 보일 수 있으나 뒤에 dog과 outdog이 다르므로 다른 패키지 입니다.

감사합니다^^
이용약관|개인정보취급방침
알유티씨클래스|대표, 개인정보보호책임자 : 이병록
이메일 : cs@codelatte.io
사업자등록번호 : 824-06-01921
통신판매업신고 : 2021-성남분당C-0740
주소 : 경기도 성남시 분당구 대왕판교로645번길 12, 9층 24호
파일
파일파일
Root
파일

package와 extends 키워드와 protected 지시자를 유심히 살펴보세요.

Output
root$
Lesson List button
코스자바로 배우는 프로그래밍
hamburger button
강의상속은 유전과 같다최종수정일 2021-11-21
아이콘약 4분

상속은 유전과 같습니다. 부모의 클래스의 요소들을 자식 클래스가 가지는 것을 상속이라고 합니다. 이번 강의는 상속과 관련된 가장 첫 번째 강의입니다.

추가 노트

목차


  1. 상속

  2. 접근제어 지시자 복기

1. 상속


자식 클래스가 부모 클래스가 가지고 있는 요소들에 접근 할 수 있도록 하고 요소들을 가질 수 있도록 하는 것을 상속이라고 합니다.


extends

상속을 하는 방법은 extends 키워드를 이용합니다.

public class ParentDog {

}

public class ChildDog extends ParentDog {

}

extends 키워드를 이용한 상속은 다중 상속이 불가능하며 자식 클래스는 하나의 부모 클래스에서만 상속 받을 수 있습니다.

또한 조부모 클래스, 부모 클래스, 자식 클래스로 구성할 수도 있습니다.

public class GrandParentDog {

}

public class ParentDog extends GrandParentDog {

}

public class ChildDog extends ParentDog {

}

상속을 받는 요소

부모 클래스로 부터 상속을 받을 수 있는 요소는 변수와 메서드입니다.

public class ParentDog {
    protected String color = "black";
    static protected int age = 10;

    protected void bark() {
        System.out.println("왈왈!");
    }
}

public class ChildDog extends ParentDog {
    // color, age 변수와
    // bark(); 메서드의 요소를 상속 받는다
}
public class Main {

    public static void main(String[] args) {
        // ChildDog 클래스에 변수나 메서드를 선언하지 않아도 접근할 수 있습니다.
        ChildDog childDog = new ChildDog();
        System.out.println(childDog.color);
        childDog.bark();
    }

}

ParentDog 상속받은 요소를 ChildDog에서 사용할 수 있습니다,


protected 지시자

접근 제어 지시자 protected를 선언할 경우 같은 패키지뿐만 아니라 다른 패키지에서도 접근 가능하며, 상속도 같은 패키지, 다른 패키지 둘 다 접근이 가능합니다. 이 같은 특징은 public 지시자와 과 유사한 면이 있으며, public 지시자 다음으로 가장 열려있는 지시자입니다.

package com.codelatte.inheritance.dog;

public class GrandParentDog {
    String leg = "long";
    void bite() {
        System.out.println("으르릉! 깨물다");
    }
}
package com.codelatte.inheritance.dog;

public class ParentDog extends GrandParentDog {
    protected String color = "black";
    protected void bark() {
        System.out.println("왈왈!");
    }
}
package com.codelatte.inheritance.outdog;
import com.codelatte.inheritance.dog.ParentDog;

public class ChildDog extends ParentDog {
    public void info() {
        System.out.println(leg); // 접근 불가능
        System.out.println(color);
    }

    public void howling() {
        bite(); // 호출 불가능
        bark();
        System.out.println("아오오오~~");
    }
}

2. 접근제어 지시자 복기


접근 지시자

설명

사용할 수 있는 곳

public

모든 곳에서 접근 가능하다. inner 클래스에서도 접근 가능

클래스, 생성자, 변수, 메서드

protected

같은 패키지 뿐만 아니라 다른 패키지에서도 접근 가능하며 상속도 같은 패키지, 다른 패키지 둘다 접근 가능하다. 다만 클래스 내부가 아닌 클래스 외부에서 메서드나 변수에 직접 접근할 수 없다.

생성자, 변수, 메서드

default

같은 패키지내에서만 접근 가능하며 상속도 같은 패키지 내에서만 접근 가능하다

클래스, 생성자, 변수, 메서드

private

클래스 내부에서만 접근 가능하다.

inner 클래스, 생성자, 변수, 메서드

도전자 질문
아이콘marunose(2021-07-27 08:47 작성됨)
protected 예제 설명하는 부분 코드에 GrandParent 클래스, Parent 클래스, Child 클래스 모두 같은 패키지에 있으므로 leg변수와 bite메소드를 Child 클래스에서 사용할 수 있는거 아닌가요?
아이콘코드라떼(2021-07-27 12:57 작성됨)
안녕하세요^^

영상에서 나온 예제를 보고 말씀하신 것 같습니다.^^

일단 leg 변수와 관련하여 ChildDog 클래스는 com.rclass.interitance.outdog 패키지에 있고, leg 변수를 가지고 있는 GrandParentDog은 com.rclass.interitance.dog 패키지에 있으므로 엄연하게 다른 패키지라 leg 변수를 사용할 수 없습니다.

그리고 bite() 메서드와 관련하여 ChildDog 클래스도 com.rclass.interitance.outdog 패키지에 있고, bite() 메서드를 가지고 있는 GrandParentDog은 com.rclass.interitance.dog 패키지에 있으므로 이 또한 다른 패키지라 해당 메서드를 사용할 수 없습니다. 

폴더 구조로 봤을 때 com.rclass.interitance가 동일한 패키지라고 보일 수 있으나 뒤에 dog과 outdog이 다르므로 다른 패키지 입니다.

감사합니다^^
이용약관|개인정보취급방침
알유티씨클래스|대표, 개인정보보호책임자 : 이병록
이메일 : cs@codelatte.io|운영시간 09:00 - 18:00(평일)
사업자등록번호 : 824-06-01921|통신판매업신고 : 2021-성남분당C-0740
주소 : 경기도 성남시 분당구 대왕판교로645번길 12, 9층 24호(경기창조혁신센터)
파일
파일파일
Root
파일

package와 extends 키워드와 protected 지시자를 유심히 살펴보세요.

Output
root$