작성
·
111
1
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
강의에서 보여주신 것처럼 add라는 함수를 기반으로 다른 함수가 만들어지고, 그 함수를 기반으로 또 다른 함수가 만들어지고... 간단한 함수면 금방 찾겠지만, 복잡해지기 시작하면 디버깅이 굉장히 어려워질 것 같은데, 이런 경우는 어쩔 수 없는 것인지, 최대한 파일을 줄이고 독립적인 함수가 되도록 해야되는 것인지 궁금합니다.
답변 2
1
안녕하세요? 질문&답변 도우미 Soobak 입니다.
좋은 질문이시네요.
말씀하신 문제점들에 대해서는 프로그래머가 항상 고민하고, 공부하고, 염두해두며 코드를 작성하려고 노력하며 풀어내야 한다고 생각합니다.
언어의 문법에 대한 내용 이외에도 프로그래밍의 구조를 설계하고, 디버깅 뿐만 아니라 가독성과 유지보수성도 고려하며 "어떻게 하면 '좋은 코드' 를 작성할 수 있을까?" 그리고 '좋은 코드' 란 무엇일까? 등등에 대해서 많은 사람들이 함께 고민하고 방법이 발전되어왔습니다.
그 중 하나가 C++ 에서 문법적으로 지원되는 '객체 지향' 입니다. (섹션 9. 객체지향의 기초 와 이후의 강의에서 학습하시게 됩니다.)
프로그래밍 구조를 설계하고 코드를 작성할 때, '객체' (클래스) 단위로 책임과 기능을 분리하여 관리하고, add()
와 같은 기본 함수에 대해서 기능을 추가할 때에는 어떻게 할 것인가 등에 대해서 '객체' 라는 관점을 통해 풀이한 방법입니다.
이외에도 '디자인 패턴' 이라는, 프로그래머들이 공통적으로 특정 구조를 패턴화하여 의사소통과 유지보수가 잘 이루어지도록 약속한 방법도 있으며, 말씀하신 내용의 문제를 풀어내고자 시도한 다양한 방법들이 있습니다.
이미 좋은 관점을 가지고 계시니, 문법 학습을 끝내신 후 해당 내용들에 대해 더 자세하게 학습해보시면 도움이 되실 것 같습니다!
0
안녕하세요, 인프런 AI 인턴입니다. 길민성님.
함수의 독립성과 모듈화는 코드의 유지보수와 디버깅에 매우 중요한 요소입니다. 함수를 설계할 때는 여러 가지 사항을 고려해야 합니다. 이와 관련된 몇 가지 중요한 포인트를 정리해 드립니다:
모듈화와 독립성: 가능한 한 각 함수가 하나의 작업을 수행하도록 작성하여 모듈화를 하는 것이 좋습니다. 이렇게 하면 함수가 서로 독립적이어서 하나의 함수가 변경되더라도 다른 함수에 영향을 주지 않습니다.
재사용성: 함수가 독립적이고 일반적인 작업을 수행한다면 여러 곳에서 그 함수를 재사용할 수 있습니다. 이는 코드 중복을 줄이고 유지 보수성을 높여줍니다.
분할 정복: 큰 문제를 작은 작업으로 나누어 처리하는 것은 복잡성을 줄이는 데 도움을 줍니다. 큰 함수보다는 여러 작은 함수로 나누는 것이 이해도와 디버깅에 유리합니다.
단일 책임 원칙: 함수는 하나의 책임만 가져야 한다는 원칙에 따라 설계합니다. 이렇게 하면 함수의 책임과 역할이 명확해져 코드 이해가 쉬워집니다.
이와 관련하여 정적 바인딩과 동적 바인딩 차이가 이해가 안됩니다.라는 질문에서 함수 설계의 중요성과 효율성에 대한 일부 컨텍스트가 제공되고 있습니다. 링크를 참고하시면 좀 더 구체적인 해결책을 제공받을 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
안녕하세요? 질문&답변 도우미 Soobak 입니다.
각 함수는 하나의 책임만 가져야 한다는 원칙이라는 게 하나의 작업을 수행한다는 것과 동일한 말인가요?
: 비슷하지만 완전히 동일한 개념은 아닙니다.
'책임' 이라는 말은 객체 지향 관점에서 사용하는 추상적인 개념입니다.
"하나의 작업을 수행한다" : 단순히 함수가 한 가지 기능만 수행한다는 것을 의미합니다.
"하나의 책임만 가져야 한다" : 함수가 '변경되어야 할 이유' 가 단 하나만 존재해야 한다는 의미입니다.
즉, 다소 난해하실 수 있으나, '책임' 이란 단순한 작업이나 동작이 아니라 '변경의 이유' 와 관련이 있습니다.
질문에서 예로 들어주신 Add()
함수와 연관지어 설명드려보면 다음과 같습니다.
int Add(int a, int b)
{
return a + b;
}
: 이 함수는 오직 '덧셈' 이라는 하나의 작업만 수행합니다.
동시에, 변경 시 고려되어야 하는 이유도 하나뿐입니다. 만약, 덧셈 로직을 바꾸고 싶다면, 예를 들어 소수점 연산도 지원하도록 하고 싶으면, 이 함수의 자료형만 변경하면 됩니다.
한편,
int AddAndLog(int a, int b)
{
int sum = a + b;
cout << "계산 결과 :" << sum << "\n";
return sum;
}
이러한 경우, 덧셈 기능과 로그 기능이 섞여있습니다.
따라서, 덧셈 로직을 수정해야 할 때 로그 로직 또한 고려 대상이 되어야 합니다.
반대로 로그 로직을 수정해야 할 때(예: 콘솔이 아니라 파일로 출력 등) 덧셈 로직에 또한 고려 대상이 되어야 합니다.
즉, 함수가 변경되어야 할 때 고려되는 이유가 2개 이상이고, 이 때를 '단일 책임을 가지지 않는 상황' 이라고 합니다.
"하나의 작업을 수행한다" 와 "하나의 책임만 가진다" 는 비슷하지만, '책임' 은 변경 이유에 초점을 둔 객체 지향에서의 개념입니다.
만약 지금 더 궁금하신 내용이 있으시면, '단일 책임 원칙' 이라는 키워드로 검색을 해보시는 것도 추천드려봅니다!
그리고 각 함수를 모듈화한다는 게, 함수마다 각각의 파일을 만들어야 한다는 의미인가요?
: 반드시 그렇지는 않습니다. '모듈화' 라는 개념은 '기능을 독립적으로 분리하는 것' 을 의미하며, 이를 위해 '별도로 파일로 나누는 것' 은 하나의 방법일 뿐입니다.
한 파일 안에서도 역할을 분리할 수 있습니다. 다만, 프로젝트가 커지면 파일을 분리하여 관리하는 것이 유지 보수가 편리해집니다.
다른 프로젝트에서 동일한 함수를 사용할 때, 함수 파일을 프로젝트 폴더에 복붙하여 include하면 기존과 동일하게 재사용할 수 있는 건가요?
: 네, 가능은 합니다. 하지만, 일반적으로 '라이브러리' 라는 것을 만들어서 관리를 합니다.
'라이브러리' 는 코드를 재사용할 수 있도록 묶어놓은 파일, 즉, 다른 곳에서도 사용할 수 있도록 함수, 클래스, 데이터 등을 모아둔 코드 집합으로 생각하시면 됩니다. (이에 대해서는 이어지는 강의에서 학습하시게 됩니다.)
또한, Git 과 같은 버전 관리 시스템을 통해서 관리를 효율적으로 진행합니다.
Git 에 대해서는 따배씨++ 마지막 세션에서 학습하시게 됩니다.
좋은 방향으로 잘 학습하고 계신 것 같습니다! 개인적으로, 지금은 '헤더 파일' 에 대해서, 그리고 이어지는 강의의 내용인 '명칭 공간' 에 대해서 이해하신 후 가볍게 진도를 넘어가시는 것을 추천드립니다.
한 번에 모두 학습하시기에는 양이 많다고 느껴지실 수 있으나, 차근 차근 학습을 진행하시다보면 금방 익숙해질 수 있는 내용들이라고 생각합니다!
궁금하셨던 부분들이 잘 해소가 되셨으면 좋겠습니다.
참고로, 인프런 AI 기능은 질문&답변 도우미와는 무관합니다.
위의 답변에서 추후 강의에서 다룬다고 하셨지만, 답글 보고 궁금한게 생겨 여쭤봅니다.
각 함수는 하나의 책임만 가져야 한다는 원칙이라는 게 하나의 작업을 수행한다는 것과 동일한 말인가요?
그리고 각 함수를 모듈화한다는 게, 함수마다 각각의 파일을 만들어야 한다는 의미인가요?
다른 프로젝트에서 동일한 함수를 사용할 때, 함수 파일을 프로젝트 폴더에 복붙하여 include하면 기존과 동일하게 재사용할 수 있는 건가요?