[C++ 기본]1. 상속에 대해서1(상속을 사용하는 이유)
안녕하세요 고급 개발자가 꿈인 코린이 입니다.
오늘은 상속에 대해서 포스팅 하겠습니다.
C++ 과 자바 프로그래밍을 하면 상속이라는 내용을 많이 배웁니다. 상속은 어떻게 하는 것이고 어떠한 특징이 있고
이러한 내용들을 배우는데요
C와 C++의 차이점을 얘기해 보라는 면접 질문의 답변에서도 상속이 있고 없고의 차이다 라고 할정도로
상속에 대한 내용을 아주 많이 다룹니다.
실제로 업무상으로도 프로그래밍을 하다보면 상속을 아주 많이 다루게 되는데요
막상 실제로 업무를 하거라 프로그래밍을 하다 보면 상속을 왜 사용해야하는지 의문이 들때가 많습니다.
구지 상속을 사용하지않고 하나의 클래스에서 모든것을 다 구현할수가 있기 때문에 왜 상속을 사용한는지 의문이
들때가 많았습니다. 실제로 저 또한 구지 상속을 왜 사용해야 하지?? 라고 생각할때가 많았습니다.
그래서 프로그래밍업무를 하면서 느꼈던 상속을 사용하는 이유에 대해서 알아보고 예제 코드를 구현하면서
상속에 대한 여러가지 내용들을 다루어 보겠습니다. (가상함수,순수가상함수의 차이점과 순수 가상함수를 사용하는 이유, C++에서 가상함수를 이용한 리스너 구현등을앞으로 포스팅할 예정입니다.)
1. 상속은 인터페이스의 개념이다. (구현시 통일된 api를 사용하게 할수 있다. )
상속은 어찌보면 인터페이스의 개념과 가깝다 C++에서는 인터페이스가 없지만 인터페이스의 개념이라고 한다면
특정한 틀같은것을 여러 클래스에서 공유가 가능하다는 것입니다.
예를 들어 하나의 프로그램에는 10명이 안되는 개발자들이 있지만 수십에서 수백명의 개발자의 손이 거처가는
경우가 많습니다.
만약 특정한 기능을하는 서비스 클래스가 여러개 있다고 가정을하면 이러한 서비스 들을 구현하는 개발자들은
여러 명일 것입니다. 그런데 각 개발자들의 코딩 스타일과 함수 네이밍들은 각기 다른데
각자의 스타일대로 함수 네이밍등을 만들면 유지 보수할때 어려웁 부분이 있습니다.
만약 버튼이 눌렸을때 각 서비스 클래스에서 다른 동작을 해야한다 했을때 어떠한 개발자는 onClicked라는 네이밍을
사용할수가 있고 또 다른 개발자는 뭐 ifClicked라는 네이밍을 사용할수가 있습니다.
이렇게 되면 새로운 개발자들 입장에서는 어떠한 함수가 버튼이 눌렸을때 함수인지를 혼동하게 될수가 있고
코드를 파악하기가 어려워 질수가 있어서 유지보수 면에서 어렵게 됩니다.
그러나 앞서 얘기한것과 달리 이러한 네이밍등을 통일하기위해서 최상위 클래스에서 버튼일 눌렸을떼 함수는
onClicked를 사용한다 라고 인터페이스를 지정해주면 다른 여러 클래스에서 이 최상위 클래스를
상속 받아 이 onClicked를 사용해서 여러 클래스들이 통일된 함수를 사용할수 있습니다.
통일된 함수를 사용하기 때문에 다른 개발자가 구현한 여러 클래스를 봤을때 아~~ onclicked 함수 안의 내용은
버튼이 눌렸을때 수행하는 함수이구나 라는 것이 파악되기 때문에 유지 보수등과 코드를 파악하는데에 쉬울수가
있습니다.
그렇기 때문에 여러 클래스에서 공통으로 사용되는 함수들읜 최상위 클래스에서 가상함수로 선언을하고
다른 클래스 들에서 이 최상위 클래스를 상속받아 사용하는것이 좋은 프로그램이고 상속을 사용하는 첫번째 이유 입니다.(이렇게 구현하는 것이 꼭 정답은 아니지만 유지 보수및 추후 코드 구현할때 조금더 유용합니다..)(안드로이드를 보면 onclicked는 버튼을 눌렀을때 실행이 되는 것이구나 라는 것을 한눈에 알수있고 여러 개발자들이 버튼이 눌렀을때 무엇인가 동작을 하게 한다면 onclicked 함수안에 구현할수 있도록 가이드가 가능하게 됩니다.)
2. 상속을 사용해서 코드 구현시 구현 오류를 줄일수가 있다.
이 내용은 리스너에 관한 내용입니다. 만약 특정한 리스너가 있고 이 리스너는 특정한 값이 변할때 구현되고있는
모든 클래스에 알려주어야 할때 알려줘야 하는 리스너가 있다고 가정을 해봅니다.(이 함수는 모든 클래스에 무조건 사용이 되어야하고 사용을 안하면 실행시 문제가 되는 함수일떼)
이 리스너를 상속받으면 위의 특정한 값이 변할때 호출되는 함수를 무조건 상속 받아야 빌드시에 오류가 발생하지
않도록 구현이 된다면 특정한 개발자가 어떠한 클래스를 구현하고 이 리스너를 상속 받게되면
무조건위의 함수를 선언해서 특정한 값이 변할때 무조건 받을수 있도록 구현이 가능해서 코드 구현시 오류를 줄일수가
있습니다. 위의 값이 변할때 호출하는 함수를 상속받지 않는다면 코드 실행시에 문제가 될수가 있기때문에
무조건 상속을 받을수있게 구현이 가능합니다.(순수 가상함수에 관한 내용입니다.)
즉 무조건 상속 받아야하는 함수를 상속받지 않으면 컴파일 에러가 발생해서 개발자가 이러한 함수를 인지하게 하고
어떤기능을 하는 함수인지를 인지할수 있어서 중복된 함수를 안만들수도 있고 실행시에 문제가 될수있는
부분을 조금더 줄게 할수가 있습니다.
3. 코드를 문서화 할때 유용합니다.
이 내용은 1번 항목과 비슷한 내용이긴하지만 개념이 다른 내용인것 같아서 3번째 항목으로 적었습니다.
만약 어떠한 프로그램을 구현을 했고 이 프로그램 유지보수를 위해서 코드를 문서화 해야한다면
여러 클래스에서 같은 기능을하는 함수는 이름이 똑같으면 이해하기도 쉽고 보기도 편합니다.
물론 각 개발자들이 특정한 기능을 하는 함수는 이렇게 이름을 짓자라고 약속을 할수도 있지만
상속을 이용하면 이러한 약속을 구지 안해도 각 클래스에서 상속을 받아서 같은 이름을 사용할수록 할수가 있고
문서화 할때 유용하고 유지보수 면에서 아주 좋게됩니다.
여기 까지 상속하는 이유에 대해서 포스팅을 해봤는데요 막상 글로 적으려고 하니 설명하기 어려운 내용도있고
많은 생각이 들지가 않네요 추후에 상속을 하는 이유에대해서 추가해야할 내용이 있다면 내용에 추가해서
도움이 될수있는 글이 되도록 하겠습니다.
다음 포스팅에서는 예제 코드를 이용해서 C++ 상속을 하는 방법 및 상속을 어떻게 활용하는지등을 포스팅 하겠습니다.
여기 까지 읽어주셔서 감사합니다.