티스토리 뷰

• 상속이란? 상속의 장단점

자바에서의 상속(Inheritance)은 자식 클래스에서 부모 클래스의 필드와 메소드(모든 자원)를 물려받는 것

- 지정 예약어인 "extends" 키워드를 통해 상속 관계 선언 가능
- 하나의 부모 클래스가 여러 자식 클래스를 가질 수 있지만 반대는 불가능
- 접근제어자를 사용해 일부만 상속할 수 있음

<상속의 장점>
- 코드의 확장성, 재사용성 상승
- 중복된 코드 제거 가능
- 객체지향 프로그래밍에서의 다형성

<상속의 단점>
- 캡슐화/은닉 깨뜨림
- 부모 클래스 필드, 메소드 찾는데 불편함 있음 (복잡한 구조)
: 계층 구조를 계속 따라다녀야 하고, 서브 클래스의 정체성을 찾기 위해서
- 상속은 결함 역시도 상속
- 상속은 API 문서에 영향을 끼침

- 강한 결합의 강제성 (코드 유지보수와 수정에 난관)
: 부모 클래스가 가진 소스 코드를 그대로 상속받을 수 있어 유지보수가 편리할 수 있지만
반대로 자식 클래스가 많아지면 그만큼 부모 클래스 소스 코드 변경에 어려움이 있다.
- 접근자에 대한 제약이 강함
- 정적인 코드가 됨
: 합성(Composition)은 의존성 주입과 같이 런타임 관계 결정이 가능하나,
상속은 정적인 컴파일 타임에 이미 결정된 관계가 된다. (변화에 약하고, 딱딱한 코드가 됨)
하위 클래스는 선택권 X
상속은 오직 한 번 가능

• 그럼 상속은 어떻게 쓸까?

⇢ 상속을 사용하는 이유는 중복 코드를 최대한 피하며 '재사용성'을 높이는 것에 있다.

위의 단점들이 많지만, 이를 모두 가져감에도 불구하고 얻을 수 있는.
즉 '재사용성'을 통해서 얻을 수 있는 득이 얼마나 되는지 비교해야 한다.

또한! 자식 클래스가 부모 클래스를 완전히 대체할 수 있는 경우에 유효하다.


• 다형성과 동적바인딩

다형성이란?
⇢ 하나의 인스턴스(객체)가 여러가지 타입(형)을 가질 수 있음을 의미

즉, 부모 클래스 타입의 참조 변수로 자손 클래스 인스턴스를 참조할 수 있도록 함

결합도를 낮춰 유지보수성 / 생산성 증가
상속 관계에 있는 모든 객체는 동일한 메세지 수신 가능
확장성이 좋은 코드 작성 가능


동적바인딩이란?
⇢ 컴파일 때는 해당 타입의 메소드와 연결되어 있으나,
실행 시간(runtime; 런타임)에 형성된 실제 객체 타입을 기준으로
실제 객체가 가진 오버라이딩 된 메소드로 바인딩되어 동작하는 것.
(= 실행될 함수를 결정해 호출하는 것)

package blog_binding;
 
class Person{
    
    void howl() {
        System.out.println("Person");
    }
}
class Female extends Person{
 
    void howl() {
        System.out.println("female");
    }
    
}
public class Test1 {
    public static void main(String[] args) {
        Person p = new Female();
        
        p.howl();
    }
}

≫ 위와 같은 경우 메인 함수 내 p.howl()은 무엇을 프린트 할까?
런타임 시점에 new 연산자로 Female 객체가 생성되었기 때문에
Female 객체에 오버라이딩 되어 있는 howl() 메소드를 호출한다.

따라서, 메인 함수에서는 "female"이 출력


• 그럼 잠깐 객체 지향의 3가지 특징

캡슐화 / 상속 / 다형성

위 세 가지 중, 상속과 다형성은 위에 정리하였으니
"캡슐화"에 대한 특징을 잠깐 정리하도록 하겠다.

일반적으로 캡슐화는 변수 + 함수 를 클래스로 묶는 작업을 의미하고
캡슐화를 할 때는 목적이 같은 변수와 함수 별로 나눠 작업을 해야 한다.

캡슐화
: 외부로부터 잘못된 접근을 막고, 값에 영향 끼치는 것을 막기 위해
클래스 내 변수와 함수를 감추고 드러내는 "은닉성" 을 지니고 있다.

은닉성 ⇢ 접근제어자로 실현 가능

<접근제어자>
· public : 어떠한 클래스에서라도 접근 가능
· protected : 동일 패키지 내의 클래스나 동일 패키지가 아니더라도 해당 클래스를 상속받은 클래스에서 접근 가능
· default : 동일 패키지 내의 클래스에서 접근 가능, 접근제어자를 별도로 설정하지 않으면 default
· private : 해당 클래스에서만 접근 가능


 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/05   »
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
글 보관함