반지름(r)이 5일 때 원의 둘레, 원의 면적, 구의 표면적, 구의 체적을 구하는 프로그램 

 

1. 설명 및 목표

 반지름(r)이 5인 경우에 다음을 구하는 프로그램을 작성 하세요.
 (단, 결과는 소숫점 2째자리 까지 결과가 나타나도록 해야함)
 DecimalFormat 클래스를 이용 해서 해결 하세요.
         원주(원둘레) = 2 * PI * r
         원의 면적 =  PI * r * r
         구의 표면적 = 4 * PI * r * r
         구의 체적(부피) = 4/3 * PI * r * r * r

  • 메인에서 번호 입력받으면 switch문을 이용해 그 번호에 해당하는 식과 계산값을 불러온다
  • Circle 클래스와 Sphere 클래스를 만들어 상속 관계로 두고 result 필드를 공유한다 (오늘 배운거 응용)
  • double형 메소드로 결과값 리턴, DecimalFormat 클래스를 이용해 소수점 둘째자리까지 출력

 

2. 이론

 Format (형식) 클래스는 문자열이나 숫자를 원하는 형식의 문자열로 변환해주는 클래스이다. 주로 쓰이는 메소드는 날짜 형식을 변환해주는 SimpleDateFormat(), 매개변수화 된 문자열 형식을 변환해주는 MessageFormat() 그리고 숫자를 십진법의 형식으로 변환해주는 DecimalFormat 등이 있다. 객체를 생성할 때 적용할 패턴을 매개값으로 지정해줄 수 있다.

 상속Inheritance이란, 자식(하위, 파생, sub) 클래스가 부모(상위, super) 클래스의 멤버를 물려받는 것을 의미한다. 자식 클래스는 부모 클래스로부터 생성자를 제외한 필드와 메소드를 상속받을 수 있으며 이렇게 상속받은 멤버는 따로 다시 선언하거나 불러올 것 없이 바로 제 것처럼 사용할 수 있다. 하위클래스는 상위클래스에서 받은 멤버와 하위클래스에서 추가한 멤버를 모두 사용할 수 있고 때로는 재정의할 수도 있는데, 이를 오버라이딩overriding이라고 한다.

 부모 클래스의 멤버의 접근제어자에 따라 자식 클래스가 사용할 수 있는 멤버가 달라질 수 있다. 두 클래스가 같은 패키지 안에 존재할 경우 default, protected, public 접근제어자를 가진 멤버를 사용할 수 있고, 다른 패키지 안에 존재한다면 protected, public 접근제어자를 가진 멤버만 사용할 수 있다. private 접근제어자는 자식 클래스가 접근할 수 없다.

 또한 final이 붙는 경우에도 자식 클래스가 사용할 수 있는 범위가 달라진다. 멤버변수에 final이 붙는다면 상수가 되어 값을 자식 클래스가 수정할 수 없게 되고, 메소드에 붙으면 메소드 오버라이딩이 불가능해진다. 만약 final이 클래스에 붙었다면 그 클래스는 부모 클래스로 사용할 수 없다(상속 불가능하다).

 

 

3. 세부 내용

class Circle {

	double result;

	double circum(double r) { 
		result = 2 * Math.PI * r;
		return result;
	}

	double aOfCircle(double r) { 
		result = Math.PI * r * r;
		return result;
	}
}

원의 둘레와 원의 넓이를 구하는 메소드를 Circle 클래스에 만든다.

class Sphere extends Circle { 

	double aOfSphere(double r) { 
		result = 4 * Math.PI * r * r;
		return result;
	}

	double volume(double r) { 
		result = (4 / 3) * Math.PI * r * r * r;
		return result;
	}
}

Sphere 클래스가 Circle 클래스를 상속받게 만들어 Circle의 result 필드를 가져와 구의 표면적과 체적을 구할 때 사용한다.

 

		Sphere sph = new Sphere(); 
		DecimalFormat df = new DecimalFormat("###.00");	

		switch (num) {
		case 1:
			System.out.println(" 2 * PI * r= " + df.format(sph.circum(5)));
			break;
		case 2:
			System.out.println("PI * r * r= " + df.format(sph.aOfCircle(5)));
			break;
		case 3:
			System.out.println("4 * PI * r * r= " + df.format(sph.aOfSphere(5)));
			break;
		case 4:
			System.out.println("4/3 * PI * r * r * r= " + df.format(sph.volume(5)));
			break;
		}

Sphere 클래스가 Circle 클래스를 상속받은 상태이므로 Sphere 클래스의 객체를 생성해 Circle 클래스의 메소드 값을 불러올 수 있다. 이때 불러온 값을 DecimalFormat 클래스를 이용해 소수점 둘째자리까지 나타낼 수 있게 만든다.

 

4. 실행 결과

차례대로 1,2,3,4를 넣었을 때 결과가 이미지와 같이 출력되었다.

 

 

5. 고찰

 과제를 받았을 때, 사실 DecimalFormat class를 이용하라는 조건 외에는 아무것도 달려있지 않아서 main 메소드에서 전부 처리하면 간단하게 끝날 거라고 생각했다. 하지만 오늘은 수업에서 상속을 배웠기 때문에, 좀 억지스럽긴 하지만 일부러 상속을 사용해보기로 했다. 우선 상속 클래스로 나눌 클래스 두 개를 만들고자 했다. 알다시피 원넓이를 적분하면 구의 체적이 되니까, Sphere 클래스가 Circle 클래스를 상속받으면 될 것 같다고 간단하게 생각하고 각 클래스에 원에 대한 계산식, 구에 대한 계산식을 각각 집어넣고 결과값을 double형으로 리턴시켜주었다.  main에서 Shpere 클래스의 객체를 생성시켜주고, DecimalFormat을 이용해 소수점 둘째자리까지 출력되도록 서식을 만들어주었다. DecimalFormat은 String형으로 들어가야 하기 때문에 같은 클래스의 format(int i) 메소드를 이용해 값을 변환해 출력할 수 있도록 하였다. 원하는 번호를 키보드로 입력받아 switch문이 돌아가게 한다. 해당하는 case마다 식과 리턴값을 입력시켰다. Circle클래스에 존재하는 메소드도 이 클래스를 상속받은 자식 클래스의 객체로 문제없이 호출할 수 있었고, 결과도 잘 출력되었다.

 

0107 확인

1. DecimalFormat을 사용하는 형식이 조금 잘못되었음. 소수점 원하는 자리까지 출력되도록 하고 싶다면 "###.00" 형태로 만들어야 함. 나는 ###.## 형태로 만들어서 4번 구의 체적을 구할 때 뒤의 0이 잘리고 392.7만 출력되는 문제가 있었음!

2. 구의 체적 계산할 때, 4/3이 int형으로 계산되어 정확한 값이 나오지 않았음. 4.0/3으로 수정해서 double형으로 계산해주도록 하자..!

 

 

6. 전체 코드

 

 

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

220110 과제  (0) 2022.01.10
220107 과제  (0) 2022.01.07
220104 과제  (0) 2022.01.04
220103 과제 보강  (0) 2022.01.03
220103 과제  (0) 2022.01.03

+ Recent posts