본문 바로가기
java/자바의 정석

자바의 정석 - 객체지향 프로그래밍 5편

by choi-dev 2024. 2. 20.

1 ~ 4편부터 계속해서 이어진다.

 

참조변수 super

super는 자식 클래스에서 부모 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수이다. 거두절미하고 코드로 알아보겠다.

 

public class Parent {
    int x = 10;
}
public class Child extends Parent {
    int x = 20;

    void method() {
        System.out.println(x);
        System.out.println(this.x);
        System.out.println(super.x);
    }
}

지금의 예제처럼 자식 클래스와 부모 클래스의 멤버 변수명이 동일할 때, 구분할 방법이 필요해지는데 이럴 때 super를 사용한다. 

 

public class Child extends Parent {

    void method() {
        System.out.println(x);
        System.out.println(this.x);
        System.out.println(super.x);
    }
}

지금처럼 자식 클래스의 멤버 변수가 없어도 부모 클래스의 멤버 변수를 사용하기 때문에 모두 10으로 출력된다.

 

super()

이전에 this()를 학습했었는데 this()의 경우는 같은 클래스 내에 다른 생성자를 호출하는 방식이었다. super()도 비슷한 느낌으로 조상의 생성자를 호출하는데 사용한다.

 

public class Parent {
    int x, y;

    public Parent(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
public class Child extends Parent {
    int z;

    public Child(int x, int y, int z) {
        super(x, y);
        this.z = z;
    }
}

이렇게 조상의 생성자를 호출해 조상의 멤버를 초기화할 수 있다.

 

제어자

클래스나 메소드의 선언부에 사용되는 제어자라고 하는 것은 앞에 붙여지면서 부가적인 의미를 부여하고 있다. 접근 제어자로는 public, protected, default, private가 있고 그 외로는 static, final, abstract, ... 등이 있다.

 

static

변수를 하면서, 메소드를 하면서 static이라는 것을 지속해서 보았다. 인스턴스가 클래스로부터 생성되었을 때 각각 다른 참조변수에 초기화하면 주소값이 달라 다른 값을 유지했는데 이 중 클래스(static)을 붙이면 인스턴스에 상관없이 주소값을 공유하는 값을 가지게 된다.

 

final

앞서 다루지는 않았지만 상수의 개념으로 적용되고있다. 항상 변하지 않는 수라고 해서 final 수식어를 앞에 붙이게 되면 우리가 아는 상수라는 객체가 된다. 상수의 경우, 부모 클래스의 메소드에 사용되면 오버라이딩할 수 없고 자신을 확장하는 자식 클래스를 정의하지 못하게 된다.

 

abstract

미완성이라는 의미로, 메소드의 선언부만 작성하고 수행내용은 구현하지 않는 추상 메소드를 의미한다. 해당 부분은 금방 곧 다룰 예정이다. 추상 클래스의 경우에는 미완성이기 때문에 인스턴스를 생성할 수 없다.

 

내일 할 부분

오늘은 생각보다 조금 피곤해서 객체지향 프로그래밍의 후반부를 들어가기 전 부분만 다뤘고 내일은 접근 제어자부터 여러가지를 학습할 예정이다.