2024. 2. 13. 16:06ㆍ[Way to PM] 백 엔드
0. 레퍼런스
인터페이스 상속 관련 과제
1. WHY - 해당 글 작성을 통해 얻고자 하는 목적
1) 생성자를 통한 객체 생성 과정에서 상속과 메모리할당, 다형성에 대한 학습을 통해 역량 강화
2. HOW, WHAT - 문제 해결 과정과 결과
1) 문제 상황 발생:
1. 과제 구현 과정에서 생성자 함수를 통해 객체를 생성하거나 참조 변수에 객체를 할당할 때 타입과 생성자의 클래스가 다른 것이 이해가 안되었다.
2. 용어 사용에서도 혼동이 있었다. 구글링을 해보면 '부모 클래스의 객체를 참조할 수도 있고 자식 클래스의 객체를 참조할 수도 있다.', '부모 클래스의 객체와 자식 클래스의 객체를 모두 참조한다.' 등의 문장들이 있다.
두 개의 주소를 참조하게 되면 하나의 변수에 두 개의 메모리 참조 값을 할당해야 하는데 오류가 나야하지 않나?라는 의문이 들었다.
2) 문제 원인 탐색:
-이해가 안되었던 이유는 다음과 같은데,
1. '부모 클래스의 객체를 참조한다.'의 의미는 참조 변수의 타입이 자동으로 업캐스팅되면서, 실제로는 부모 클래스를 상속받은 자식클래스의 객체를 참조하지만, 접근할 수 있는 필드값과 메서드는 부모로 한정된다는 뜻이다.
2. '참조한다'라는 언어때문에 '실제로 참조하는 것은 자식 클래스이다.'와 '부모 클래스의 객체도 참조한다.'는 두 경우가 모두 허용되어야 하는 모순에 빠졌던 것이다.
3) 문제 해결
Product beauty = new Beauty("beauty", 30000, 2);
이처럼 부모클래스의 객체인 Product를 타입으로 갖는 참조변수 beauty는 실제로 자식 클래스의 객체인 Beauty의 메모리 주소만 참조한다. 부모 클래스의 객체를 참조한다는 말은 부모클래스의 메서드와 필드값이 상속되어 저장되어 있는 Beauty의 주소를 참조하는데, 그 중에서 부모클래스로부터 상속받은 것들에만 접근할 수 있음(형변환)을 나타내는 말이다. 예외로 오버라이드된 메서드는 자식클래스에서 정의된 메서드가 호출된다.
3-1) 의문점
아직 이해가 안되는 점은 어짜피 참조 변수의 타입을 자식클래스로 정의하여도 부모메서드와 필드값에 접근이 가능하기 때문에 굳이 참조타입을 부모로 한정짓는 이유가 완전히 이해가 되진 않는다. 따라서 정보를 찾아봤는데 다음과 같다.
1. 코드의 간결성 및 가독성
- 부모 클래스 타입으로 참조를 선언함으로써 코드가 더 간결하고 읽기 쉬워집니다. 특히, 여러 자식 클래스가 동일한 인터페이스를 공유할 때, 이들을 부모 클래스 타입의 컬렉션으로 관리할 수 있으며, 이는 코드를 통합하여 관리할 수 있게 해줍니다.
2. 인터페이스 기반 프로그래밍
- 구체적인 구현체보다는 인터페이스(또는 추상 클래스)에 의존함으로써, 구현체가 변경되거나 다양화되어도 클라이언트 코드에는 영향을 미치지 않습니다. 이는 소프트웨어 설계 원칙 중 하나인 "개방/폐쇄 원칙"을 따르는 것으로, 확장에는 열려 있으나 변경에는 닫혀 있는 구조를 만듭니다.
3. 유지보수성 및 확장성 향상
- 부모 클래스 타입을 사용함으로써, 시스템을 확장하거나 변경해야 할 때 유연성을 제공합니다. 새로운 자식 클래스가 추가되더라도, 부모 클래스 타입의 참조 변수를 사용하는 기존 코드는 변경할 필요가 없습니다. 이는 장기적으로 코드의 유지보수를 용이하게 하며, 확장성을 향상시킵니다.
4. 타입 안정성
- 부모 클래스 타입으로 참조 변수를 사용하면, 컴파일 시점에 타입 체크를 통해 타입 안정성을 제공합니다. 이는 런타임 에러의 가능성을 줄이는 데 도움이 됩니다.
5. 다형성의 실용적 활용
- 실제로 자식 클래스의 구체적인 타입을 몰라도, 부모 클래스 타입을 통해 해당 객체를 다룰 수 있습니다. 이는 다형성을 활용한 프로그래밍을 가능하게 하며, 객체 지향 프로그래밍의 강력한 기능 중 하나입니다.
부모 클래스를 참조 타입으로 선언하는 것은, 특정 상황에서 프로그램의 유연성과 유지보수성을 높이는 등의 명확한 이점을 제공합니다. 그러나 실제로 어떤 접근 방식을 선택할지는 개발자가 해결하고자 하는 문제의 성격과 요구사항에 따라 달라질 수 있습니다.
사실 위의 정보는 '부모 클래스를 타입으로 선언했을 때'의 이점과 '상속'을 통한 이점이 섞여있는 것 같다. 확실히 동의가 되진 않지만 아마 아직 자바를 배우는 중이라 확실한 사례를 통한 아하가 없어서 그런 것 같다.
5. 배운점 및 자기평가
배운점
1) 부모 클래스를 타입으로 같는 참조 변수는 부모 클래스를 '참조한다'는 표현보단 '타입이 부모 클래스로 선언되었다'가 더 맞는 표현이다.
자기평가
1) 용어와 현상에 대한 혼동이 있었는데, 인과관계를 명확히하자 해결에 가까워졌다.
2) 납득이 안가면 추후에 프로젝트나 과제를 통해 해상도를 높이자. 개발은 학문이 아니라 기술이다.
'[Way to PM] 백 엔드' 카테고리의 다른 글
[Way to PM] 백엔드(자바) - Collection(List, Set, Map)의 특성 (0) | 2024.02.21 |
---|---|
[Way to PM] 백엔드(자바) - 람다식 dailyQuiz (0) | 2024.02.19 |
[Way to PM] 백엔드(자바) - 컬렉션, 문자열, 배열의 길이(크기) 구하기 및 컬렉션, 배열에서 특정 객체(요소) 가져오기 (0) | 2024.02.13 |
[Way to PM] 백엔드(자바) - 오버라이딩과 다형성 (1) | 2024.02.12 |
[Way to PM] 백엔드(자바) - 사용자 정의 예외 처리_디폴트 생성자, this 키워드 활용 (0) | 2024.02.07 |