인터페이스를 상속받은 클래스를 이용하여 홀수와 소수의 합을 구하기

- 먼저 get과 set의 개념을 이해해야게 될 것같다. 좋은 예제가 많기 때문에 이해하는데 좀 더 수월했다.

- 인터페이스에 있는 추상메서드의 구현

- 소수구하는 알고리즘(?)



1. SumIF 인터페이스 생성

- 공통된 부분이 합계를 구하는 것이기 때문에, int 타입의 매개변수를 받는건 보여주지만 몸통이 구현되지 않은 추상메서드만을 가지고 있다. 
package intheclass.models;

public interface SumIF { // 추상메서드 하나를 멤버로 가지고 있는 인터페이스
	// 기본형 int타입의 변수 n을 매개변수로 받는 추상메서드
	int sum(int n);
}


2. OddNum 클래스 생성(Odd = 홀수)

- SumIF를 상속받기 때문에 인터페이스의 상속키워드인 implements를 이용하여 상속을 표시했다.
- 아래의 PrimeNum도 마찬가지.
package intheclass.models;

public class OddNum implements SumIF {
	private int num;

	public int getNum() {
		return sum(num);
	}

	public void setNum(int num) {
		this.num = num;
	}

	@Override
	public int sum(int n) {
		int sum = 0;
		for (int i = 1; i <= n; i++) {
			if (i % 2 == 1) {
				sum += i;
			}
		}
		return sum;
	}
}


3. PrimeNum 클래스 생성(Prime = 소수)

- 일단 소수구하는 것은 주석처리해서 올렸는데 몇번 읽어봐야 완전히 머리에 들어올거같다. 
(구글에서 3~4명이 쓴 글을 보고나서야 이해가 되었...)
- 나머지는 OddNum과 마찬가지.
package intheclass.models;

public class PrimeNum implements SumIF { // 인터페이스 SumIF를 상속받은 클래스, 키워드는 implements
	// Prime = 소수, 1과 자기자신으로만 딱 나누어지는 수(즉, 나머지가 0이 나온다는 것)

	private int num;

	public int getNum() {
		return sum(num);// getter에는 return값이 있는지 확인한다.
	}

	public void setNum(int num) {
		this.num = num; // setter로 메인메서드에서 받은 값을 변수에 넣어준다.
	}

	@Override
	public int sum(int n) { 			// 소수구하는거....하....
		int sum = 0; 				// 일단 한번 이해함.
		int count; 				// 1.홀수의 합을 구할때 구현한 메서드처럼, int sum = 0;을 선언한다.
		for (int i = 2; i <= n; i++) { 		// 2.1을 제외하기 때문에 2부터 비교를 시작한다. 그래서 int i=2로 초기화
			count = 0; 			// 3.두번째 if문에서 count가 2가되어 sum에 i를 더하고 초기화 되어야 하지만 count를
			for (int j = 1; j <= i; j++) { 	// 바깥쪽 for문 밖에 두면 초기화가 되지 않기 때문에, 바깥쪽 for문 안에 첫번째로 작성한다.(애매하다 표현이)
				if (i % j == 0) { 	// 4.그리고 비교를 시작한다. i가 1일때는 계산해보면 j가 1일때 count가 1로 증가하지만 안쪽 for문의 다음조건식을
					count += 1; 	// 을 충족시키지 못하기 때문에, count가 2가 되지못하고 빠져나온다.
				} 			// 5.그렇게 첫 반복을 마치고, 바깥쪽 for문의 다음 반복(i=2)를 수행한다.
			} 				// i는 2일때, j가 1 그리고 2일경우 조건식을 만족해 count가 2가되고, 마지막에 있는 if문을 만났을때, 드디어
			if (count == 2) { 		// sum에 첫번째 소수인 2가 더해진다.
				sum += i; 		// 6.일단 표현을 잘했는가 싶은데, 중요한점은 만약에 sum메서드의 매개변수로 5가 들어왔다고 생각해보자.
			} 				// 결국, 1보다 크고 자기자신을 포함하며 그 안의 작은 수로 나누는 것(즉 1,2,3,4,5로 나누는 것)인데,
		} 					// 카운트가 카운트가 2가되는 경우는 n인 5를 1과 자기자신인 5로 나눴을때 나머지가 0이되는 경우밖에 없다.
		return sum; 				// 따라서 5는 소수로 정해지고 sum에 더해지는 것이다.(정리한번해야겠다...);;;
	}

}



4. SumTest 클래스에서 메인메서드로 결과를 확인한다.

- 각각의 클래스의 인스턴스를 생성한뒤 set으로 값을 저장한뒤, 그 클래스에 있는 get의 return값을 가져와서 출력한다.
(setter와 getter의 개념은 공부를 다시해서 정리해 올려야 될거 같다.)
package intheclass.models;

public class SumTest {

	public static void main(String[] args) {
		int num = 5; // 홀수의 합은 9(1+3+5), 소수의 합은 10(2+3+5)이 나와야 한다.

		OddNum on = new OddNum(); // getter setter쓰기 위해 인스턴스 생성
		on.setNum(num);
		System.out.println("숫자 1부터 " + num + "안에 있는 홀수의 합은 " + on.getNum() + "입니다.");

		PrimeNum pn = new PrimeNum();
		pn.setNum(num);
		System.out.println("숫자 1부터 " + num + "안에 있는 소수의 합은 " + pn.getNum() + "입니다.");
	}

}



--출력결과



댓글

Designed by JB FACTORY