6주차 과제: 상속

2021. 1. 27. 18:58
728x90

목표

자바의 상속에 대해 학습하세요.

학습할 것 (필수)

  • 자바 상속의 특징
  • super 키워드
  • 메소드 오버라이딩
  • 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
  • 추상 클래스
  • final 키워드
  • Object 클래스

자바 상속의 특징

 

 

 

상속이란

 

부모 클래스(상위 클래스)와 자식 클래스(하위 클래스)가 있으며, 자식 클래스는 부모 클래스를 선택해서,

그 부모의 멤버를 상속받아 그대로 쓸 수 있게 된다.

 

  • 기존 클래스를 재사용해서 새로운 클래스를 작성하는 것 => 효율적이고 개발시간을 줄일 수 있음
  • 두 클래스를 조상과 자손으로 관계를 맺는 것
  • 자손은 조상의 모든 멤버를 상속받는다.
  • 자손의 멤버개수는 조상보다 같거나 많다.
  • 상속을 받을 때 'extends'키워드를 사용한다.
  • 부모 클래스의 private접근 제한을 갖는 필드 및 메소드는 자식이 물려받을 수 없다.
  • 부모와 자식 클래스가 서로 다른 패키지에 있다면, 부모의 default접근 제한을 갖는 필드 및 메소드도 물려받을 수 없다. ( default접근 제한은 같은 패키지에 있는 클래만 접근이 가능)

 

// 부모 클래스

public class Parent {
    String name;
    int age;

    public void nameAndAge(){
        System.out.println("이름: "+ name);
        System.out.println("나이: "+ age);
    }
}
// 자식 클래스

public class Child extends Parent {
    public Child(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        Child c = new Child("sujin",20);

        c.nameAndAge();

    }
}

// 실행 결과

 

=> 자식클래스에 변수와 메소드를 선언하지 않아도 부모클래스를 상속받았기 때문에 변수와 메소드를 사용할 수 있음.

 

 

 

 

super 키워드

 

부모클래스의 상속을 받고 자식 객체를 생성하면 따로 부모객체를 생성하는 코드는 구현되어

있지 않지만 사실 내부적으로는 부모 객체 생성 후, 자식 객체가 생성되는 것.

 

생성자는 생성자 선언이 없다면 컴파일러는 알아서 기본 생성자를 생성하여 호출한다.

위의 코드에서 부모클래스에서는 명시적 생성자 선언이 없었고, 자식 클래스는 명시적 생성자 선언이 존재한다.

그렇다면 이때 부모 클래스의 생성자 선언은 자식 클래스의 생성자 선언 내부 첫줄에 

super();라고 생성된다.

 

=> 부모의 명시적 생성자 선언이 없었으므로, 컴파일러가 super();를 생성.

     그 super(); 는 부모 클래스의 기본 생성자를 컴파일러가 호출하는것.

 

super 키워드는 부모클래스(객체)를 나타내는 것

 

부모클래스에 매개변수가 있는 명시적 생성자만 있다면 자식클래스에서 반드시 생성자 내부 첫줄에

super(매개값, ... ); 과 같이 선언해주어야 한다.

 

 

//부모 클래스


public class Parent {
    String name;
    int age;

    public Parent(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void nameAndAge(){
        System.out.println("이름: "+ name);
        System.out.println("나이: "+ age);
    }
}

 

//자식 클래스


public class Child extends Parent {
    public Child(String name, int age) {
        super(name, age);
    }

    public static void main(String[] args) {
        Child c = new Child("sujin",20);

        c.nameAndAge();

    }
}

// 실행결과

 

 

 

메소드 오버라이딩

 

 

오버라이딩이란

부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하여 사용하는 것

자식클래스에서 부모의 메소드를 수정해야 할때 사용

일반 클래스의 상속관계에서는 많이 사용되지 않고 추상클래스나 인터페이스에서 필수적으로 사용되는 개념

오버라이딩 결과 부모 메소드는 은닉되고 자식 클래스에서 재정의된 메소드만 기본적으로 호출

필요 시 super.메소드() 로 부모 메소드를 호출 할 수 있다.

 

 

오버라이딩 조건

  • 호출하고자 하는 메소드는 부모클래스에 존재해야한다.
  • 메소드 명은 동일해야 한다.
  • 매개변수와 타입이 같아야 한다.
  • 반환 타입이 같아야 한다.
  • 접근제어자는 부모클래스에 정의된 것 보다 넓거나 같아야 한다.
  • 오버로딩과는 완전히 다른것

 

* 오버로

같은 이름을 갖고 있지만 서로 다른 매개변수 형식을 가지고 있는 메소드 여러개를 정의하는것

이름, 리턴타입이 같고 매개변수의 개수 또는 매개변수의 자료형이 달라야한다.

 

 

 

//부모 클래스

public class Parent {
    String name;
    int age;

    public Parent(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void nameAndAge(){
        System.out.println("이름: "+ name);
        System.out.println("나이: "+ age);
    }
}
public class Child extends Parent {
    String major = "국어국문";
//자식 클래스

    public Child(String name, int age) {
        super(name, age);
    }

	//오버라이딩된 메소드
    public void nameAndAge() { 
        System.out.println("이름: "+ name);
        System.out.println("나이: "+ age);
        System.out.println("주소: " + major);

        System.out.println();
        System.out.println("부모 메소드");
        super.nameAndAge();
    }
    public static void main(String[] args) {
        Child c = new Child("sujin",20);
        System.out.println("오버라이딩된 메소드");
        c.nameAndAge();

    }
    
}

// 실행 결과

 

 

 

다이나믹 메소드 디스패치 (Dynamic Method Dispatch)

 

 

메소드 디스패치

어떤 메소드를 호풀할 지 결정하여 실제로 실행시키는 과정을 말한다.

정적 메소드 디스패치(Static Method Dispatch), 동적 메소드 디스패치(Dynamic Method Dispatch),

더블 디스패치(Double Method Dispatch) 세가지가 있다.

 

 

정적 메소드 디스패치(Static Method Dispatch)

 

오버라이딩한 메소드를 호출했을 때 컴파일러는 부모의 메소드가 아닌 오버라이딩한 메소드를 호출하고

실행시켜야 되는 것을 알고 있다. 이를 정적 메소드 디스패치라고 한다. (오버로딩 포함)

 

 

동적 메소드 디스패치(Dynamic Method Dispath)

 

동적 메소드 디스패치는 정적 디스패치와는 다르게 컴파일러가 어떤 메소드를 호출해야되는지

모르는 것을 말한다.

 

*참고*

blog.naver.com/swoh1227/222181505425

 

온라인 자바 스터디#6 - 자바 상속(메소드 오버라이딩, 추상클래스, 다이나믹 메소드 디스패치)

유튜브를 통해 자바 스터디를 진행하는 프로그램이 있어 한번 정리해볼까 합니다.(아래는 해당 링크이니 참...

blog.naver.com

 

 

추상클래스

 

 

 

추상클래스란 

 

클래스들의 공통되는 필드와 메소드를 정의한 클래스를 말한다.

추상클래스는 아직 실체성이 없고 구체적이지 않기 때문에 객체를 생성할 수 없다.

추상클래스와 실체클래스는 상속적인 관계를 가진다.

추상클래스를 상속받는 클래스는 추상메소드를 반드시 오버라이딩 해야한다. => 다형성이 발생

 

 

  • class 앞에 abstract 추가
  • method앞에 abstract추가
  • 중괄호 {} 없이 세미콜론 ; 으로 종료
abstract class 클래스명{

	abstract 리턴타입 메소드명([매개변수...]);
    

 

 

 

사용하는 이유

 

  1. 공통된 필드와 메소드를 통일할 목적 => 필드와 메서드 이름을 통일하여 유지보수성을 높이고 통일성 유지
  2. 실체 클래스 구현시 시간절약
  3. 규격에 맞는 실체 클래스 구현

 

// 추상클래스

public abstract class Person {
    String name;
    int age;

    public abstract void print();
}
public class Sujin extends Person {

    public Sujin() {
        this.name = "sujin";
        this.age = 27;
    }

    @Override
    public void print() {
        System.out.println("수진이 나이: " + age);
    }
}

=> 추상메소드 print를 오버라이딩해 구현하였음.

      추상 메서드의 접근 지정자에는 private를 사용할 수 없다.

 

 

 

 

final 키워드

 

final이 변수나 메서드나 클래스 앞에 붙으면, 해당 엔티티(변수/메서드/클래스)는 변경할 수 없는 엔티티가 된다.

 

final 변수 :  상수를 의미 , 생성자나 대입연산자를 통해 한번만 초기화 가능한 변수

 

final 메소드 :  오버라이드하거나 숨길 수 없음을 의미.

 

final 클래스 :  해당 클래스를 상속할 수 없음을 의미. 

 

 

 

 

Object 클래스

 

 

  • java.lang.Object
  • 모든 클래스의 최상위 클래스

Object클래스는 모든 클래스의 최상위 클래스로 모든 클래스는 Object클래스를 상속받는다.

따라서, 모든 클래스는 Object클래스의 메소드를 사용할 수 있고 일부 메소드를 오버라이드해서 사용할 수 있다.

Object가 클래스가 들어있는 java.lang 패키지는 컴파일러에 의해 자동으로 import된다

그래서 따로 import하지 않아도 사용할 수 있다.

 

메소드

설명

boolean equals(Object obj)

두 객체가 같은 지 비교한다.(같으면 true, 틀리면 false)

String toString()

객체의 문자열을 반환한다.

protected Object clone()

객체를 복사한다.

protected void finalize()

가비지 컬렉션 직전에 객체의 리소스를 정리할때 호출한다.

Class getClass()

객체의 클레스형을 반환한다.

int hashCode()

객체의 코드값을 반환한다.

void notify()

wait된 스레드 실행을 재개할 때 호출한다.

void notifyAll()

wait된 모든 스레드 실행을 재개할 때 호출한다.

void wait()

스레드를 일시적으로 중지할 때 호출한다.

void wait(long timeout)

주어진 시간만큼 스레드를 일시적으로 중지할 때 호출한다.

void wait(long timeout, int nanos)

[출처] 온라인 자바 스터디#6 - 자바 상속(메소드 오버라이딩, 추상클래스, 다이나믹 메소드 디스패치)|작성자 슝스

 

 

 

 


참고

 

 

[JAVA] Object 클래스 - 오브젝트 클래스

▶ Object 클래스 - 오브젝트 클래스 ● Object클래스 : 단순하게 모든클래스(API 또는 내가 만든 class 등)는 Object클래스의 자식클래스이다. 즉, Object클래스가 자바에서 '최상의 클래스'이다. Object

choseongho93.tistory.com

 

[JAVA] 자바 추상클래스란?

[JAVA] 자바 추상클래스란? 추상클래스 이 글 하나로 박살내자. 추상클래스의 문법적인 특징이나, 객체생성이 되고 안되고 이런 특징들이 중요한게 아닙니다. 도대체 추상클래스가 무엇이고 왜

limkydev.tistory.com

 

[JAVA/자바] 메소드 오버라이딩(overriding)

이번 포스팅은 메소드 오버라이딩에 대해서 알아보도록 하겠다. (오버로딩과 단어는 비슷하지만 다른 내용...

blog.naver.com

 

JAVA의 오버라이딩(Override)

Override는 '기각하다', '무시하다'의 뜻을 담고있다. 즉, '기존의 것을 무시하고 덮어쓰다.'의 의미를 가진다. 자바에서 메소드 오버라이딩이란, 상속의 관계에 있는 클래스 간에 하위 클래스가 상

velog.io

 

[자바/JAVA 개발] 자바 상속(extends) 와 메소드 오버라이딩(overriding),super()메소드

- 상속이란 무엇이고 왜 쓰는가? 1. 기존의클래스를 재사용 해서 새로운 클래스를 작성하는것 2. 두 클래스를 조상과 자손으로 관계를 맺어준다 3. 자손은 조상의 모든 멤버를 상소 받는다. 4. 자

mainpower4309.tistory.com

 

자바(JAVA) - 상속(Inheritance) (1) 클래스 상속, 부모 생성자의 호출

상속이란?

chanhuiseok.github.io

 

 

 

 

 

 

 

 

728x90

BELATED ARTICLES

more