티스토리 뷰

Java/개념정리

[Java] 상속

통통푸딩 2021. 9. 27. 22:34
반응형

1. 상속이란?

상속은 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것을 말한다. 여기서 기존의 클래스는 부모 클래스(=상위 클래스 = 슈퍼 클래스)이고, 새로운 클래스는 자식 클래스(=하위 클래스 = 서브 클래스)라고 한다.

 

자식 클래스는 부모 클래스의 변수와 메서드를 재사용 할 수 있다. 상속을 통해서 새로운 클래스를 작성하면 코드를 공통적으로 관리할 수 있어서 코드를 추가하거나 변경하는 것에 매우 용이하다. 이는 객체지향 프로그래밍(OOP)의 주요 개념이다.

 

자바에서 상속을 구현하는 방법은 다음과 같다. 새로운 클래스의 이름 뒤에 키워드 'extends'와 상속받고자 하는 클래스의 이름을 적으면 된다.

//class 자식클래스명 extens 부모클래스명 { }
class Child extends Parent {        
    // ...    
}

 

 

자바 상속의 특징

1) c++과 다르게 자바 상속은 단일 상속만 가능하다. 즉, 두개 이상의 클래스를 상속받는것(다중 상속)은 불가능하다.

// *불가능!!*
class Child extends Parent1, Parent2 { }

 

2) 상속의 횟수에는 제한이 없다.

class Parent {};
class Child1 extends Parent{};
class Child2 extends Parent{};

 

3) 다단계 상속이 가능하다.

class Parent {};
class Child1 extends Parent{};
class Child2 extends Child1{};

 

4) 자바의 계층 구조 최상위에는 java.lang.Object 클래스가 존재한다. 즉, 모든 클래스는 Object 클래스의 자식 클래스이다.

 

5) 상속은 생성자와 초기화 블럭을 제외한 변수와 메서드만 상속된다. 부모의 메서드는 재정의(오버라이딩) 하여 사용 가능하다.

 

 


2. super 키워드

super 키워드는 자식클래스에서 부모클래스를 가리키는 키워드이다. super 키워드로 상속받은 멤버를 참조할수 있다.

부모클래스에 선언된 멤버변수와 같은 이름의 멤버변수를 자식 클래스에서 중복해서 정의하는 것이 가능하며 참조변수 super를 이용해서 서로 구별할 수 있다.

class Main {
    public static void main(String[] args) {
        Child c = new Child();
        c.print();
    }
}

class Parent {
    int a = 10;
}

class Child extends Parent {
    int a = 20;

    void print() {
        System.out.println("a = " + a);
        System.out.println("this.a = " + this.a);
        System.out.println("super.a = " + super.a);
    }
}

/*
a = 20
this.a = 20
this.a = 10
*/

 

 

변수뿐만이 아니라 메서드도 super를 써서 호출할 수 있다. 부모 클래스의 메서드를 자손 클래스에서 오버라이딩한 경우에 super를 사용한다.

class Parent{
    int x = 1;
    int y = 2;

    String getXY() {
        return "x : " + x + ", y : " + y;
    }
}

class Child extends Parent{
    int z = 3;

        @Override
    String getXY() {
        return super.getXY() + ", z : " + z;
    }
}

super 키워드와 super() 는 다르다. super()는 부모 클래스의 생성자 함수를 호출하는 것을 말한다. 자식 클래스의 생성자 함수에 기본적으로 super()를 호출해야한다. 쓰지 않으면 컴파일러가 자동으로 추가한다. 부모 클래스 멤버의 초기화 작업이 이루어져야 자식 클래스 인스턴스가 부모클래스 멤버를 사용할 수 있기 때문이다.

 

 


3. 메서드 오버라이딩

오버라이딩(overriding)은 부모클래스로부터 상속받은 메서드의 내용을 변경하는 것을 말한다.

자식클래스에서 부모클래스의 메서드를 재정의할 수 있다.

 

이 때 몇가지 조건이 있다.

1) 선언부가 일치해야한다. 즉, 이름, 매개변수, 반환 타입이 같아야한다.

2) 접근제어자를 더 좁은 범위로 변경할 수 없다. 예를들어, 부모 클래스의 메서드 접근제어자가 protected일 경우에 protected나 public으로만 작성할 수 있다.

3) static메서드를 인스턴스 메서드로 변경할 수 없고 인스턴스 메서드를 static 메서드로 변경할 수 없다.

class Animal {
    void print() {}
}

class Dog extends Animal {
    @Override
    void print() {
        System.out.println("왈왈!");
    }
}

class Cat extends Animal {
    @Override
    void print() {
        System.out.println("야옹~");
    }
}




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

다형성은 OOP 개념의 중요한 특징이다.

다형성은 여러가지 형태를 가질 수 있는 능력을 말하며, 부모클래스 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 한 것이다.

아래와 같이 말이다.

Parent parent = new Child();

이렇게 되면 Child 인스턴스 중에서 Parent클래스의 멤버들만 사용할 수 있다.

메서드 디스패치(Method Dispatch)는 어떤 메서드를 호출할지를 결정하여 호출하는 것을 말한다.

static(정적)과 dynamic(동적)으로 나눌 수 있다.

 

 

정적 메서드 디스패치(static method dispatch)

정적 메서드 디스패치는 어떤 메서드를 실행할 지 컴파일 타임에 결정되는 것을 말한다. 컴파일 시점에 특정 메서드를 호출할 것을 명확하게 알고 있는 경우다. private, static, final 메서드들을 말한다.

class Parent {
    void print() {
        System.out.println("Parent1");
    }

    static void printStatic() {
        System.out.println("Parent2");
    }
}

class Child extends Parent {
    @Override
    void print() {
        System.out.println("Child1");
    }

    static void printStatic() {
        System.out.println("Child2");
    }
}

class Main {
    public static void main(String[] args) {
        Parent parent = new Parent();
        Child child = new Child();

        parent.print();
        child.print();
        parent.printStatic();
        child.printStatic();
    }
}

/*
Parent1
Child1
Parent2
Child2
*/

 

 

동적 메서드 디스패치(dynamic method dispatch)

컴파일러가 어떤 메서드를 실행할 지 모르는 경우다. 그래서 동적 메서드 디스패치는 호출할 메서드를 런타임 시점에 결정한다. 동적 메서드 디스패치가 위에서 말한 다형성을 지원하기 위한 것이다.

class Parent {
    void print() {
        System.out.println("Parent");
    }
}

class Child1 extends Parent {
    @Override
    void print() {
        System.out.println("Child1");
    }
}

class Child2 extends Parent {
    @Override
    void print(){
        System.out.println("Child2");
    }
}

class Main {
    public static void main(String[] args) {
        Parent c1 = new Child1();
        Parent c2 = new Child2();

        c1.print();
        c2.print();
    }
}

/*
Child1
Child2
*/

 


5. 추상 클래스

추상 클래스(abstract class)는 설계도 같은 클래스이다.

추상클래스로는 인스턴스를 생성할 수 없고, 상속을 통한 자식 클래스에서만 완성될 수 있다.

즉, 상속계층이 내려갈수록 구체화된다.

 

추상 클래스는 추상 메서드를 가질 수도 있고 온전한 메서드를 가질수도 있다.

추상메서드는 구현부가 없는 메서드를 말한다. 추상메서드를 포함하고 있다는 것을 제외하고는 일반 클래스와 같다.

멤버변수도 가질 수 있다.

 

추상 클래스는 추상 메서드가 있으니 상속을 통해 자식 클래스가 구현해야 한다는 것을 알릴 수 있다. 추상클래스를 상속받은 클래스가 추상메서드를 구현하지 않으면 그 클래스도 추상클래스가 된다.

//추상 클래스
abstract class 클래스이름 { ..
    abstract void printName(String name); //추상 메서드
}



 


6. final 키워드

final 키워드는 변수, 클래스, 메서드에 붙일 수 있는데 각자의 의미가 다르다.

주로 변경될 수 없다는 의미를 가지고 있다.

  • 변수 : 값을 변경할 수 없는 상수가 된다.
  • 클래스 : final로 지정된 클래스는 부모클래스가 될 수 없다. 즉, 상속을 할 수 없다.
  • 메서드 : final로 지정된 메서드는 오버라이딩으로 재정의할 수 없다.
fianl class FinalExample {  //상속 불가 클래스
    final int MAX_SIZE = 100;  //값을 변경할 수 없는 멤버변수

    final int getSize() {  //재정의할수없는 메서드
        final int NUM = MAX_SIZE;  //값을 변경할 수 없는 지역변수
        return NUM;
    }
}



 


7. Object 클래스

Object 클래스는 자바의 모든 클래스들의 최상위 클래스이다.

상속받지 않는 클래스를 정의하면 컴파일 시에 컴파일러가 자동으로 extends Object를 추가하여 상속받도록 한다.

Object 클래스에서는 11개의 기본 메서드가 정의되어 있으며 내가 생성한 클래스에 자동으로 Object 클래스의 기본 메서드가 포함된다.

출처 :  http://www.tcpschool.com/java/java_api_object

 

반응형

'Java > 개념정리' 카테고리의 다른 글

[Java] 인터페이스(interface)  (0) 2021.10.06
[Java] 자바 package  (0) 2021.09.28
[Java] Queue  (0) 2021.09.23
[Java] Stack  (0) 2021.09.23
[ Java ] LinkedList  (0) 2021.09.23
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday