[자바초보] 조건문 관련 너무 이해가 안되요...

psm6469의 이미지

안녕하세요 자바 독학한지 얼마 안된 왕초보 학생입니다.

class Ch5Circle {
 
	public static final int INVALID_DIMENSION = 666;
 
	private double radius;
 
	public Ch5Circle(double r) {
		setRadius(r);
	}
 
	public double getArea() {
		double result = INVALID_DIMENSION;
 
		if (isRadiusValid()) {
			result = Math.PI*radius*radius;
		}
		return result;
	}
 
	public double getCircumference() {
 
		double result = INVALID_DIMENSION;
 
		if (isRadiusValid()) {
 
			result = 2.0*Math.PI*radius;
		}
 
		return result;
	}
 
	public double getDiameter() {
 
		double diameter = INVALID_DIMENSION;
 
		if (isRadiusValid()) {
 
			diameter = 2.0*radius;
		}
		return diameter;
	}
 
	public double getRadius() {
 
		return radius;
	}
 
	public void setDiameter(double d) {
 
		if ( d > 0 ) {
			setRadius(d/2.0);
		} else {
			setRadius(INVALID_DIMENSION);
		}
	}
 
	public void setRadius(double r) {
 
		if (r>0) {
			radius = r;
		} else {
			radius = INVALID_DIMENSION;
		}
	}
 
	private boolean isRadiusValid() {
		return radius != INVALID_DIMENSION;
	}
}

책에서 조건문 단락을 이제 막 들어갔는데요 거기에 나온 샘플 프로그램의 한 service class입니다.
이 프로그램은 이용자로부터 반지름 radius를 입력받아 원의 넓이와 둘레길이를 출력해주는 프로그램인데요.

프로그램을 실행시켜 반지름을 제대로 입력하면 원넓이,원둘레가 잘 계산되서 나오고
반지름을 -44, 0 같이 이상하게 입력하면 원넓이,원둘레 모두 -1.0으로 나오게 됩니다.

그런데 잘 이해가 안가는 부분이 있는데요

맨 밑에 isRadiusValid()매소드에 보면

return radius != INVALID_DIMENSION;

이때 INVALID_DIMENSION이 -1이니까
입력된 반지름이 -1이 아니면 참, -1을 입력받으면 거짓을 출력하는 거잖아요
(여기를 잘못 이해한거 같은데 어디서 잘못 이해했는지 모르겠어요;;)

그러니까 사용자가 반지름으로 -1을 입력하면 프로그램은 원넓이 = -1, 원둘레 = -1로 계산하고
반지름으로 -1이 아닌 숫자를 입력하면 프로그램은 원넓이, 원둘레를 원래 계산하던 방식으로 계산한다는 말 아닌가요?

즉 반지름을 양수로 잘 입력하면 잘 계산되고
-1을 입력하면 원넓이,원둘레 모두 -1이 리턴되고
-14같이 -1이 아닌 음수를 입력하면 프로그램이 원넓이로 -564.xxx같이 뚱딴지같은 결과를 출력한다는 말이 아닌가요?

그런데 왜 실행시켜보면 -1이나 -14같이 엉뚱한 반지름값을 입력하면 모두 원넓이=-1, 원둘레=-1이 리턴될까요?
지금 참, 거짓을 판단하는 statement가 "반지름 radius가 -1의 값을 가지지 않는다"이잖아요........

제가 어디서 오류를 범했는지, 프로그램이 왜 저렇게 실행되는지 설명 부탁드립니다

익명 사용자의 이미지

우선, 소스코드에 의하면 INVALID_DIMENSION의 값은 -1이 아니고 666 입니다.
그러니까 -1이 출력되는게 아니라 666이 출력되어야 하는데...
위에 소스코드 제대로 올리신거 맞나요?

isRadiusValid() 함수가 하는 일이 radius의 범위 검사가 아닙니다.
그냥 단지 radius가 INVALID_DIMENSION이 아닌지만 체크할 뿐.
실질적인 radius의 범위 검사(음수인지 아닌지)는
setRadius()에서 이루어 집니다.

setRadius()에서는
넘겨받은 값이 양수이면 그대로 그걸 radius로 사용하고,
음수이면 radius에 INVALID_DIMENSION를 대입하네요.

psm6469의 이미지

-1이 아니라 666인데 잘못 적었네요;;

아, 답변을 보니까 이제야 코드가 이해가 되네요.. 정말 감사합니다!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.