JAVA #10 - 상속

김형우·2022년 2월 24일
0

JAVA

목록 보기
10/12

누군가가 class를 주면,
상속 => 변경 => 사용

Parent.java

  • 외부 라이브러리라고 간주함
  1. 부모 클래스에서 정의한 메소드는 자식 클래스에서 사용가능
    : 자식 클래스에서 extends 필요

  2. 부모 클래스에서 만든 메소드 중 abstract 한 메소드는 추상화 한 메소드로서, 자식 클래스는 반드시 그 메소드를 수행해야 함.
    : 부모 메소드중 하나에 abstract 설정을 했다면
    = public abstract void printNum1();
    : 부모 클래스 속성에도 abstract를 설정해야 함.
    = public abstract class Parent
    2-1. 추상화 했기 때문에 자식이 일을 마무리 하지 않는 이상 부모의 일도 끝나지 않음
    2-2. 빈 설계도를 줌으로써 자식이 편하게 만들 자유를 줌
    2-3. 단, 자식은 반드시 이 메소드를 수행해야함

package com.example.basic;

import lombok.Getter;
import lombok.Setter;

// getter/setter는 필요할때마다 생성(사용)
// 생성자는 최초 한번만 생성(사용)
@Getter
@Setter
public abstract class Parent {
    // 변수 : 클래스의 공통변수
    private int num = 0;

    // 생성자 : 클래스명과 일치
    // 여러개 가능 => 오버로딩
    public Parent() {

    }

    // 생성자
    public Parent(int num) {
        this.num = num;
    }

    // getter/setter

    // 메소드
    public void printNum() {
        System.out.println("Parent => printNum ===> " + this.num);

    }

    // 메소드 : 기능구현X, 자식은 반드시 이 메소드의 기능을 구현해야함
    // abstract = 추상 => 설계만 해둠
    // 클래스 명 앞에도 반드시 명시해야함
    public abstract void printNum1();
    // 추상화 했기 때문에 자식이 일을 마무리 하지 않는 이상 부모의 일도 끝나지 않음
    // 빈 설계도를 줌으로써 자식이 편하게 만들 자유를 줌
    // 단, 자식은 반드시 이 메소드를 수행해야함
}

Child1.java - implement

  1. extends => 외부 라이브러리(클래스) 사용 선언

  2. 생성자에서 super => 부모의 생성자를 호출

  3. @Override => 부모의 기능 재구현 (부모의 구현부 + 자식의 구현부)

  4. 자식 클래스에서 Parent1 클래스(interface)를 사용하려면 implements Parent1추가

  5. Parent1의 추상화된 메소드를 수행해야함

// Parent1의 추상화된 메소드
public void printA();
public void printB();
  1. Child1에서 오버라이드 시켜야 함
@Override
public void printA() {
	       
}

@Override
public void printB() {
	       
}

전체코드 Child1.java

package com.example.basic;

// Parent는 라이브러리고
//Child1을 만드는데 기존기능 + 새로운 기능추가
public class Child1 extends Parent implements Parent1 {

    public Child1() {
    }

    public Child1(int num) {

        // 부모의 생성자를 호출
        // = public Parent(int num)
        super(num);
    }

    // @Override = 부모의 기능 재구현 (부모의 구현부 + 자식의 구현부)
    @Override
    public void printNum() {
        // 부모의 메소드 호출
        super.printNum();
        System.out.println("Child1에서 출력하는 기능 추가");
    }

    // 부모와 전혀 상관없는 메소드
    public void printChild1() {
        System.out.println("printChild1");
    }

    @Override
    public void printNum1() {
        // 자식입장에서는 이 일이 뭔지는 모르지만 해야하는 입장인것은 알고 있음
        // 부모가 자식에게 남긴 일(printNum1())을 이 시점에 완료함.
        System.out.println("printChild1-printNum1");

    }

    @Override
    public void printA() {
        // TODO Auto-generated method stub

    }

    @Override
    public void printB() {
        // TODO Auto-generated method stub

    }

}

Parent1.java - interface

  1. 부모 클래스를 interface로 만듦
    : interface = 여러 부모에게서 상속을 받아야 하는 경우

  2. 정의만 두개 함

public void printA();
public void printB();

App.java - 클래스 사용(컨트롤)

  • 클래스명 변수 = new 클래스명();
  1. 부모클래스명 변수 = new 부모클래스명();
    : 미완성 된 클래스(Parent)라서 불러올수 없음
    : 미완성 이유 : abstract로 추상화된 일을 자식에게 남겨두었기떄문

  2. 자식클래스명 변수 = new 자식클래스명();
    : 의미가 없는 호출

  3. 부모클래스명 변수 = new 자식클래스명();
    : 가장 많이 사용
    : 자식이 부모의 클래스에서 추상화 시킨 메소드를 수행 할 수 있다.

// 클래스명 변수 = new 클래스명();

        // // 미완성 된 클래스(Parent)라서 불러올수 없음
        // // 미완성 이유 : abstract로 추상화된 일을 자식에게 남겨두었기떄문
        // Parent obj1 = new Parent();
        // obj1.printNum();

        // 가장 많이 사용함
        Parent obj2 = new Child1();
        obj2.printNum();
        obj2.printNum1();

        // Child1에는 없는 메소드(printNum();)지만 상속받은경우 모두 사용가능
        // // 의미가 없는 호출
        // Child1 obj3 = new Child1();
        // obj3.printNum();
        // obj3.printChild1();
profile
The best

0개의 댓글