Intro
상속과 다형성은 객체 지향을 공부하게 되면 항상 만나게 되지만 깊이 생각을 하지 않고 넘어가는 경우가 많았던거 같다. 그래서 이번 기회에 상속과 다형성은 왜 쓰이는지에 초점을 맞춰서 공부를 해보았고 그거에 대한 정리를 남기려고 한다.
상속
정의
이미 만들어져 있는 클래스를 부모 클래스라고 할때
해당 부모 클래스의 기능을 사용가능 하도록 해당 클래스의 기능을 받아오는 것을 상속이라고 하고 이로 인해 만들어지는 클래스를 자식 클래스라고 한다.
왜 사용할까?
1. 코드의 재활용
새로운 클래스를 만들 때 이미 다른 클래스에서 새롭게 만들 클래스에 필요한 메소드를 다수 가지고 있을 때 새로운 클래스는 이미 만들어져있는 클래스에 대하여 상속 받아 사용하게 된다면 기존 코드를 재활용 할 수 있고 코드도 간결해진다.
2. 클래스 테스트에 대한 유연성, 확장성 증가
이미 검증된 클래스를 이용하여 새롭게 클래스를 만들게 된다면 해당 클래스에 대한 검증은 새롭게 정의되거나 추가된 메소들들에 대해서만 진행하면 된다는 장점을 가지게 된다.
3. 클래스 수정 추가에 대한 유연성 및 확장성 증가
기존에 사용하고 있던 특정 클래스의 메소드가 잘못되었거나 해당 메소드에 특정 기능이 추가 될 때 부모 클래스에 해당하는 코드만 수정하게 되면 해당 클래스를 상속 받은 모든 클래스들 중 해당 메소드를 오버라이딩을 하지 않은 경우 자식 클래스들에 대한 메소드 수정도 동시에 일어나기 때문에 메소드들에 대한 유연성 및 확장성이 증가한다.
단점
1. 보안상의 허점
부모 클래스의 특정 메소드들이 유출이 되어지면 안 될때 해당 클래스를 자식 클래스가 상속 하게 된다면 부모 클래스의 특정 메소드들은 유출이 되어 질 수 있다. 따라서 이러한 보안상의 허점에 대하여 대비하기 위해 java에서는 class에 있는 메소드들에 대한 정의를 3가지로 하게 된다.
- public : 해당 클래스를 상속 받는 어떤 클래스는 해당 메소드들을 사용할 수 있다.
- protected : 해당 클래스를 상속 받는 클래스 중 같은 package에 존재하는 자식 클래스만 해당 메소드들에 대하여 사용이 가능핟.
- private : 어떤 자식 클래스 들도 해당 메소드를 사용할 수 없다.
2. 결합도 증가
객체지향 언어의 장점 중 하나는 모듈화이다. 각 클래스 마다 사용하는 기능 들이 독립적으로 존재해야 결합도가 낮은 프로젝트라고 이야기 할 수 있다. 하지만 상속을 받는 순간 자식 클래스와 부모 클래스는 결합이 되어 같이 움직이게 되기 때문에 전체적인 코드에서 결합도가 증가하게 된다.
3. 클래스 수정 추가에 따른 코드 복잡성 증가
프로젝트가 복잡해지면서 상속을 하는 클래스가 증가하게 되면 부모 클래스의 메소드에 대한 수정이 자식클래스들에게 어떻게 영향을 끼칠지 예상하기 힘들 수 있다. 따라서 프로젝트의 크기가 커질 때 무분별하게 상속을 하게 되면 코드의 복잡성이 증가 할 수 있다.
다형성
정의
다형성이란 자식 클래스들에 대한 인스턴스를 선언을 할 때 타입 선언을 부모 클래스로 사용할 수 있다는 것입니다.
class Parent { ... }
class Child extends Parent { ... }
...
Parent pa = new Parent(); // 허용
Child ch = new Child(); // 허용
Parent pc = new Child(); // 허용
Child cp = new Parent(); // 오류 발생.
왜 사용할까?
A) 변화에 유연한 코드를 만들기 위해
Q) 변화란?
프로젝트를 만들다 여러 기능이 추가되거나 특정 기능이 수정되는 것을 의미합니다.
Q) 변화에 유연하다는 말은?
변화에 유연하다는 말은 프로그램에 중복되는 코드가 없다는 말과 비슷합니다. 프로젝트 내에서 어떤 특정 기능을 수정할 때 해당 기능을 사용하는 모든 코드를 수정해야 한다면 프로젝트가 커지면 커질 수록 이에 대한 변화 과정도 오래 걸리고 실수를 발생 시킬 수 있습니다.
Q) 어떻게 유연해질 수 있는가?
변화에 유연하기 위해서는 이러한 중복되는 코드를 한 군데 묶는 방법이 필요합니다. 따라서 이를 위해 함수를 사용합니다. 하지만 함수만을 사용하면 해당 함수에서 사용하는 데이터 타입의 변화나 추가가 생긴다면 이에 대한 대처가 어려울 것입니다. 따라서 클래스를 사용하여 이러한 함수들이 사용하는 데이터와 함수를 묶어 줍니다. 더 나아가 여러 함수들이 공통된 데이터를 사용하고 비슷한 성질을 띈다면 이들을 한 클래스 내에 묶어서 코드를 모듈화 시킬 수 있습니다.
Q) 클래스만으로 변화에 유연해 질 수 있는가?
클래스만으로는 변화에 유연해지지 못합니다. 단적인 예로 Cat과 Dog를 사용하는 코드가 있을 때 우리가 이러한 인스턴스들이 사용되어 지는 부분에 새로운 타입의 인스턴스를 추가하게 되는 상황이 있다면 모든 부분에서 해당 데이터 타입을 사용하는 코드들에 새로운 타입을 추가해야할 것입니다.
이렇게 클래스가 생성될 때 마다 데이터 타입이 추가가 된다면 변화에 유연하지 못하다고 이야기 할 수 있을 것입니다. 더욱이 Cat과 Dog, BIrd처럼 같은 속성을 지니는 클래스들이 같이 쓰이는 부분은 다수 존재하게 될 것입니다. 따라서 이러한 Cat, Dog, Bird라는 클래스 인스턴스들에 대한 공통적인 조건인 Pet이라는 부모 클래스가 존재하게 되고 해당 부모 클래스의 자식 클래스인 Cat, Dog, Birt를 데이터 타입으로 사용하는 참조 변수들의 데이터 타입을 부모 클래스인 Pet으로 지정해주게 된다면 해당 Pet을 상속받는 자식클래스가 늘어나도 Pet으로 데이터 타입을 지정해준 참조변수에 대한 코드는 수정이 필요하지 않게 될 것입니다.
'Computer Science' 카테고리의 다른 글
소프트웨어 테스트 (0) | 2022.01.16 |
---|---|
웹 서버와 WAS (0) | 2021.12.29 |
오버라이딩 vs 오버로딩 (0) | 2021.12.28 |