윤년(leap year)은 달력 연도와 천문학적 연도 사이의 오차를 보정하기 위해 하루를 추가로 넣은 해를 말합니다.
일반적으로 4로 나누어 떨어지는 해를 윤년이라고 부릅니다. 다만 100으로 나누어 떨어지는 해는 윤년에서 제외되며, 그중에서도 400으로 나누어 떨어지는 해는 다시 윤년으로 인정됩니다.
윤년 판별 규칙 정리
- 4로 나누어 떨어지지 않는 해 → 평년 (예: 2019)
- 4로 나누어 떨어지고 100으로 나누어 떨어지지 않는 해 → 윤년 (예: 2016, 2020)
- 100으로 나누어 떨어지지만 400으로 나누어 떨어지지 않는 해 → 평년 (예: 1900, 2100)
- 400으로 나누어 떨어지는 해 → 윤년 (예: 1600, 2000)
특정 연도가 윤년인지 아닌지 판별하는 프로그램은 다음과 같습니다.
예제 1: 논리 연산자를 사용한 방법
#include<iostream>
using namespace std;
int main() {
int year = 2016;
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
cout<<year<<"은(는) 윤년입니다";
else
cout<<year<<"은(는) 윤년이 아닙니다";
return 0;
}출력 결과
2016은(는) 윤년입니다
위 프로그램에서는 연도가 4로 나누어 떨어지면서 동시에 100으로는 나누어 떨어지지 않으면 윤년으로 판단합니다. 또한 연도가 400으로 나누어 떨어지는 경우 역시 윤년입니다.
이 로직은 다음 코드 조각으로 표현할 수 있습니다.
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) cout<<year<<"은(는) 윤년입니다"; else cout<<year<<"은(는) 윤년이 아닙니다";
예제 2: 중첩 if 문을 사용한 방법
윤년 여부를 판별하는 프로그램은 중첩 if 문(nested if)을 사용해서도 작성할 수 있습니다.
#include <iostream>
using namespace std;
int main() {
int year = 2020;
if (year % 4 == 0) {
if (year % 100 == 0) {
if (year % 400 == 0)
cout << year << "은(는) 윤년입니다";
else
cout << year << "은(는) 윤년이 아닙니다";
} else
cout << year << "은(는) 윤년입니다";
} else
cout << year << "은(는) 윤년이 아닙니다";
return 0;
}출력 결과
2020은(는) 윤년입니다
위 프로그램의 실행 흐름은 다음과 같습니다. 먼저 연도가 4로 나누어 떨어지는지 확인하고, 그렇다면 다시 100으로 나누어 떨어지는지 검사합니다. 100으로도 나누어 떨어진다면 마지막으로 400으로 나누어 떨어지는지 확인하여, 해당되면 윤년, 그렇지 않으면 평년으로 판정합니다. 연도가 100으로 나누어 떨어지지 않는다면 윤년이며, 처음부터 4로 나누어 떨어지지 않는다면 윤년이 아닙니다.
이 논리 구조는 다음 코드 조각과 같습니다.
if (year % 4 == 0) {
if (year % 100 == 0) {
if (year % 400 == 0)
cout << year << "은(는) 윤년입니다";
else
cout << year << "은(는) 윤년이 아닙니다";
} else
cout << year << "은(는) 윤년입니다";
} else
cout << year << "은(는) 윤년이 아닙니다";왜 이런 복잡한 규칙이 필요할까?
지구가 태양을 한 바퀴 공전하는 데 걸리는 시간은 정확히 365일이 아니라 약 365.2422일입니다. 단순히 4년마다 하루를 추가하면 미세한 오차가 계속 쌓이게 됩니다. 이를 줄이기 위해 100년 단위로는 윤년을 생략하고, 400년 단위로는 다시 윤년을 두는 것입니다. 실제로 2000년은 윤년이었지만 1900년은 윤년이 아니었습니다.