[JAVA] 상속(inheritance)이란? [상속의 개념, 조상 클래스와 자손 클래스]

2022. 9. 14. 16:15·◎ Java/Java☕
728x90

 


1. 상속(inheritance)이란?

기존의 클래스를 재사용하여
새로운 클래스를 작성하는 것

 

상속을 통해, 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있다.
→ 클래스 이름 뒤에 상속받고자 하는 클래스의 이름과 그 앞에 키워드 'extends'만 붙여주면 된다.
class Child extends Parent {
    // Child 클래스가 Parent 클래스를 상속 받았다.
}

2. 조상 클래스와 자손 클래스

위의 두 클래스는 서로 상속 관계에 있다고 한다.
상속해주는 클래스를 '조상 클래스', 상속 받는 클래스를 '자손 클래스'라 한다.
조상 클래스 : 부모(parent) 클래스, 상위(super) 클래스, 기반(base) 클래스
자손 클래스 : 자식(child) 클래스, 하위(sub) 클래스, 파생된(derived) 클래스

 

서로 상속관계에 있는 두 클래스를 그림으로 표현하면 다음과 같다.
class Parent {}
class Child extends Parent {}

클래스 Parent와 Child의 상속 관계도

 

자손 클래스는 조상 클래스의 모든 멤버를 상속받는다.
따라서 Child 클래스는 Parent 클래스의 멤버들을 포함한다고 할 수 있다.

클래스 Parent와 Child의 다이어그램

 

만일 Parent 클래스에 age라는 정수형 변수를 멤버변수로 추가하면, 자손 클래스는 조상의 멤버를 모두 상속받기 때문에 Child 클래스는 자동적으로 age라는 멤버변수가 추가되는 효과를 얻는다.
class Parent {
    int age;
}

class Child extends Parent {}

Child는 Parent를 상속 받았기에, Parent의 변수 age를 사용할 수 있다.

 

이번엔 반대로 자손인 Child 클래스에 새로운 멤버로 play() 메서드를 추가해 보았다.
자손 클래스에 추가된 멤버는 조상 클래스에 아무런 영향을 미치지 못한다.
class Parent {
    int age;
}

class Child extends Parent {
    void play() {
    	System.out.println("놀자~");
    }
}

Child의 멤버는 Parent에 영향을 주지 못한다.

 

자손 클래스는 조상 클래스의 모든 멤버를 상속 받으므로 항상 조상 클래스보다 같거나 많은 멤버를 갖는다.
즉, 상속에 상속을 거듭할수록 상속받는 클래스의 멤버 개수는 점점 늘어난다.

- 상속의 특징
1) 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
2) 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.

* 상속을 받는다는 것은 조상 클래스를 확장(extends)한다는 의미로 해석할 수도 있다. 그래서 키워드가 'extends'!


3. 클래스 간의 상속 관계

이번엔 Parent 클래스로부터 상속받는 Child2 클래스를 새로 생성해보았다.
class Parent {}
class Child extends Parent {}
class Child2 extends Parent {}

클래스 Child2가 추가된 상속 관계도

 

클래스 Child와 Child2 모두 Parent 클래스를 상속받고 있다. Child와 Parent, Child2와 Parent는 상속관계에 있지만, Child와 Child2 간에는 아무 관계가 성립하지 않는다.

→ Parent 클래스에 새로운 멤버를 추가하면 Child와 Child2 모두 추가하는 효과를 얻는다.
→ 클래스 간의 관계에서 형제 관계 같은 건 없다. 오직 부모와 자식의 관계(상속관계)만이 존재한다.
→ 이러한 상속관계를 이용해서 코드의 중복을 최소화 할 수 있다.

여기에 또다시 Child 클래스로부터 상속받는 GrandChild라는 클래스를 추가하면 다음과 같아진다.
class Parent {}
class Child extends Parent {}
class Child2 extends Parent {}
class GrandChild extends Child {}

클래스 GrandChild가 추가된 상속 관계도

 

자손 클래스는 조상 클래스의 모든 멤버를 물려받으므로 GrandChild는 Child의 조상인 Parent의 멤버까지 상속받게 된다. GrandChild에게 Child 클래스는 '직접 조상'이고, Parent 클래스는 '간접 조상'이 된다.

Parent 클래스에 정수형 변수인 age를 추가하면 아래와 같다.
class Parent {
    int age;
}
class Child extends Parent {}
class Child2 extends Parent {}
class GrandChild extends Child {}

GrandChild가 포함된 다이어그램

 

Parent 클래스는 클래스 Child, Child2, GrandChild의 조상이므로 멤버변수 age는 Parent의 모든 자손에게 추가된다. 반대로 Parent 클래스에서 멤버변수 age를 제거 한다면, 모든 자손 클래스에서도 제거된다.

→ 조상 클래스만 변경해도 모든 자손 클래스에, 자손의 자손 클래스에까지 영향을 미친다.
→ 클래스의 상속 관계를 맺어 주면 자손 클래스의 공통적인 부분은 조상 클래스에서 관리하면 된다.

- 상속에 대해 알아두면 좋은 내용

- 자손의 인스턴스를 생성하면 조상과 자손의 클래스 멤버가 합쳐진 하나의 인스턴스로 생성
- 자손은 부모를 알지만, 부모는 자손을 모른다.

 

참고문헌 : 남궁성(2016), Java의 정석, 도우출판


728x90
'◎ Java/Java☕' 카테고리의 다른 글
  • [JAVA] 추상클래스(abstract class)와 인터페이스(interface)의 차이 [추상클래스 VS 인터페이스, 예제를 통한 차이 비교]
  • [JAVA] 클래스 간의 관계 [Composite, 포함관계, 관계 결정하기]
  • [JAVA] 멤버변수의 초기화 시기와 순서 [클래스변수와 인스턴스변수의 초기화 순서]
  • [JAVA] 명시적 초기화(explicit initialization)와 초기화 블럭(initialization block) [변수를 초기화하는 방법]
예르미(yermi)
예르미(yermi)
끊임없이 제 자신을 계발하는 개발자입니다👨🏻‍💻
  • 예르미(yermi)
    예르미의 코딩노트
    예르미(yermi)
  • 전체
    오늘
    어제
    • 분류 전체보기 (937)
      • ◎ Java (133)
        • Java☕ (93)
        • JSP📋 (26)
        • Applet🧳 (6)
        • Interview👨🏻‍🏫 (8)
      • ◎ JavaScript (48)
        • JavaScript🦎 (25)
        • jQuery🌊 (8)
        • React🌐 (2)
        • Vue.js🔰 (6)
        • Node.js🫒 (3)
        • Google App Script🐑 (4)
      • ◎ HTML5+CSS3 (17)
        • HTML5📝 (8)
        • CSS3🎨 (9)
      • ──────────── (0)
      • ▣ Framework (67)
        • Spring🍃 (36)
        • Spring Boot🍀 (12)
        • Bootstrap💜 (3)
        • Selenium🌕 (6)
        • MyBatis🐣 (10)
      • ▣ Tools (47)
        • API🎯 (18)
        • Library🎲 (15)
        • JitPack🚀 (3)
        • Jenkins👨🏻 (7)
        • Thymeleaf🌿 (4)
      • ▣ Server (32)
        • Apache Tomcat🐱 (14)
        • Apache HTTP Server🛡️ (1)
        • Nginx🧶 (7)
        • OracleXE💿 (4)
        • VisualSVN📡 (4)
      • ▣ OS : 운영체제 (18)
        • cmd : 명령프롬프트💻 (10)
        • Linux🐧 (8)
      • ▣ SQL : Database (56)
        • Oracle SQL🏮 (26)
        • PL SQL💾 (9)
        • MySQL🐬 (6)
        • MariaDB🦦 (6)
        • H2 Database🔠 (3)
        • SQL 실전문제🐌 (6)
      • ────────── (0)
      • ◈ Human Project (86)
        • Mini : Library Service📚 (15)
        • 화면 설계 [HTML]🐯 (10)
        • 서버 프로그램 구현🦁 (15)
        • Team : 여수어때🛫 (19)
        • Custom : Student🏫 (9)
        • Custom : Board📖 (18)
      • ◈ Yermi Project (40)
        • 조사모아(Josa-moa)📬 (5)
        • Riddle-Game🧩 (6)
        • 맛있을 지도🍚 (2)
        • 어디 가! 박대리!🙋🏻‍♂️ (5)
        • 조크베어🐻‍❄️ (4)
        • Looks Like Thirty🦉 (2)
        • Toy Project💎 (12)
        • 오픈소스 파헤치기🪐 (4)
      • ◈ Refactoring (15)
        • Mini : Library Service📚 (8)
        • 서버 프로그램 구현🦁 (1)
        • Team : 여수어때🛫 (0)
        • 쿼리 튜닝일지🔧 (6)
      • ◈ Coding Test (89)
        • 백준(BOJ)👨🏻‍💻 (70)
        • 프로그래머스😎 (2)
        • 코드트리🌳 (7)
        • 알고리즘(Algorithm)🎡 (10)
      • ◈ Study (102)
        • 기초튼튼 개발지식🥔 (25)
        • HTTP 웹 지식💡 (4)
        • 클린코드(Clean Code)🩺 (1)
        • 디자인패턴(GoF)🥞 (12)
        • 다이어그램(Diagram)📈 (4)
        • 파이썬(Python)🐍 (16)
        • 에러노트(Error Note)🧱 (34)
        • 웹 보안(Web Security)🔐 (6)
      • ◈ 공부모임 (39)
        • 혼공학습단⏰ (18)
        • 코드트리 챌린지👊🏻 (2)
        • 개발도서 100독👟 (8)
        • 나는 리뷰어다🌾 (11)
      • ◈ 자격증 공부 (37)
        • 정보처리기사🔱 (16)
        • 정보처리산업기사🔅 (9)
        • 컴퓨터활용능력 1급📼 (12)
      • ─────────── (0)
      • ◐ 기타 (113)
        • 알아두면 좋은 팁(tip)✨ (46)
        • 개발자의 일상🎈 (44)
        • 개발도서 서평🔍 (10)
        • 개발관련 세미나🎤 (2)
        • 블로그 꾸미기🎀 (9)
        • 사도신경 프로젝트🎚️ (2)
  • 인기 글

  • 최근 댓글

  • 태그

    SQL
    Error Note
    Project
    Database
    코딩
    코딩 테스트
    Java
    spring
    꿀팁
    BOJ
    Oracle
    html
    CSS
    일상
    jsp
    백준
    javascript
    자바스크립트
    백준 티어
    프로그래밍
  • 250x250
  • hELLO· Designed By정상우.v4.10.3
예르미(yermi)
[JAVA] 상속(inheritance)이란? [상속의 개념, 조상 클래스와 자손 클래스]
상단으로

티스토리툴바