본문 바로가기
Java

상속 기초

by 매트(Mat) 2020. 9. 9.

상속(Inheritance)

상속은 상위클래스의 모든 것이 하위클래스에게 전달되는 것을 말합니다.
But, 상위클래스의 멤버변수와 멤버함수 중, private 으로 선언되어 접근제한이 걸려있다면 하위클래스로 전달이 되지 않습니다.

하위클래스 extends 상위클래스
단, 자바에서는 다중 상속은 허용되지 않습니다.

장점

  • 클래스 간의 체계화된 전체 계층 구조 파악
  • 재사용성 증대
  • 확장 용이
  • 일관성 유지

오버라이딩(Overriding)

오버라이딩은 상속된 메소드와 동일한 이름, 동일한 인자를 가지는 메소드를 정의하여 메소드를 덮어쓰는 것입니다. 반환값의 타입도 같아야 합니다.

오바라이드는 하위클래스에서 상속 받은 메소드를 단순히 재사용 하지 않고 재정의하여 다른 연산을 수행하고 싶을 때 사용합니다.
즉, 하위클래스에서 상위클래스의 특정 메소드를 다시 정의하는 것입니다.

  • 기능 변경
  • 기능 추가

오버라이드는 추상 클래스와 합쳐져서 확장성을 실현하는 데 많은 도움을 줍니다.

코드 예제

class Animal {
    String name;
    int age;

    void printPet() {
        System.out.println(name);
        System.out.println(age);
    }
}

class Dog extends Animal {
    String variety;

    // 재정의(오버라이딩)
    void printPet() {
        super.printPet(); // super: 부모의 메소드가 호출
        System.out.println(variety);
    }
}

public class Pet {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "강아징";
        dog.age = 1;
        dog.variety = "멍멍";
        dog.printPet();
    }
}

super : 부모클래스의 멤버에 접근할 수 있습니다.

스태틱(Static)

static은 필드와 메서드에 붙이는 제한자입니다.

특징

  • 프로그램 시작 전에 메모리에 로딩됩니다.
  • 오브젝트를 생성하지 않고도 필드, 메소드 사용이 가능합니다.
  • 이 때, 다른 오브젝트에서 참조하기 위해서는 오브젝트 이름이 아닌 클래스명을 지정합니다.

필드의 스태틱

같은 클래스에서 생성된 오브젝트들은 static 을 붙인 필드의 값을 공유합니다.

class A {
    static int a;
}
...
    A a1 = new A();
    A a2 = new A();

    a1.a = 50;
    a1.a = 10;

위 코드에서 a의 값은 결국엔 10이 됩니다.

메소드의 스태틱

어떤 오브젝트에서도 같은 동작을 하는 메소드는 static 키워드를 붙여주는 것이 좋습니다.

  • 한 번만 생성되기 때문.
  • static 메소드는 오버라이딩할 수 없습니다.
  • static 메소드에서 동일한 오브젝트 내의 멤버를 이용하기 위해서는 멤버에게 static 을 붙어야합니다.

main() 가 public 이고 static인 이유.

static인 이유는 인스턴스 생성과 관계없이 제일 먼저 호출되는 메소드
중복된 main() 가 있으면 안되며, static은 오버라이딩이 일어나지 않는데 이는 메인 메소드가 딱 한 개만 존재하게 됩니다.

그리고, public 인 이유는 JVM에게 메인 메소드를 보여주고 실행시킬 수 있도록 해주기 위함입니다.

추상클래스(Abstract)

처리 내용을 기술하지 않고, 호출하는 방법만을 정의한 메소드를 추상 메소드라고 합니다.
추상메서드가 한 개라도 가진 클래스를 추상 클래스라고 합니다.
추상 메서드, 추상 클래스는 abstract 라는 수식자를 사용하여 정의합니다.

  • 추상클래스를 상속하는 클래스는 추상메서드를 반드시 오버라이딩해서 구현해야합니다. (안그러면 에러뜸.)
  • 추상클래스의 편리한 점은 추상클래스는 무조건 구현해야 하기 때문에 까먹지 않고 구현할 수 있습니다.

인터페이스(Interface)

  • 인터페이스란 상속 관계가 아닌 클래스에 추상클래스처럼 기능을 제공하는 구조입니다. 자바는 다중 상속이 지원되지 않기 때문에 지원 받지 못한 클래스의 기능을 사용하지 못할 수 있습니다. 이 때, 기능만을 제공받기 위해 인터페이스를 사용합니다.
  • 클래스와 비슷한 구조이지만, 정의와 추상메서드만이 멤버가 될 수 있다는 점이 다릅니다.
interface A {
    public static final int a = 2; // public static final 생략
    public abstract void say(); // public abstract 생략
}
  • 클래스에서 인터페이스를 이용하도록 하게 하는 것을 인터페이스의 구현 이라고 합니다.
  • 인터페이스를 구현하기 위해서는 implements를 사용합니다.
  • 인터페이스는 다중 구현이 가능합니다. ex) class A implements B,C,D {}
  • 또한 클래스처럼 상속 할 수도 있습니다. (extends)

다형성(Polymorphism)

폴리모피즘, 다양한 형태를 가지는 것을 말합니다.
상속한 클래스의 오브젝트는 슈퍼 클래스 혹은 서브 클래스로 다룰 수 있습니다.
즉, 이렇게 하나의 오브젝트와 메서드가 많은 형태를 가지고 있는 것을 다형성 이라고 합니다.
ex) 오버로딩(Overloading)

  • 하위클래스 객체를 상위클래스 객체에 대입하여 사용할 수 있습니다.
    ex) SuperClass obj = new SubClass();
  • 다만, 상위클래스의 객체를 하위클래스의 객체로 대입 불가
    ex) SuperClass obj = new SubClass();
    SubClass obj1 = obj; (X) Error 발생

Reference

인프런강좌

'Java' 카테고리의 다른 글

[자바 라이브 스터디] 01. JVM과 자바 코드  (0) 2021.09.15
[자바 라이브 스터디] 00. 자바 기본 공부 계획  (0) 2021.09.13
간략한 JVM에 대한 개념..  (0) 2021.05.17
클래스 활용  (0) 2020.09.09
클래스 기초  (0) 2020.09.06

댓글