[JAVA] 객체지향 - 상속, 포함

2024. 9. 1. 01:21·Back-End/Java

[작성일: 2023. 01. 26]

 

목차

     

    상속(Inheritance)

    • 기존의 클래스로 새로운 클래스를 작성하는 것
    • 객체지향의 가장 큰 특징: *코드의 재사용
    • 두 클래스를 부모와 자식으로 관계를 맺어주는 것
    • 부모 객체가 먼저 생성되고 자식 객체가 생성 됨.
    • 부모 클래스로부터 변수와 메서드를 물려받는 것
    • 클래스를 만들 때 처음부터 모든 것을 만드는 것이 아니라, 부모로부터 상속을 받고 추가적인 것만 새로 만들거나 고치는 것
    ✏️ 용어
    부모 클래스, super, 상위 클래스, 베이스 클래스 ➡️ 주는 쪽
    자식 클래스, 서브, 하위, 파생(Derived) ➡️ 받는 쪽
    class 자식클래스 extends 부모클래스 {
      // ...
    }
    
    class Parent {} // 기존의 클래스
    class Child extends Parent { 
      // ...
    }​

     

    • 자손은 조상(부모의 부모)의 모든 멤버를 상속받음. (생성자, 초기화 블럭 제외)
    • 자손의 멤버 개수는 조상보다 적을 수 없음. (같거나 많음.) ➡ 조상의 모든 멤버를 상속받기 때문.
    class Parent {
      int age; // 부모는 멤버 1개
    }
    
    class Child extends Parent{} 
    //멤버 0개 (실제로는 멤버 1개-> 상속받은 멤버 1개 존재)

     

    • 자손의 변경은 조상에 영향을 미치지 않음.
    class Parent { // 멤버 1개
      int age;
    }
    
    class Child extends Parent {
      void play() { // 새로운 멤버 추가
        System.out.println("놀자~");
        // 자신의 멤버 1개+ 상속 멤버1개 = 멤버 2개
      }
    }

     

     

     

    연습예제 1

    // 부모가 될 클래스 생성
    class Point {
      int x;
      int y;
    }    
    
    // 1. 부모 클래스와 관계없는 새로운 클래스
    // 부모 클래스를 변경해도 전혀 관여받지 않음.
    class Point3D { 
      int x;
      int y;
      int z;
        
    // 2. 부모 클래스와 상속관계
    // 부모 클래스가 바뀌면 Point3D 클래스에도 영향을 미침
    class Point3D extends Point { 
      int z;
    }

     

     

     

    연습예제 2

    class Tv {
      boolean power; // 전원상태 (on/off)
      int channel; // 채널
        
      void power()      { power = !power; }
      void channelup()  { ++channel; }
      void cannelDown() { --channel; }
    }
    class SmartTv extends Tv {
      boolean caption;
      void displayCaption(String text) {
        if (caption) { // 캡션 상태가 true일 때 text 보여줌.
          System.out.println(text);
        }
      }
    }
    
    class Ex7_1 {
      public static void main(String args[]) {
        SmartTv stv = new SmartTv();
        stv.channel = 10; // 조상 클래스로부터 상속받은 멤버
        stv.channelUp(); // 조상 클래스로부터 상속받은 멤버
        System.out.println(stv.channel);
        stv.displayCaption("Hello, World");
        stv.caption = true;
        stv.displayCaption("Hello, World");
      }
    }

     

     

     

     

     

    포함(Composite)

    • 클래스의 멤버로 참조변수를 선언하는 것.
    • 작은 단위의 클래스를 만들고, 이들을 조합해서 클래스를 만듦.
    class Circle {
      int x; // 원점의 x 좌표
      int y; // 원점의 y 좌표
      int r; // 반지름
    }
    
    ⬇
    
    class Circle { // circle이 point를 포함하고 있는 관계
      Point c = new Point(); // 원점
      int r; // 반지름
    }
    
    class Point {
      int x;
      int y;
    }

     

     

     

     

     

    클래스 간의 관계 결정하기

    • 상속관계 'A는 B이다.(is-a)'
    • 포함관계 'A는 B를 가지고 있다.(has-a)'
    // 더 자연스러운 코드는?
    // 1.
    class Circle { // 포함
      Point p = new Point();
      int r;
    }
    
    // 2. 
    class Circle extends Point { // 상속
      int r;
    }
    
    
    class Point {
      int x;
      int y;
    }
    
    public class InheritanceTest {
      public static void main(String[] args) {
        Circle c = new Circle();
        c.x = 1;
        c.y = 2;
        c.r = 3;
      //System.out.println("c.x="+c.z);
      //System.out.println("c.y="+c.y);
        System.out.println("c.p.x="+c.p.x);
        System.out.println("c.p.y="+c.p.y);
        System.out.println("c.r="+c.r);
      }
    }

     

    ✏️ 원(Circle)은 점(Point)이다. - Circle is a Point.

    ✏️ 원(Circle)은 점(Point)을 가지고 있다. - Circle has a Point. ✅

     

     

     

     

     

    단일 상속(Single Inheritance)

    • Java는 단일 상속만 허용함.
    • 비중이 높은 클래스 하나만 상속관계, 나머지는 포함관계로 함.
    class TvDVD extends Tv, DVD {
      // ... // 에러. 조상은 하나만 허용됨.
    }

     

     

     

     

     

    Object클래스

    • 모든 클래스의 조상
    • 부모가 없는 클래스는 자동적으로 Object 클래스를 상속받음.
    • 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받음.
      - toString(), equals(Object obj), hashCode(), ...
    class Tv extends Object { // 컴파일러 자동 추가
      // ...
    }
    
    class SmartTv extends Tv {
      // ...
    }

     

    상속 계층도

     

     

     

     

     

     

     

     

     

     


    🐣 해당 게시글은 자바의 정석(남궁성 님) 영상으로 함께 공부하며 요약/정리한 글입니다.
    🐣 입문 개발자가 작성한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.

     

    저작자표시 비영리 변경금지
    'Back-End/Java' 카테고리의 다른 글
    • [JAVA] 객체지향 - 패키지
    • [JAVA] 객체지향 - super
    • [JAVA] 객체지향 - 생성자
    • [JAVA] 객체지향 - 매개변수
    뚜비
    뚜비
    1년차 백엔드&iOS 개발자의 감자 탈출 블로그 🥔🥔
    • 뚜비
      뚜비의 개발로그
      뚜비
    • 전체
      오늘
      어제
    • 글쓰기     관리
      • Devlog
        • Back-End
          • Java
          • Spring
          • JPA
          • HTTP
          • Security
          • Back-End
          • Front-End
        • 알고리즘
        • iOS
          • Swift
        • Database
        • Tips
          • Git & GitHub
          • A to Z
        • 프로젝트
        • 생각정리
    • 태그

      게시판만들기
      javascript
      의존성주입
      성능최적화
      프로그래머스
      최주호
      DB
      JPA
      알고리즘
      변수
      김영한
      Spring Security
      백준
      jsp
      자바스크립트
      sql
      객체
      자바
      html
      Security
      생성자
      Swift
      HTTP
      스프링
      spring
      Database
      MVC
      다형성
      데이터베이스
      Java
    • hELLO· Designed By정상우.v4.10.0
    뚜비
    [JAVA] 객체지향 - 상속, 포함
    상단으로

    티스토리툴바