소개
이 실습에서는 C 언어로 순현재가치 (NPV) 를 계산하는 방법을 배웁니다. 이 실습은 일련의 현금 흐름과 할인율을 읽고 각 현금 흐름을 할인한 다음 합계하여 NPV 를 계산하는 과정을 안내합니다. 사용자가 필요한 데이터를 입력하고 계산된 NPV 를 표시하는 C 프로그램을 만들 것입니다. 이 실습은 재무 수학의 기본 개념과 C 프로그래밍을 사용한 이자 계산을 다룹니다.
현금 흐름 및 할인율 입력
이 단계에서는 C 언어로 순현재가치 (NPV) 를 계산하기 위해 일련의 현금 흐름과 이자율을 읽는 방법을 배웁니다. 사용자가 여러 현금 흐름과 할인율을 입력할 수 있는 프로그램을 만들 것입니다.
먼저 NPV 계산을 위한 새로운 C 파일을 생성합니다.
cd ~/project
nano npv_calculator.c
이제 다음 코드를 파일에 추가합니다.
#include <stdio.h>
#define MAX_CASH_FLOWS 10
int main() {
double cash_flows[MAX_CASH_FLOWS];
double discount_rate;
int num_cash_flows;
// 현금 흐름 개수 입력
printf("현금 흐름 개수를 입력하세요 (최대 %d): ", MAX_CASH_FLOWS);
scanf("%d", &num_cash_flows);
// 현금 흐름 개수 유효성 검사
if (num_cash_flows <= 0 || num_cash_flows > MAX_CASH_FLOWS) {
printf("잘못된 현금 흐름 개수입니다.\n");
return 1;
}
// 현금 흐름 입력
for (int i = 0; i < num_cash_flows; i++) {
printf("현금 흐름 %d를 입력하세요: ", i);
scanf("%lf", &cash_flows[i]);
}
// 할인율 입력
printf("할인율을 입력하세요 (소수점으로): ");
scanf("%lf", &discount_rate);
// 입력 내용 확인을 위한 출력
printf("\n입력 요약:\n");
printf("현금 흐름 개수: %d\n", num_cash_flows);
printf("할인율: %.2f%%\n", discount_rate * 100);
printf("\n현금 흐름:\n");
for (int i = 0; i < num_cash_flows; i++) {
printf("현금 흐름 %d: $%.2f\n", i, cash_flows[i]);
}
return 0;
}
프로그램을 컴파일합니다.
gcc -o npv_calculator npv_calculator.c
입력을 테스트하기 위해 프로그램을 실행합니다.
./npv_calculator
예시 출력:
현금 흐름 개수를 입력하세요 (최대 10): 3
현금 흐름 0를 입력하세요: -1000
현금 흐름 1를 입력하세요: 500
현금 흐름 2를 입력하세요: 600
할인율을 입력하세요 (소수점으로): 0.1
입력 요약:
현금 흐름 개수: 3
할인율: 10.00%
현금 흐름:
현금 흐름 0: $-1000.00
현금 흐름 1: $500.00
현금 흐름 2: $600.00
이 코드는 다음을 보여줍니다.
- 최대 현금 흐름 개수 정의
- 사용자 입력으로부터 현금 흐름 개수 읽기
- 개별 현금 흐름 값 입력
- 할인율 입력
- 입력 내용 유효성 검사 및 확인 출력
이 프로그램은 필수 입력 매개변수를 캡처하여 NPV 계산을 위한 기반을 마련합니다.
각 현금 흐름 할인 및 합계
이 단계에서는 C 언어로 각 현금 흐름을 할인하고 할인된 현금 흐름을 합산하여 순현재가치 (NPV) 를 계산하는 방법을 배웁니다.
이전의 npv_calculator.c 파일을 수정하여 NPV 계산 기능을 추가합니다.
cd ~/project
nano npv_calculator.c
이전 코드를 다음 구현으로 바꿉니다.
#include <stdio.h>
#include <math.h>
#define MAX_CASH_FLOWS 10
double calculate_npv(double cash_flows[], int num_cash_flows, double discount_rate) {
double npv = 0.0;
for (int i = 0; i < num_cash_flows; i++) {
// 각 현금 흐름 할인: CF / (1 + r)^t
double discounted_cash_flow = cash_flows[i] / pow(1 + discount_rate, i);
npv += discounted_cash_flow;
}
return npv;
}
int main() {
double cash_flows[MAX_CASH_FLOWS];
double discount_rate;
int num_cash_flows;
// 현금 흐름 개수 입력
printf("현금 흐름 개수를 입력하세요 (최대 %d): ", MAX_CASH_FLOWS);
scanf("%d", &num_cash_flows);
// 현금 흐름 개수 유효성 검사
if (num_cash_flows <= 0 || num_cash_flows > MAX_CASH_FLOWS) {
printf("잘못된 현금 흐름 개수입니다.\n");
return 1;
}
// 현금 흐름 입력
for (int i = 0; i < num_cash_flows; i++) {
printf("현금 흐름 %d를 입력하세요: ", i);
scanf("%lf", &cash_flows[i]);
}
// 할인율 입력
printf("할인율을 입력하세요 (소수점으로): ");
scanf("%lf", &discount_rate);
// NPV 계산
double npv = calculate_npv(cash_flows, num_cash_flows, discount_rate);
// 결과 출력
printf("\n입력 요약:\n");
printf("현금 흐름 개수: %d\n", num_cash_flows);
printf("할인율: %.2f%%\n", discount_rate * 100);
printf("\n현금 흐름:\n");
for (int i = 0; i < num_cash_flows; i++) {
double discounted_cf = cash_flows[i] / pow(1 + discount_rate, i);
printf("현금 흐름 %d: $%.2f (할인 후: $%.2f)\n",
i, cash_flows[i], discounted_cf);
}
printf("\n순현재가치 (NPV): $%.2f\n", npv);
return 0;
}
수학 라이브러리와 함께 프로그램을 컴파일합니다.
gcc -o npv_calculator npv_calculator.c -lm
NPV 계산을 테스트하기 위해 프로그램을 실행합니다.
./npv_calculator
예시 출력:
현금 흐름 개수를 입력하세요 (최대 10): 3
현금 흐름 0를 입력하세요: -1000
현금 흐름 1를 입력하세요: 500
현금 흐름 2를 입력하세요: 600
할인율을 입력하세요 (소수점으로): 0.1
입력 요약:
현금 흐름 개수: 3
할인율: 10.00%
현금 흐름:
현금 흐름 0: $-1000.00 (할인 후: $-1000.00)
현금 흐름 1: $500.00 (할인 후: $454.55)
현금 흐름 2: $600.00 (할인 후: $495.87)
순현재가치(NPV): $-49.58
이 구현의 주요 내용:
- NPV 를 계산하는
calculate_npv()함수 추가 pow()함수를 사용하여 현금 흐름 할인- 원래 현금 흐름과 할인된 현금 흐름 모두 표시
- 최종 NPV 계산 및 표시
참고: -lm 플래그는 pow() 함수를 위해 수학 라이브러리를 연결하는 데 사용됩니다.
순현재가치 (NPV) 출력
이 마지막 단계에서는 사용자 친화적인 형식으로 순현재가치 (NPV) 계산 결과를 해석하고 제시하는 방법을 배웁니다.
npv_calculator.c 파일을 수정하여 출력 표현을 개선합니다.
cd ~/project
nano npv_calculator.c
개선된 출력 서식으로 코드를 업데이트합니다.
#include <stdio.h>
#include <math.h>
#define MAX_CASH_FLOWS 10
double calculate_npv(double cash_flows[], int num_cash_flows, double discount_rate) {
double npv = 0.0;
for (int i = 0; i < num_cash_flows; i++) {
double discounted_cash_flow = cash_flows[i] / pow(1 + discount_rate, i);
npv += discounted_cash_flow;
}
return npv;
}
void print_npv_analysis(double cash_flows[], int num_cash_flows, double discount_rate, double npv) {
printf("\n--- NPV 분석 보고서 ---\n");
printf("할인율: %.2f%%\n", discount_rate * 100);
printf("\n현금 흐름 세부내역:\n");
printf("--------------------\n");
for (int i = 0; i < num_cash_flows; i++) {
double discounted_cf = cash_flows[i] / pow(1 + discount_rate, i);
printf("기간 %d: $%.2f (할인 후: $%.2f)\n",
i, cash_flows[i], discounted_cf);
}
printf("\n순현재가치 (NPV): $%.2f\n", npv);
// NPV 결과 해석
if (npv > 0) {
printf("투자 권고: 수락\n");
printf("이 프로젝트는 가치를 창출할 것으로 예상됩니다.\n");
} else if (npv < 0) {
printf("투자 권고: 거절\n");
printf("이 프로젝트는 가치를 파괴할 것으로 예상됩니다.\n");
} else {
printf("투자 권고: 중립\n");
printf("이 프로젝트는 주어진 할인율에서 손익분기점에 있습니다.\n");
}
}
int main() {
double cash_flows[MAX_CASH_FLOWS];
double discount_rate;
int num_cash_flows;
printf("순현재가치 (NPV) 계산기\n");
printf("=====================\n");
// 현금 흐름 개수 입력
printf("현금 흐름 개수를 입력하세요 (최대 %d): ", MAX_CASH_FLOWS);
scanf("%d", &num_cash_flows);
// 현금 흐름 개수 유효성 검사
if (num_cash_flows <= 0 || num_cash_flows > MAX_CASH_FLOWS) {
printf("잘못된 현금 흐름 개수입니다.\n");
return 1;
}
// 현금 흐름 입력
for (int i = 0; i < num_cash_flows; i++) {
printf("기간 %d의 현금 흐름을 입력하세요: ", i);
scanf("%lf", &cash_flows[i]);
}
// 할인율 입력
printf("할인율을 입력하세요 (소수점으로): ");
scanf("%lf", &discount_rate);
// NPV 계산
double npv = calculate_npv(cash_flows, num_cash_flows, discount_rate);
// NPV 분석 출력
print_npv_analysis(cash_flows, num_cash_flows, discount_rate, npv);
return 0;
}
프로그램을 컴파일합니다.
gcc -o npv_calculator npv_calculator.c -lm
개선된 NPV 출력을 테스트하기 위해 프로그램을 실행합니다.
./npv_calculator
예시 출력:
순현재가치(NPV) 계산기
=====================
현금 흐름 개수를 입력하세요 (최대 10): 3
기간 0의 현금 흐름을 입력하세요: -1000
기간 1의 현금 흐름을 입력하세요: 500
기간 2의 현금 흐름을 입력하세요: 600
할인율을 입력하세요 (소수점으로): 0.1
--- NPV 분석 보고서 ---
할인율: 10.00%
현금 흐름 세부내역:
--------------------
기간 0: $-1000.00 (할인 후: $-1000.00)
기간 1: $500.00 (할인 후: $454.55)
기간 2: $600.00 (할인 후: $495.87)
순현재가치(NPV): $-49.58
투자 권고: 거절
이 프로젝트는 가치를 파괴할 것으로 예상됩니다.
이 버전의 주요 개선 사항:
- 전용
print_npv_analysis()함수 추가 - 출력 서식 개선
- NPV 기반 투자 권고 추가
- 명확한 제목으로 사용자 인터페이스 개선
요약
이 실습에서는 C 언어로 일련의 현금 흐름과 이자율을 입력받아 순현재가치 (NPV) 를 계산하는 방법을 배웠습니다. 사용자는 여러 개의 현금 흐름과 할인율을 입력하고, 프로그램은 입력 내용을 확인하기 위해 출력합니다.
다음으로, 각 현금 흐름을 할인하고 합산하여 NPV 를 계산한 후 최종 결과를 출력하는 방법을 배울 것입니다.



