입력 받은 연도가 윤년인지 평년인지를 판별하는 프로그램

 

1. 설명 및 목표

     * 윤년의 정의
      1. 해당 연도를 4로 나누어 떨어지면 윤년
      2. 그 중에서 100으로 나누어 떨어지면 윤년 아님
      3. 그 중에서 400으로 나누어 떨어지면 윤년
  • 구상클래스 B로 필드에 int year 선언하고 생성자로 year 값 받아서 초기화한다.
  • 인터페이스 A로 추상메소드를 만들고 클래스 B에서 A를 상속받아 추상메소드를 메소드 오버라이딩한다.
  • 메소드 오버라이딩으로 윤년을 구하는 계산을 한 뒤 결과값을 리턴한다.

 

2. 이론

 인터페이스(interface)는 자바 프로그래밍 언어에서 클래스들이 구현해야 하는 동작을 지정하는데 사용되는 추상 자료형이다. 인터페이스는 상수와 추상메소드로 구성되어 있으며, 인터페이스 내의 모든 메소드들이 정의상 추상적이기 때문에 abstract 키워드를 생략할 수 있다. 또한 인터페이스는 노출된 행동들의 집합을 규정하므로 모든 메소드들은 암묵적으로 public이므로 이도 생략 가능하다. 비슷하게 인터페이스에서 정의되는 객체의 값도 모두 상수이므로 public static final 키워드를 생략할 수 있다.

 인터페이스는 implements로 상속을 받는다. (ex.    class S  implements  A {}   )  그리고 인터페이스를 상속받은 일반 클래스는 인터페이스 안에 들어 있는 추상메소드를 반드시 메소드 오버라이딩을 통해 재정의시켜야 한다. 이때, public은 생략할 수 없으므로 반드시 표기해야 한다.  만약 인터페이스가 인터페이스를 상속받았다면 자식 인터페이스는 부모 인터페이스의 추상 메소드를 오버라이딩할 수 없다. 인터페이스는 오로지 추상 메소드만 추가할 수 있으므로, 상속받은게 있어도 오버라이딩은 하지 않는다.
 혹시 추상클래스와 인터페이스를 모두 상속받아야 하는 경우, 반드시 추상클래스를 먼저 상속받고 인터페이스를 다음에 상속 받아야 한다.  (ex.    class S extends B implements A {}    )
 

 

3. 세부 내용

interface A {
	boolean years();
}

class B implements A {
	int year;

	public B(int year) {
		this.year = year;
	}

	public boolean years() {
		if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) {
			return true;
		} else
			return false;
	}
}

먼저 interface A를 선언하고 내부에 boolean형 추상메소드 years();을 정의한다. 그리고 A를 상속받은 B 클래스에서 상속받은 추상메소드 years를 메소드 오버라이딩한다. B 클래스의 생성자를 통해 필드 year 값이 초기화되었으므로, 초기화된 year의 값을 계산해 조건에 맞으면 true, 조건에 맞지 않으면 false을 리턴시킨다.

		int year = sc.nextInt();

		B result = new B(year);

		if (result.years()) {
			System.out.println(year + "년은 윤년입니다.");
		} else
			System.out.println(year + "년은 평년입니다.");

B클래스의 객체를 new 연산자를 이용해 선언하면서 B의 생성자 매개변수에 입력받은 연도값을 대입해 그 값으로 초기화할 수 있도록 한다. 그리고 B클래스의 years() 메소드를 통해 얻은 값을 if문으로 비교해 true일 경우 윤년, false일 경우 평년이라는 결과를 출력할 수 있도록 한다.

 

 

4. 실행 결과

 윤년의 조건에 따르면 2020년은 4로 나누어지고 100으로 나누어지지 않으므로 윤년, 2200년은 4로 나누어지고 100으로 나누어지므로 평년, 2400년은 4로 나누어지고 400으로 나누어므로 윤년이어야 한다. 결과가 바르게 출력되었다.

 

 

5. 고찰

 과제가 그렇게 어려운 것은 아니어서 작성 중 어떤 문제가 생기지는 않았다. 딱히 인터페이스가 필요한 과제는 아니었지만 오늘 인터페이스를 배워서 일부러 끼워넣어보았다. 아직 배운 개념을 어떤 때 어디에 어떻게 써야 하는지 감이 잡히지 않은 상태라 과제가 쉬울 때엔 배운 걸 응용해가며 쓰임새를 익혀보려고 노력하고 있다. 복잡한 수식을 코드로 구현해내는 것도 중요하지만 일단은 배운 것들을 내 것으로 녹여내는 게 가장 중요하므로 주말에는 간단한 문제를 상속, 인터페이스, 생성자 등을 이용해가며 풀어볼까 생각한다.

 

 

6. 전체 코드

 

 

 

'개인 > 풀이' 카테고리의 다른 글

220111 과제+++  (0) 2022.01.12
220110 과제  (0) 2022.01.10
220106 과제  (0) 2022.01.06
220104 과제  (0) 2022.01.04
220103 과제 보강  (0) 2022.01.03

+ Recent posts