본문 바로가기
Study/Java_study

Java_study_6 (상속)

by hjshims 2021. 8. 9.

♨학습내용

더보기

자바 상속의 특징

super 키워드

메소드 오버라이딩

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

추상 클래스

final 키워드

Object 클래스

 

  •  자바 상속의 특징
  • 상속이란? (Inheritance)

- 하위(자식) 클래스가 상위(부모) 클래스의 모든것을 물려받는 것을 말한다.

- 재사용성과 코드의 간결성을 향상시킬 수 있다.

- 자신이 만들어서 상속 시킬수도 있고 JDK가 지원하는 클래스로 부터 상속 받아서도 사용가능하다.

- 최상위 클래스는 java.lang.Object이다.

- 상속을 받고자 할 때의 키워드는 extends이다.

- 자바는 단일상속만 지원한다.

 

[public/final/abstract] class 클래스명 extends 상위클래스명 {
	멤버 변수;
	멤버 메소드;
}

 

private 멤버를 제외한 상위 클래스의 모든 멤버는 상속 가능하다.

 

class A { // A라는 클래스 생성
	int num;
}



class B extends A { // B 클래스가 생성되고 그와 동시에 A 클래스를 상속
	int num1;
}


// C 클래스가 생성되고 그와 동시에 B 클래스를 상속받고 B 클래스에 상속된 A 클래스도 함께 상속
class C extends B { 
	int num2;
}

 


 

  • super 키워드

- 하위 클래스에서 상위 클래스 객체를 가리키는 포인터이다.

- 하위 클래스와 상위 클래스 모두 동일한 메소드 또는 변수가 있을 때 상위 클래스 멤버를 지지한다.

- 생성자에서만 호출이 가능하다.

 

  • 사용방법

- 멤버 필드 접근 : super.멤버필드

- 멤버 메소드 접근 : super.멤버메소드(매개변수)

- 생성자 접근 : super(매개변수) - 생성자 메소드에서만 사용이 가능

 

/* Parent 클래스 */
class Parent {
    public void print() {
        System.out.println("부모 클래스의 print() 메소드");
    }
}

/* Child 클래스 */
public class Child extends Parent {
    public void print() {
        super.print();
        System.out.println("자식 클래스의 print() 메소드");
    }

    public static void main(String[] args) {
        Child ch = new Child();
        ch.print();
    }
}
[실행결과]
부모 클래스의 print() 메소드
자식 클래스의 print() 메소드

 


 

  • 소드 오버라이딩

- 상속받은 부모 클래스의 메소드(동작)를 자식 클래스에서 재정의 할 때 사용

 

  • 자식 클래스에서 오버라이딩하는 메소드는 부모 클래스의 메소드와의 조건 

- 메소드명은 동일해야한다.

- 매개변수의 타입, 갯수, 순서가 같아야한다.

- 리턴타입이 있어야한다.

- 접근 제어자는 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없다.

- 부모 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

 

public class A {
    int age = 10;
    
    public void setAge(int age) {
        this.age = age;
    }
}
 
class B extends A {
    public void setAge(int age) {
        this.age = age+10;
    }
}

 


 

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

- 어떤 메서드를 호출할 것인가 를 결정하는 과정을 말한다. 즉, 메서드의 의존성을 결정하는 과정이라 할 수 있다.

 

  • 다이나믹 메소드 디스패치란?

- 메소드가 동적으로 붙여진다는 의미이다.

- 어떤 메서드를 실행시킬까는 런타임에 결정하게 되는 것이다. 이를 동적 디스패치라 한다.

 

// Job 추상 클래스
public abstract class Job {
    abstract void printJob();
}

// Job을 상속받은 Student 클래스
public class Student extends Job {
    @Override
    public void printJob() {
        System.out.println("Student");
    }
}

// Job을 상속받은 Teacher 클래스
public class Teacher extends Job {
    @Override
    public void printJob() {
        System.out.println("Teacher");
    }
}

public class DynamicDispatch {
    public static void main(String[] args) {
        Job student = new Student();
        Job teacher = new Teacher();

        student.printJob();
        teacher.printJob();
    }
}

 


  • 추상 클래스

- Abstract 추상적인, 이라는 뜻의 클래스이다.

- 일반 클래스 처럼 변수 또는 함수를 선언할 수 있지만, abstaract를 붙여 그 형태만을 붙일 수 있다.

- 일반 변수 또는 함수를 선언할 수 없다는 것이 인터페이스와의 차이점이다.

- 반드시 상속을 통해서만 완성된다.

- 추상클래스로는 객체 생성을 못한다.

- 클래스가 한개 이상추상메서드포함하면 무조건 그 클래스는 추상클래스가 된다.

 

//추상클래스 생성
abstract class Figure {
    abstract void area(int a, int b);
}
//추상클래스를 상속받는 자식 클래스 생성
class Ractangle extends Figure {
    void area (int a, int b) {
        System.out.println("사각형의 넓이 : " + (a * b));
    }
}
//실행클래스
class Example {
    public static void main(String args[]) {
        Ractangle ract = new Ractangle();
        ract(2, 3);
    }
}
//실행결과
사각형의 넓이 : 6

 


 

  • final 키워드

- 마지막, 변경될 수 없다는 의미를 가진다.

 

  •  final 클래스: 변경될 수 없는 클래스, 확장될 수 없는 클래스를 말한다.

- final 클래스를 상속받으려고 하면 에러 발생

 

final class Parent {
}

public class Solution extends Parent { // Error: The type Solution cannot subclass the final class Parant

 

  •  final 메소드: 변경될 수 없는 메소드, overriding이 불가능하다. (overloading은 가능)

- final 메소드를 상속받으려고 하면 에러 발생

 

class Parent {
    final void thisIsFinal() {
    }
    void thisIsNotFinal() {
    }
}

public class Solution extends Parent {
    @Override
    void thisIsFinal() { // Error: thisIsFinal() in Solution cannot override thisIsFinal() in Parent
  overridden method is final
    }

    @Override
    void thisIsNotFinal() {	// 이건 가능
    }

 

  •  final 변수: 값을 변경할 수 없는 상수가 된다.

- final 변수의 값을 바꾸려고 시도하면 에러 발생

 

public class Solution {
    final static int LIMIT = 10;

    public static void main(String[] args) {
        System.out.println(Solution.LIMIT);
        Solution.LIMIT = 11; // Error: cannot assign a value to final variable LIMIT
    }

 


 

  • Object 클래스

- Object 클래스는 모든 클래스의 최상위 클래스이다.

- 아래 두 클래스는 동일한 클래스이다.

 

public class Parent {

}

public class Parent extends Object {

}

 

  • 모든 클래스는 Object클래스의 멤버를 상속받으면 다음과 같은 멤버들이 존재한다.

- Object clone() : 객체를 복제한다.

- boolean equals(Object object) : 두 개의 객체가 같은 지를 비교하고 같으면 true, 다르면 false를 반환한다.

- void finalize() : 가비지 컬렉팅이 수행되기 전에 호출되며 객체가 점유하고 있던 자원을 해제한다.

- Class getClass() : 객체의 클래스명을 Class 형의 객체로 반환한다.

- int hashCode() : 자바에서 객체를 식별하는 정수 값인 해시 코드(16진수)를 반환한다.

- String toString() : 현재 객체의 문자열 표현을 반환하고 Object 클래스에서는 클래스명@해시코드값을 리턴한다.

 

- void notify() : 대기중인 쓰레드 중 하나의 쓰레드를 다시 시작한다.  

- void notifyAll() : 대기중인 모든 쓰레드를 다시 시작한다.

- void wait() : Thread의 작동을 중지하고 대기상태로 전환한다.

 

 

'Study > Java_study' 카테고리의 다른 글

Java_study_8 (인터페이스)  (0) 2021.08.17
Java_study_7 (패키지)  (0) 2021.08.11
Java_study_5 (클래스)  (0) 2021.08.04
Java_study_4 (제어문)  (0) 2021.08.01
Java_study_3 (연산자)  (0) 2021.07.26