티스토리 뷰

728x90
반응형

목표

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

 

스터디 목차

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

 

 

1. 자바 상속의 특징

 

상속(inheritance)이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미한다.

이러한 상속은 캡슐화, 추상화와 더불어 객체 지향 프로그래밍을 구현하는 중요한 특징 중 하나이다.

 

상속을 이용하면 기존에 정의되어 있는 클래스의 모든 필드와 메소드를 물려받아, 새로운 클래스를 생성할 수 있다.

자바에서 부모클래스를 super class라 하고 자식 클래스를 sub class라 한다.

 

이처럼 부모 클래스는 자식 클래스에 포함된 것으로 볼 수 있다.

따라서 부모클래스에 새로운 필드를 하나 추가하면, 자식 클래스에도 자동으로 해당 필드가 추가된 것처럼 동작한다.

 

자식 클래스에는 부모 클래스의 필드와 메소드만이 상속되며, 생성자와 초기화 블록은 상속되지 않는다.

또한, 부모 클래스의 접근 제어가 private이나 default로 설정된 멤버는 자식 클래스에서 상속받지만 접근 할 수는 없다.

 

상속의 특징

1) 자바에서는 다중상속을 지원하지 않는다. 따라서 extends 뒤에는 단 하나의 부모 클래스만 올 수 있다.

 

2) 자바에서는 상속의 횟수에 제한을 두지 않는다.

 

3) 자바에서 최상위 클래스는 Object클래스이다. 다시말해 Object 클래스만이 유일하게 super class를 가지지 않으며 자바의 모든 클래스들은 Object클래의 자손이라고 볼 수 있다.

 

 

2. super 키워드

 

super

부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는데 사용하는 참조 변수이다.

자바에서는 super 참조 변수를 사용하여 부모 클래스의 멤버에 접근할 수 있다.

this와 마찬가지로 super 참조 변수를 사용할 수 있는 대상도 인스턴스 메소드 뿐이며, 클래스 메소드에서는 사용할 수 없다.

 

class Parent {

    int a = 10;

}

 

class Child extends Parent {

    int a = 20;

 

    void display() {

        System.out.println(a); // 20

        System.out.println(this.a); // 20

        System.out.println(super.a); // 10

    }

}

 

public class Inheritance03 {

    public static void main(String[] args) {

        Child ch = new Child();

        ch.display();

    }

}

 

super() 메소드

 

this() 메소드가 같은 클래스의 다른 생성자를 호출할 때 사용된다면, super() 메소드는 부모 클래스의 생성자를 호출할 때 사용된다.

 

따라서 자바 컴파일러는 부모 클래스의 생성자를 명시적으로 호출하지 않는 모든 자식 클래스의 생성자 첫줄에 자동으로 super(); 명령문을 추가하여, 부모 클래스의 멤버를 초기화 할수 있도록 해준다.

 

하지만 자바 컴파일러는 컴파일시 클래스에 생성자가 하나도 정의되어 있지 않아야만, 자동으로 기본 생성자를 추가해줍니다.

 

class Parent {

    int a;

    Parent() { a = 10; }

    Parent(int n) { a = n; }

}

 

class Child extends Parent {

    int b;

    Child() {

        super(40);

        b = 20;

    }

    void display() {

        System.out.println(a); // 40

        System.out.println(b); // 20

    }

}

 

public class Inheritance04 {

    public static void main(String[] args) {

        Child ch = new Child();

        ch.display();

    }

}

 

 

3. 메소드 오버라이딩

 

메소드 오버라이딩과 이름이 비슷하지만 기능이 다른 메소드 오버로딩(Overloading)은 같은 이름의 메소드를 여러개 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술 (리턴타입은 상관없고 매개 변수에 의해서만 구별될 수 있다.)

 

메소드 오버라이딩(overriding) 이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 재정의 해서 사용한다.

 

오버라이딩 조건

1) 메소드의 동작만을 재정의하는 것이므로, 메소드의 선언부는 기존 메소드와 완전히 같아야한다.

하지만 메소드의 반환 타입은 부모클래스의 반환 타입으로 타입 변환할 수 있는 타입이라면 변경할 수 있다.

 

2) 부모클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없다.

 

3) 부모클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없다.

 

class Parent {

    void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }

}

class Child extends Parent {

    // 오버라이딩된 display() 메소드

    void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }

    void display(String str) { System.out.println(str); } // 오버로딩된 display() 메소드

}

 

public class Inheritance06 {

    public static void main(String[] args) {

        Child ch = new Child();

        ch.display();

        ch.display("오버로딩된 display() 메소드입니다.");

    }

}

 

 

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

 

Method Dispatch는 어떤 메소드를 호출할지 결정하여 실제로 실행시키는 과정을 말한다. dispatch는 static dispatch와 dynamic dispatch가 있다.

 

Static Dispatch

컴파일 시점에서, 컴파일러가 특정 메소드를 호출할 것이라는 걸 명확하게 알고있는 경우이다.

컴파일 시 생성된 바이트 코드에도 이 정보가 그대로 남아있다. 런타임(실행시점)이 되지않아도 미리 결정하는 개념이다.

함수를 오버로딩(Overloading)하여 사용하는 경우, 인자의 타입이나 리턴타입등에 따라 어떤 메소드가 호출될 지 명확하기 때문에 미리 알 수 있다.

 

public class Test {
    public static void main(String[] arg) {
        Dispatch dispatch = new Dispatch();
        System.out.println(dispatch.method());
    }
}

class Dispatch{
    public String method(){
        return "hello dispatch";
    }
}


출처: https://multifrontgarden.tistory.com/133 [우리집앞마당]

 

Dynamic Dispatch

상위 개념인 Interface 혹은 Abstract Class에서 정의된 abstract method를 호출하는 경우에 해당한다.

하위 클래스에는 사우이 인터페이스에서 정의된 메소드를 반드시 Overriding하여 구현해야 한다.

메소드 오버라이딩이 되어있는 경우 실행시점에 어떤 메소드를 실행할지 결정되는 것이다.

 

public class Test {
    public static void main(String[] arg) {
        Dispatchable dispatch = new Dispatch();
        System.out.println(dispatch.method());
    }
}

class Dispatch implements Dispatchable {
    public String method(){
        return "hello dispatch";
    }
}

interface Dispatchable{
    String method();
}


출처: https://multifrontgarden.tistory.com/133 [우리집앞마당]

 

 

5. 추상클래스(abstract class)

 

추상메소드

자식 클래스에서 반드시 오버라이딩 해야만 사용할 수 있는 메소드를 의미한다.

자바에서 추상메소드를 선언하여 사용하는 목적은 추상메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함이다.

 

이러한 추상 메소드는 선언부만이 존재하며, 구현부는 작성되어 있지 않다.

바로 이 작성되어 있지 않은 구현부를 자식 클래스에서 오버라이딩하여 사용하는 것이다.

 

abstract 반환타입 메소드이름();

 

추상클래스

자바에서는 하나 이상의 추상메소드를 포함하는 클래스를 가리켜 추상클래스라고 한다.

 

abstract class 클래스이름 {

    ...

    abstract 반환타입 메소드이름();

    ...

}

 

이러한 추상클래스는 동작이 정의되어 있지않은 추상메소드를 포함하고 있으므로, 인스턴스를 생성할 수 없다.

추상 클래스는 먼저 상속을 통해 자식 클래스를 만들고, 만든 자식클래스에서 추상클래스의 모든 추상메소드를 오버라이딩하고 나서야 비로소 자식 클래스의 인스턴스를 생성할 수 있게 된다.

 

abstract class Animal { abstract void cry(); }

class Cat extends Animal { void cry() { System.out.println("냐옹냐옹!"); } }

class Dog extends Animal { void cry() { System.out.println("멍멍!"); } }

 

public class Polymorphism02 {

    public static void main(String[] args) {

        // Animal a = new Animal(); // 추상 클래스는 인스턴스를 생성할 수 없음.

        Cat c = new Cat();

        Dog d = new Dog();

 

        c.cry();

        d.cry();

    }

}

 

 

6. final 키워드

 

final 필드

final 필드는 위와 같이 선언하며 final 필드의 초기값을 줄 수 있는 방법은 딱 두가지 방법밖에 없다. 첫번째는 필드 선언시에 주는 방법이 있고, 두번째는 생성자를 통해서 주는 방법이 있다.

final int number = 1;

 

final 객체

객체 변수에 final로 선언하면 그 변수에 다른 참조 값을 지정할 수 없다. 즉, 한번 생성된 final 객체는 같은 타입으로 재생성이 불가능하다. 객체자체는 변경이 불가능하지만 객체 내부 변수는 변경 가능하다.

public static void main(String[] args) {
    	final Company company = new Company();
    	//company = new Company(); //객체를 한번 생성했다면 재생성 불가능
    	company.setName("ex회사"); //클래스의 필드는 변경가능
    }

 

final 클래스

메소드의 final을 사용하게 되면 상속받은 클래스에서 부모의 final 메소드를 재정의 할 수 없다.

class Company{
	
    String name = "회사명";

    public final void print() {
        System.out.println("회사 이름은 :"+name+" 입니다.");
    }
}

class A_Company extends Company{
	
    String name = "a회사";
	
    //메서드 오버라이드 불가능
    public void print() {
		
    }
}

 

메소드 인자값에 final을 사용하는 경우

final 필드와 마찬가지로 인자값에 final을 사용하는 경우 final 인자값의 변경이 불가능하다.

class Company{
    String name = "회사명";

    public void setName(final String name) {
    	//name = "ex회사2"; //인자값으로 받은 final변수는 변경 불가능
        this.name = name;
    }
}

public class Final_ex {
    public static void main(String[] args) {
    	final Company company = new Company();
    	company.setName("ex회사");
    }
}

 

 

 

7. Object 클래스

 

Java.lang 패키지

자바 프로그램에서 가장 많이 사용되는 패키지로서 자바 프로그램내에 'import' 문을 사용하지 않아도 자동으로 포함된다. 그만큼 자바 프로그램의 기본이 되는 클래스들과 인터페이스들이 포함되어 있다.

 

Object 클래스는 java.lang 패키지 내의 최상위 클래스이며, String 클래스는 변하지 않는 문자열을 다룰때, StringBuffer 클래스는 내용이 계속 변하는 문자열을 다룰 때 사용될 수 있다.

 

java.lang 패키지 클래스 구조도

 

Object 클래스

자바 API의 모든 클래스와 사용자가 정의한 모든 클래스의 최상위 클래스이다. 즉, 모든 자바 클래스들은 Object 클래스로부터 상속받는다.

 

사용자가 클래스를 정의할 때 클래스 선언부에 명시적으로 extends java.lang.Object를 지정하지 않아도 자동으로 상속받게 된다. 다시말해 Object 클래스의 모든 메소드와 변수는 다른 모든 클래스내에서도 사용 가능하다.

Object클래스의 주요메소드

 

 

 

Reference


www.tcpschool.com/java/java_inheritance_concept

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

jyoel.tistory.com/39

 

Java 상속 - 1. 상속이란?

1. 상속의 개념 자바에서 상속이란 부모 클래스에서 정의된 필드와 메소드를 자식 클래스가 물려받는 것이다. 그럼 객체지향에서 상속이 왜 필요할까? 1. 공통된 특징을 가지는 클래스 사이의 멤

jyoel.tistory.com

multifrontgarden.tistory.com/133

 

토비의봄#01. Double Dispatch

토비의 스프링으로 유명한 토비님의 방송을 보고 정리를 시작한다. 1. Dispatch 1. (특히 특별한 목적을 위해) 보내다 2. (편지・소포・메시지를) 보내다 3. 신속히 해... 네이버 검색결과이다. 자바는

multifrontgarden.tistory.com

coding-factory.tistory.com/525

 

[Java] 자바 상수 final의 의미와 사용법

final의 의미는 최종적이란 뜻을 가지고 있습니다. final 필드는 초기값이 저장되면 최종적인 값이 되어 프로그램 실행 도중에 수정을 할 수 없습니다.  final 사용법 final 필드 final int number = 1; //fina

coding-factory.tistory.com

hyeonstorage.tistory.com/178

 

[JAVA] Object 클래스 정리

Object 클래스 정리 1. Java.lang 패키지 java.lang은 자바 프로그램에서 가장 많이 사용되는 패키지로서 자바 프로그램내에 'import' 문을 사용하지 않아도 자동으로 포함된다. 그만큼 자바 프로그램의

hyeonstorage.tistory.com

 

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30