인터페이스를 상속받은 클래스를 이용하여 홀수와 소수의 합을 구하기
- Computer / Java
- 2018. 8. 8.
- 먼저 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() + "입니다."); } }
--출력결과
'Computer > Java' 카테고리의 다른 글
wrapper class (0) | 2018.09.01 |
---|---|
Object class 중, clone(), equals(), hashCode(), toString() 메서드 (0) | 2018.09.01 |
접근제어자와 캡슐화, 그리고 getter, setter메서드 (0) | 2018.08.14 |
java 환경변수 설정하기 (0) | 2018.08.11 |
반복문을 이용해 1,2,3,4,5,6,7,8,9와 같이 출력하기 (0) | 2018.08.03 |