포스트

[JAVA] 객체지향 프로그래밍-OOP(상속, 오버라이딩, super 키워드)

상속(inheritance)

  • 상속이란?
    • 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것

상속 특징

  • 자식은 부모의 모든 멤버를 상속받는다.(생성자, 초기화 블록 제외)
  • 자식의 멤버 개수는 부모보다 적을 수 없다.(많거나 같다)
  • 상속은 단일상속만 가능하다.
1
2
3
4
5
6
class Parent {
	int age; // 멤버 1개
}

class Child extends Parent {
}

포함 관계

상속이외에도 ‘포함’관계를 맺어 클래스를 재사용이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Point {
	int x;
	int y;
}

// 상속
class Point extends Circle {
	int y;
}

// 포함
class Circle {
	Point c = new Point;
	int r;
}

예시를 보여주기에 이렇게 작성하였지만 클래스 간의 관계가 상속관계를 맺을지 포함관계를 맺을지 명확한 방법이 있다.

A가 B이다.라는 문장이 성립하면 상속
A가 B를 가지고 있다.라는 문장이 성립하면 포함

상속은 제약이 많기 때문에 꼭 필요할 때만 사용하고, 이외에는 포함관계를 사용한다.

오버라이딩(Overriding)

오버라이딩이란?

상속받은 부모의 메소드를 자신에게 맞게 변경하는 것

오버라이딩과 오버로딩을 서로 아예 다르니 헷갈리지 말자
오버로딩 : 이름이 같을 뿐 기존에 없는 새로운 메소드를 정의한 것
오버라이딩 : 상속받은 부모의 메소드 내용을 변경한 것

오버라이딩 조건

  1. 선언부가 부모 클래스의 메소드와 일치해야 한다.
  2. 접근 제어자를 부모 클래스의 메소드보다 좁은 범위로 변경할 수 없다.
  3. 예외는 부모 클래스의 메소드보다 많이 선언할 수 없다.

참조변수 super 키워드

  • super란?
    • 부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조할 때 사용되는 참조변수
    • 인스턴스 메소드 내에서만 존재
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
class Parent {
    int a = 1; // 부모 인스턴스 변수
}

class Child extends Parent {
    int a = 10; // 자식 인스턴스 변수

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

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

//출력
> a=10
> this.a=10
> super.a=1

super() 메소드

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

부모 클래스의 멤버를 초기화하려면 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출해서 초기화하면 된다.
생성자의 첫 줄에는 super()메소드가 호출되어야 한다. 하지만 생략 가능

부모 클래스에 직접 생성자를 정의해 추가했다면, 부모 클래스의 디폴트 생성자는 없어진다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.