Notice
Recent Posts
Recent Comments
Link
«   2025/03   »
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 26 27 28 29
30 31
Tags
more
Archives
Today
Total
관리 메뉴

archive

[이것이 자바다] 07 상속 - 1 본문

Java/Java 개념 정리

[이것이 자바다] 07 상속 - 1

안정민 2023. 4. 28. 02:26

1. 상속의 이점

-이미 잘 개발이 된클래스를 재사용해서 새로운 클래스를 만들기 때문에 중복되는 코드를 줄여 개발 시간을 단축시킴

-부모 클래스를 수정하면 모든 자식 클래스에 수정 효과를 가지고 오기 때문에 클래스의 수정을 최소화할 수 있음

 

 

2. 클래스 상속

-다른 언어와는 달리 자바는 다중 상속을 허용하지 않는다

-즉, 여러 개의 부모 클래스를 상속할 수 없기 때문에 extends 키워드 뒤에는 단 하나의 부모 클래스만 위치해야한다.

public class 자식클래스 extends 부모클래스1, 부모클래스2{
...
} //부모클래스2는 올 수 없음

 

 

3. 부모 생성자 호출

-모든 객체는 생성자를 호출해야만 생성이 되기 때문에 부모 객체도 예외가 아님

-부모 생성자는 자식 생성자의 맨 첫 줄에 숨겨져있는 super()키워드를 통해 호출이 된다.

-super()는 컴파일 과정에서 자동으로 추가가 되는데, 이것은 부모의 기본 생성자를 호출한다. 따라서 만약 부모 클래스에 기본 생성자가 없다면 자식 생성자 선언에서 컴파일 에러가 발생한다.

-부모 클래스에서 기본 생성자가 없고 매개변수를 갖는 생성자만 있다면 개발자는 다음과 같이 super(매개값,...) 코드를 직접 넣어야 함, 이 코드는 매개값의 타입과 개수가 일치하는 부모 생성자를 호출한다.

 

 

4. 메소드 재정의

-메소드 오버라이딩 (overriding)은 상속된 메소드를 자식클래스에서 재정의하는 것을 이야기, 메소드가 오버라이딩 되었다면 해당 부모 메소드는 숨겨지고, 자식 메소드가 우선적으로 사용된다.

-메소드 오버라이딩 시 주의해야할 규칙

1) 부모 메소드의 선언부(리턴타입, 메소드 이름, 매개변수) 와 동일해야 한다.
2) 접근 제한을 더 강하게 오버라이딩 할 수 없다 (public-> private로 변경 불가능)
3) 새로운 예외를 throws 할 수 없다 (예외는 10장에서 학습) ******배우고 다시 한 번 확인하기

- 자바는 개발자의 실수를 줄여주기 위해 정확히 오버라이딩이 되었는지 체크해주는 @Override 어노테이션을 제공

-@Override를 붙이면 컴파일 단계에서 정확히 오버라이딩이 되었는지 체크하고, 문제가 있다면 컴파일 에러를 출력한다.

 

 

5. 부모메소드 호출 super 키워드

- 메소드를 재정의하면, 부모 메소드는 숨겨지고 자식 메소드만 사용되기 때문에 비록 부모 메소드의 일부만 변경된다 하더라도 중복된 내용을 자식 메소드도 가지고 있어야 한다.

- 예를 들어 부모 메소드가 100줄의 코드를 가지고 있을 경우 자식 메소드에서 1줄만 추가하고 싶더라도 100줄의 코드를 자식메소드에서 다시 작성해야 한다.

- 이 문제는 자식 메소드와 부모 메소드의 공동 작업 처리 기버블 이용하면 매우 쉽게 해결이 된다

-자식 메소드 내에서 부모 메소드를 호출하는 것, super 키워드도트(.) 연산자를사용하면 숨겨진 부모 메소드를 호출할 수 있다.

-super.method() 의 위치는 작업처리 전후에 모두 위치할 수 있다. 우선 처리가 되어야 할 내용을 먼저 작성하면 된다.

 

 

6. protected 접근 제한자

- 우리는 6장에서 public, private 접근 제한자를 이용하여 객체 외부에서 필드, 생성자, 메소드의 접근 여부를 결정하였음

- protected는 또 다른 접근 제한자로 상속과 관련이 있고, public과 default의 중간 쯤 해당하는 접근 제한을 한다

접근제한자 제한대상 제한범위
protected 필드, 메소드, 생성자 같은 패키지이거나, 다른 패키지일 경우 자식 객체만 사용 가능

- protected는 같은 패키지에서는 default처럼 접근이 가능하나, 다른 패키지에서는 자식 클래스만 접근을 허용한다.

- protected로 선언된 클래스와 다른 패키지에 있지만 해당 클래스의 자식 클래스일 경우 해당 클래스의 protected 필드, 생성자, 메소드에 접근이 가능하며, 단 new 연산자를 사용해 생성자를 직접호출할 수는 없고 자식 생성자에서 super() 로 해당 클래스의 생성자를 호출하여 사용한다.

 

 

 

7. final 클래스와 final 메소드

- 필드에 final 키워드를 붙이면 초기값 설정 후 값을 변경할 수 없다.

- 클래스를 선언할 때 final 키워드를 class 앞에 붙이면 최종적인 클래스이므로 더이상 상속이 불가능한 클래스가 된다

-즉, final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 생성할 수 없다

-이준우 교수님이 설명하신 거에 따르면 이제 final 클래스는 트리 자료구조에 리프노드랑 같은 것이라고 생각하면 된다

-대표적인 예시가 String 클래스, 이는 다음과 같이 선언이 되어있다. 따라서 자식 클래스를 만들 수 없다.

public final class String {...}

** 시험 문제에 활용된 대표적인 예시 작성하라고 하면 작성하기

 

-메소드를 선언할 때 final 키워드를 붙이면 이 메소드는 최종적인 메소드이기 때문에 오버라이딩할 수 없는 메소드가 된다.

-즉, 부모 클래스를 상속해서 자식 클래스를 선언할 때, 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의할 수 없다.

 

 

 

***교수님이 중요하다고 강조하신 부분

1. 오버라이딩과 오버로딩의 차이점

구분 오버로딩 오버라이딩
메소드 이름 동일 동일
매개변수 다름 동일
리턴타입 상관없음 동일

2. 메소드 오버라이딩할 때 따라야 할 2 가지 rule