[JAVA] 객체지향 2 - 상속

노을지는·2022년 5월 14일
0

JAVA

목록 보기
2/7

상속

단어 그대로 연관이 있는 클래스를 부모-자식처럼 상속 관계로 묶어서 자식 클래스를 구성할 때 부모 클래스의 내용을 재사용하는 것이다.

상속할 때는 부모 클래스 대신 자식 클래스를 그대로 집어넣어도 잘 굴러갈 수 있도록 설계해야 한다. 상속은 다형성과도 연관이 있기 때문에 이를 잘 지켜야 다형성을 적용할 때도 문제가 없게 된다.

상속의 상속도 가능하지만 한 클래스가 클래스들을 다중으로 상속받는 것은 불가능하다. 이러한 단점을 보완하기 위해 인터페이스라는 것을 사용한다.

하지만 부모 클래스로부터 상속받은 것들을 자식 클래스에서 그대로 쓰기 적절하지 않은 경우가 있을 것이다. 그럴 때 쓰는 기법이 바로 오버라이드(override)이다. 자식 클래스에서 선언부(이름·매개변수·리턴타입)은 모두 같게 쓰는 대신 내용만 바꾸는 것이다.

super은 this와 비슷한데, 자식 클래스에서 부모 클래스로부터 상속받은 멤버를 참조하는 데 사용된다. 부모의 멤버와 자식의 멤버를 구별해야 할 때 this 대신 사용하면 된다. this()가 있는 것처럼 super()도 있는데, 상속받을 때 부모 클래스의 멤버변수를 초기화할 때 사용한다.

static과 오버라이드

static 메소드는 상속되는 것이 아니라 각자의 클래스에서 각각의 static 메소드를 정의한 것이지 오버라이딩된 것이 아니다. 그래서 static메소드를 호출할 때 클래스이름.메소드이름()으로 호출해야 혼동이 줄어든다.

제어자

선언부에 기술하여 부가적인 의미를 부여할 때 쓰는 키워드이다. 앞서 언급한 static도 그 중 하나고, 흔히 보는 public 등 접근 제어자와 그 외 몇 가지가 있다.

final은 재할당을 막을 때 사용한다. 변수에 사용되면 값의 재할당이 불가능하고, 클래스에 사용되면 상속이 불가능해지고, 메소드에 사용하면 오버라이딩이 불가능해진다.

접근 제어자로는 public(무제한), protected(같은 패키지와 자식), default(같은 패키지), private(같은 클래스)가 있다. 이름과 비슷하게 범위가 따라가기 때문에 사용하기 편하다.

이런 키워드를 굳이 쓰는 이유는 캡슐화와 은닉과 관련이 있다. 외부로부터의 접근을 제한하여 내부 데이터를 보호하고, 보여주지 않아도 되는 부분은 감추어서 보안성을 올리는 것이다.

다른 사람들의 코드를 구경하다보면 필드에다가 private를 먹이고 getter/setter 메소드를 길게 써서 필드를 제어하는 것을 볼 수 있는데, 그렇게 해서 외부에서 필드로의 직접 접근을 막고, 불필요한 정보는 숨기면서, 유효성 검사를 통해 무결성을 지킬 수 있고, 가공이 필요하면 g/s를 통해서 처리할 수 있도록 하는 것이다.

그러나 이게 과도해져서 g/s를 남발하다 보면 결국 public으로 선언한 것과 진배없게 되어 그냥 public으로 쓰면 되지 않느냐 하는 논쟁이 있는 것 같지만 나는 배우는 입장이니 우선 메인스트림을 따라가자고 생각하고 있다.

내 생각으로는 public으로 선언하면 다이렉트로 접근하게 되지만, g/s는 메소드를 한 번 거치다 보니 메소드처럼 블랙박스스러운 요소를 좀 더 추구한 것이 아닌가 생각한다.

0개의 댓글