자바의 정석 기초(6) 연습문제 : OOP편

NtoZ·2023년 3월 1일
0

Java

목록 보기
14/23
post-thumbnail

OOP편 연습문제풀이


6-2. 다음과 같은 실행결과를 얻도록 Student 클래스에 생성자와 info( )를 추가하시오.

  • 예제
class Exercise6_2 {
    public static void main(String[] args) {
      Student s = new Student("홍길동", 1, 1, 100, 60, 76);
      String str = s.info();
      System.out.printin(str);
    }
  }
class Student {
/*
(1) 알맞은 코드를 넣어 완성하시오.
*/
}

결과 : 홍길동, 1,1,100,60,76,236,78.7
  • 문제풀이 접근 :
    main단에서 인스턴스를 만들 때 호출되는 생성자는 매개변수로 이름, 반, 번호, 국어성적, 수학성적, 영어성적을 전달받아 해당 인스턴스 변수 값으로 저장한다. 기본 생성자가 아닌 별도의 생성자를 먼저 만들어야 한다.
    또, main 단에서 객체 s.info( ) 메서드를 통해 일정 String 값을 str에 반환받는다. 그 str을 출력하면 결과로 홍길동, 1,1,100,60,76,236,78.7가 나와야 한다. s.info()는 객체의 주소값이 저장된 참조변수를 통해 접근하니 인스턴스 메서드이다. (클래스 메소드는 주로 클래스명.메소드명으로 접근한다.)
<내 풀이>
public class Chapter6_Practice {
	public static void main(String[] args) {
		//Student 클래스의 새 인스턴스를 생성하여 그 주소값을 동타입 참조변수 s에 저장
		Student s = new Student("홍길동", 1, 1, 100, 60, 76);
		
		// String str에는 s.info()를 저장한다. info( )는 인스턴스 메서드이다.
		String str = s.info();	//info()는 인스턴스 s를 통해 접근할 수 있는 메서드일 것이다.
		System.out.println(str);
	}
}

class Student {
	String name;	//학생이름
	int ban;		//반
	int no;			//번호
	int kor;		//국어점수
	int eng;		//영어점수
	int math;		//수학점수
	
	Student(String name, int ban, int no, int kor, int eng, int math) {
		this.name = name;
		this.ban = ban;
		this.no = no;
		this.kor = kor;
		this.eng = eng;
		this.math = math;
	}
	
	String info() {
		int sum = this.kor+this.eng+this.math;
		float avg = (int)(sum/3.0f*10)/10.0f;	// 소수점 한자리까지만 남기고 나머지 소수점은 버리기 위해 10을 곱하고 int를 씌워서 버린다음 다시 10.0f로 나눔
		String info = new String(""+ this.name +"," + this.ban+"," + this.no+"," + this.kor+"," + this.eng+"," + sum +","+ avg);
		return info;
	}
}
<결과>
홍길동,1,1,100,60,236,78.6
  • 모범답안 :
class Exercise6_2 {
public static void main(String args[]) {
Student s = new Student(" ",1,1,100,60,76); 홍길동
String str = s.info();
System.out.println(str);
}
}
class Student {
String name;
int ban;
int no;
int kor;
int eng;
int math;
Student(String name, int ban, int no, int kor, int eng, int math) {
this.name = name;
this.ban = ban;
this.no = no;
this.kor = kor;
this.eng = eng;
this.math = math;
}
public String info() {
return name ✔️
+","+ban
+","+no
+","+kor
+","+eng
+","+math
+","+(kor+eng+math)
+","+((int)((kor+eng+math) / 3f * 10 + 0.5f) / 10f) //❗ 이 부분 반올림!
;✔️
}
}
<결과>
홍길동, 1,1,100,60,76,236,78.7
  • ✔️내 풀이와 다른 지점 : 나는 합과 평균을 나타내는 로컬변수 sum과 avg를 만들었는데 모범답안에서는 name을 리턴함과 동시에 문자열 결합연산자 +로 다른 값들을 한꺼번에 리턴한다. 괄호를 사용해 합계와 평균을 계산했다.
  • ❌틀린 부분 : 값을 반올림 했어야 했다. Math.round()메서드를 사용하던가 혹은 적정한 타이밍에 0.5f를 더해주고 int로 감싸줘 버렸어야 했다.
  • ✔️체크해야할 부분 : 소스코드 파일과 다른 이름의 클래스에게 main 메서드를 주고 실행했더니 Console 창에 아무런 결과값도 띄워지지 않았다. 이는 JVM이 소스파일 이름과 같은 public 클래스에서 main 메소드를 찾기 때문이다.
    ➡️ 더 자세히 알아보기

6-3. 정의한 Student 클래스에서 다음과 같이 정의된 두 개의 메서드 getTotal()과 getAdvantage()를 추가

  • 예제 :
  1. • 메서드명 : getTotal
    • 기 능 : 국어(kor), 영어(eng), 수학(math)의 점수를 모두 더해서 반환한다.
    • 반환타입 : int
    • 매개변수:없음
  2. • 메서드명 : getAverage
    • 기 능 : 총점 (국어점수+영어점수+수학점수)을 과목수로 나눈 평균을 구한다.
    소수점 둘째자리에서 반올림할 것.
    • 반환타입 : float
    • 매개변수:없음
public static void main(String[] args) {
		Student s = new Student();
		s.name = "홍길동";
		s.ban = 1;
		s.no = 1;
		s.kor = 100;
		s.eng = 60;
		s.math = 76;
		System.out.println ("이름:" + s.name);
		System.out.println ("총점:" + s.getTotal());
		System.out.println("평균:" + s.getAverage());
	}
    
 <Student 클래스에는 무엇이 와야할까?>
  • 문제 풀이 접근 : Strudent 클래스에 인스턴스 메서드 getTotal( )과 getAverage( )를 추가해주면 되는 간단한 문제
  • 문제 상황 발생 : getAverage( )에서 this.getTotal( )을 과목수f로 나눠주고 평균을 구한다음 100을 해준 상태에서 (int)로 강제 형변환시켜 7866.666... 이라는 결과를 얻고 Math.round( )안에 집어넣어 소수점 첫째자리에서 반올림하여 7867.0이라는 결과를 얻어주고 다시 100.0f로 나눠주면 될 줄 알았는데 결과값이 78.66이 떴다.
    (float result= (Math.round((int)(this.getTotal()/3.0f*100)))/100.0f; ) ➡️ (Math.round((int)(236/3.0f100)))/100.0f
    ➡️(Math.round((int)(78.66665*100))/100.0f ❌❌ 이 지점이 잘못됐다!
    Math.round로 반올림을 적용하기 전에 int를 붙였으니 정수를 상대로 소수점 첫째자리 반올림을 시도한 나쁜 방법이었다. Math.round를 먼저 적용한 다음 int를 붙여야 한다. 그리고 100.0f로 다시 나눠준다.
    ➡️ float result = (int)(Math.round(this.getTotal()/3.0f
    100))/100.0f;
    ➡️ (int)(7867.000000)/100.0f (✔️이 때 계산순서를 헷갈리지 말자. 복합대입 연산자나 대입연산자가 아니므로 왼쪽에서 오른쪽 순으로 계산이 진행된다.)
    ➡️7867/100.0f
    ➡️78.67
public class Chapter6_Practice {
	public static void main(String[] args) {
		Student s = new Student();
		s.name = "홍길동";
		s.ban = 1;
		s.no = 1;
		s.kor = 100;
		s.eng = 60;
		s.math = 76;
		System.out.println ("이름:" + s.name);
		System.out.println ("총점:" + s.getTotal());
		System.out.println("평균:" + s.getAverage());
	}
}

class Student {
	String name;	//학생이름
	int ban;		//반
	int no;			//번호
	int kor;		//국어점수
	int eng;		//영어점수
	int math;		//수학점수
	
	int getTotal() {
		int result = this.kor+this.eng+this.math;
		return result;
	}
	float getAverage() {
		float result = (int)(Math.round(this.getTotal()/3.0f*100))/100.0f;
		return result;
	}
}
<결과>
이름:홍길동
총점:236
평균:78.67
  • 모범답안과 차이: return (int)(getTotal() / 3f * 10 + 0.5f) / 10f;
    를 사용했다. 따로 로컬변수를 지정하지 않고 계산한 값을 바로 return 했다. Math.round()메소드를 사용하면 괄호가 너무 많아져 지저분해 보이는데 확실히 적정량을 곱하고 +0.5f한다음 int로 소수점을 제거하는게 더 깔끔해보인다. 게다가 소수점 둘째자리에서 반올림이었으니 100이 아니라 10을 나누고 곱하는게 맞았다.

💡6-4. 두 점의 거리를 계산하는 getDistance()를 완성하시오.

  • 예제 :
class Exercise6_4 {
		// 두 점 (x,y)와 (x1,y1)간의 거리를 구한다.
		static double getDistance(int x, int y, int xl, int yl) {
		/*
		(1) 알맞은 코드를 넣어 완성하시오.
		*/
		}
		public static void main(String[] args) {
		System.out.println(getDistance(1, 1, 2, 2));
		} 
 }
  • hint : 제곱근 계산은 Math.sqrt(double a)를 사용하면 된다.
  • 문제 접근 : 삼각형은 피타고라스 정리 문제이다. a,b,c를 각각 삼각형의 밑변, 높이, 대각선이라고 가정했을 때 a^2 + b^2 = c^2라는 공식이 성립한다. 따라서 양변에 루트를 씌워서 c의 값을 구하면 두 점 사이의 거리를 계산하는 것이 된다.
    a^2는 (x1-x)^2, b^2는 (y1-y)^2과 동일값을 가지므로 결과는 구하기 쉽다.
  • 💡 자바에서 제곱은 ^로 사용되지 않는다. 이는 정수 유형에서만 사용되는 비트 배타적 논리합이다. 제곱은 Math.power()메서드를 사용해야 한다.
<내 풀이>
// 두 점 (x,y)와 (x1,y1)간의 거리를 구한다.
			static double getDistance(int x, int y, int x1, int y1) {
				
				double base = Math.abs(x1-x);		//밑변
				double height = Math.abs(y1-y);	//높이
				double hypotenuse = Math.sqrt(Math.pow(base, 2)+Math.pow(height, 2));	//Math.pow(대상숫자, 지수)
				
				return hypotenuse; //빗변이 곧 두 점 사이의 거리이다.
			}
			public static void main(String[] args) {
				System.out.println(getDistance(1, 1, 2, 2));
			} 
 <결과>
 1.4142135623730951

<모범답안>
class Exercise6_4 {
  // (x,y) (x1,y1) . 두 점 와 간의 거리를 구한다
  static double getDistance(int x, int y, int x1, int y1) {
  	return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1)); // x, y는 지역변수
  }
  public static void main(String args[]) {
  	System.out.println(getDistance(1,1,2,2));
  }
}
<모범결과>
1.4142135623730951

-💡 모범답안 해설 : 제곱도 Math sqrt(double a) . Math.pow(double
a, double b) , 2 . 를 사용하면 되지만 제곱이므로 그냥 곱셈연산자를 사용했다 어느 쪽을 사용해도 괜찮지만 메서드를 호출하는 것은 곱셈연산보다 비용이 많이 드는 작업이라는 것은 기억해두자. 그렇다고 해서 보다 빠른 코드를 만들겠다고 코드를 복잡하게 하는 것은 좋지 않다.

<제곱연산 메서드를 사용했을 때
static double getDistance(int x, int y, int x1, int y1) {
	return Math.sqrt(Math.pow(x-x1,2) + Math.pow(y-y1,2));
}
  • 💡 아이디어 : 불필요한 로컬변수를 만들지 말고 수식을 바로 return해보자. 코드가 훨씬 깔끔해진다.

6-6. 연습문제 6-4에서 작성한 클래스메서드 getDistance()를 MyPoint클래스의 인스턴스메서드로 정의하기

  • 예제:
class MyPoint {
  int x;
  int y;

  MyPoint(int x, int y) {
    this.x = x;
    this.y = y;
  }
/*
(1) 인스턴스메서드 getDistancel 작성하시오.
*/
}
class Exercise6_6 {
  public static void main(String[] args) {
  	MyPoint p = new MyPoint(1, 1);
  	
    // p와 (2,2)의 거리를 구한다.
  	System.out.println(p.getDistance(2, 2));
  }
}
  • 풀이 접근 : 인스턴스 메서드 getDistance를 만들어 밑변제곱 + 높이제곱값에 루트를 씌워주면 된다.
<내 풀이>
package effort;

import java.util.Arrays;
import java.util.Scanner;

class MyPoint {
	  int x;
	  int y;

	  MyPoint(int x, int y) {
	    this.x = x;
	    this.y = y;
	  }

	 double getDistance(int i, int j) {
		return Math.sqrt((i-this.x)*(i-this.x) +(j-this.y)*(j-this.y));
	}
}	

public class PNote {
		public static void main(String[] args) {
			MyPoint p = new MyPoint(1, 1);
			System.out.println(p.getDistance(2,2));
		} 
}
<내 답>
1.4142135623730951
  • 6-4와 6-6번 문제의 차이 : 클래스 메서드와 인스턴스 메서드의 차이 6-4에는 클래스 메서드를 사용했기 때문에 인스턴스 생성 없이도 바로 해당 클래스에 접근 할 수 있었다.(대신 매개변수를 통해서 계산에 필요한 값을 제공받았다.) 6-6에서는 인스턴스 메서드를 사용했다. 인스턴스 메서드는 인스턴스 변수 x, y를 사용하여 작업해야 하므로 계산에 필요한 일부 매개변수 i, j만이 필요하다. 또한 인스턴스 변수를 사용했으므로 static이 붙을 수 없는 것은 당연하다.

6- 16. 문자열 참조변수에 대하여 주어진 결과 예측하기


💡6 - 17. 메서드 작성 및 테스트하기

  • 메서드 명 : shuffle
  • 기능 : 주어진 배열에 담긴 값의 위치를 바꾸는 작업을 반복하여 뒤섞이게 한다. 처리한 배열을 반환한다.
  • 반환타입 : int[ ]
  • 매개변수 : int[ ] arr - 정수값이 담긴 배열
  • 단, Math.random( )을 사용하는 경우 실행결과와 다를 수 있음.
<문제>
class Exercise6_17 {
	/*
	 * ( 1) shuffle메서드를 작성하시오.
	 */
	public static void main(String[] args) {
		int[] original = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		System.out.printIn(java.util.Arrays.toString(original));
		int[] result = shuffle(original);
		System.out.println(java.util.Arrays.toString(result));
	}
}

<나와야하는 결과>
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[4, 6, 8, 3, 2, 9, 7, 1, 5]
  • 내 풀이
public class PNote {
	
	static int[] shuffle(int[] arr) {
		int[] result = arr;
			for(int i=0; i<result.length; i++) {
				int random = (int)(Math.random()*result.length);
				int tmp = result[i];
				result[i] = result[random];
				result[random] = tmp;
			}
		return result;
	}
	
	public static void main(String[] args) {
		int[] original = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		System.out.println(java.util.Arrays.toString(original));
		int[] result = shuffle(original);
		System.out.println(java.util.Arrays.toString(result));
	}
}
<결과>
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[4, 1, 6, 2, 9, 3, 5, 8, 7]
  • 모범 답안 :
class Exercise6_17 {
	public static int[] shuffle(int[] arr) {
		if (arr == null || arr.length == 0)
			return arr;	//⭐⭐ 유효성 검사
		for (int i = 0; i < arr.length; i++) {
			int j = (int) (Math.random() * arr.length);
// arr[i] arr[j] . 와 의 값을 서로 바꾼다
			int tmp = arr[i];
			arr[i] = arr[j];
			arr[j] = tmp;
		}
		return arr;
	}

	public static void main(String[] args) {
		int[] original = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		System.out.println(java.util.Arrays.toString(original));
		int[] result = shuffle(original);
		System.out.println(java.util.Arrays.toString(result));
	}
}
  • 💡아이디어 : int배열을 매개변수로 받아서 배열에 저장된 각 요소들의 위치를 여러번 바꿔서 섞은 다음 반환하는 메서드이다.
    매개변수로 어떤 값이 넘어올지 모르기 때문에 작업을 시작하기 전에 값의 유효성체크는 반드시 해야 한다. 아래의 코드는 넘겨받은 배열이 이거나 크기가 null이나 0이면 그대로 반환한다.
    if(arr==null || arr.length==0) return arr;

💡6-18. 메서드 작성 테스트

  • 메서드명 : isNumber
  • 기 능 : 주어진 문자열이 모두 숫자로만 이루어져있는지 확인한다.
    모두 숫자로만 이루어져 있으면 true를 반환하고, 그렇지 않으면 false를 반환한다.
    만일 주어진 문자열이 null이거나 빈문자열“”이라면 false를 반환한다.
  • 반환타입 : boolean
  • 매개변수 : String str - 검사할 문자열
  • Hint : String 클래스의 charAt(int i)메서드를 사용하면 문자열의 i번째 위치한 문자를 얻을 수 있다.

  • 예제:
class Exercise6_18 {
	/*
	 * (1) isNumber메서드를 작성하시오.
	 */
public static void main(String[] args) {
		String str = "123";
		System.out.println(str + "는 숫자입니까? " + isNumber(str));
		
		str = "1234o";
		System.out.printIn (str + "는 숫자입니까? " + isNumber(str));
	}
}
  • 문제 접근 : isNumber( )메소드는 반환타입이 boolean이어야 한다. 가장 처음 isNumber에서 리턴값을 true로 초기화한다. 매개변수로 전달되는 str에 대한 유효성 검사를 실시한다. (null이나 ""이 오면 false값을 반환.) for문으로 charAt()을 통해 문자열의 요소를 순환하다가 문자가 오면 boolean 타입 변수 isNumber를 false로 만든 다음 반환한다.
  • 내 답안:
public class PNote {
	
	static boolean isNumber(String str) {
		boolean isNumber = true;	//반환하는 기본값 true로 설정
		
			// 주어진 문자열이 null이거나 빈 문자열이라면 false를 반환(유효성 검사)
			if((str==null)||(str.equals("")))
				isNumber = false;
		
			// 문자열의 모든 요소가 숫자가 아니면 isNumber 값을 false 바꾸면된다.
			// 숫자가 아닌 건 어떤 조건식으로 두어야할지 모르겠으므로, ch에 담아서 소문자나 대문자인지 체크하자.
			for(int i=0; i<str.length(); i++) {
				char ch = str.charAt(i);
				if(('a'<=ch && ch<'z')||('A'<=ch&&ch<='Z')) {
					isNumber = false;
					break;
				}
			}
		
		return isNumber;
	}
	
	public static void main(String[] args) {
		String str = "123";
		System.out.println(str + "는 숫자입니까? " + isNumber(str));
		
		str = "1234o";
		System.out.println (str + "는 숫자입니까? " + isNumber(str));

	}
}
<결과>
123는 숫자입니까? true
1234o는 숫자입니까? false
  • 모범 답안:
class Exercise6_18 {
  public static boolean isNumber(String str) {
    if(str==null || str.equals(""))
    return false;
  	
    for(int i=0; i< str.length();i++) {
    char ch = str.charAt(i);
  	if(ch < '0' || ch > '9') { //⭐ 내 답과의 차이점
    return false;
  	}
  } // for
return true;
}
public static void main(String[] args) {
String str = "123";
System.out.println(str+" ? "+isNumber(str)); 는 숫자입니까
str = "1234o";
System.out.println(str+" ? "+isNumber(str));
  • ⭐나의 답과 차이점: 숫자가 아닐 경우라는 조건을 정확하게 두었다. if(ch<'0' || ch>'9') return false;
    궁금증이 생겼다.🤔 :저렇게 되면 부호가 '-'일 경우 잡히지 않는건가? 그리고 생각해보니 논리부정연산자 !(ch >= '0' && ch <= '9')를 써도 되는구나...

    Java에서 음의 정수는 또는 와 -같이 숫자 앞에 기호 로 표시됩니다 . 그러나 문자 '0'에서 '9'는 양의 정수만 나타냅니다. 따라서 문자가 숫자가 아닌지 확인하는 경우 음수인지 확인할 필요가 없습니다.
    메서드 컨텍스트에서 isNumber()입력 문자열의 모든 문자가 숫자 문자인지 확인하고 그렇다면 true를 반환합니다. 문자가 숫자가 아닌 경우 메서드는 즉시 false를 반환합니다. 조건식은 가 문자 '0'(숫자가 아님)보다 작거나 문자 '9'(역시 숫자가 아님)보다 큰지 확인 ch < '0' || ch > '9'합니다 . ch따라서 ch'0'과 '9' 사이에 있지 않으면 표현식은 true를 반환하여 ch숫자가 아님을 나타냅니다.

  • 💡아이디어 : char 타입은 음의 정수에 대한 표현은 허용하고 있지 않다! 따라서 문자가 숫자가 아님을 증명하기 위해서 if(ch<'0' || ch>'9') return false;를 사용해도 문제가 없다.

6-19. TV 클래스를 주어진 로직대로 완성하기.

  • 참고: 코드를 단순히 하기 위해서 유효성 검사는 로직에서 제외한다.
class MyTv {
	boolean isPowerOn;
	int channel;
	int volume;
	final int MAX_VOLUME = 100;
	final int MIN_VOLUME = 0;
	final int MAX_CHANNEL = 100;
	final int MIN_CHANNEL = 1;

	void turnOnOff() {
// (1) isPowerOn의 값이 true면 false로, false면 true로 바꾼다.
	}

	void volumeUp() {
// (2) volume의 값이 MAX_VOLUME보다 작을 때만 값을 1증가시킨다.
	}

	void volumeDown() {
// (3) volume의 값이 MIN_VOLUME보다 클 때만 값을 1감소시킨다.
	}

void channellUp() {
// (4) channel의 값을 1증가시킨다.
// 만일 channel이 IW(_CHANNEL이면, channel의 값을 MIN_CHANNEL로 바꾼다.
}
void channelDown() {
		// (5) channel의 값을 1감소시킨다.
		// 만일 channel이 MIN_CHANNEL이면, channel의 값을 MAX.
		if(channel == MIN_CHANNEL) {
			channel = MAX_CHANNEL;
		}
		else channel--;
		}
		
		} // class MyTv
		class Note {
		public static void main(String[] args) {
		MyTv t = new MyTv();
		t.channel = 100;
		t.volume = 0;
		System.out.println("CH:" + t.channel + ", VOL:" + t.volume);
		t.channelDown();
		t.volumeDown();
		System.out.println("CH:" + t.channel + ", VOL:" + t.volume);
		t.volume = 100;
		t.channellUp();
		t.volumeUp();
		System.out.println("CH:" + t.channel + ", VOL:" + t.volume);
		}
	}
  • 내 풀이
package effort;

class MyTv {
	boolean isPowerOn;
	int channel;
	int volume;
	final int MAX_VOLUME = 100;
	final int MIN_VOLUME = 0;
	final int MAX_CHANNEL = 100;
	final int MIN_CHANNEL = 1;

	void turnOnOff() {
// (1) isPowerOn의 값이 true면 false로, false면 true로 바꾼다.
		isPowerOn = !isPowerOn;
	}

	void volumeUp() {
// (2) volume의 값이 MAX_VOLUME보다 작을 때만 값을 1증가시킨다.
		if(volume < MAX_VOLUME) volume++;
	}

	void volumeDown() {
// (3) volume의 값이 MIN_VOLUME보다 클 때만 값을 1감소시킨다.
		if(volume > MIN_VOLUME) volume--;
	}

	void channellUp() {
	// (4) channel의 값을 1증가시킨다.
	// 만일 channel이 MAX_CHANNEL이면, channel의 값을 MIN_CHANNEL로 바꾼다.
		if(channel == MAX_CHANNEL) {
			channel = MIN_CHANNEL;
		}
		else channel++;

	}
	void channelDown() {
		// (5) channel의 값을 1감소시킨다.
		// 만일 channel이 MIN_CHANNEL이면, channel의 값을 MAX.
		if(channel == MIN_CHANNEL) {
			channel = MAX_CHANNEL;
		}
		else channel--;
		}
		
		} // class MyTv
		class Note {
		public static void main(String[] args) {
		MyTv t = new MyTv();
		t.channel = 100;
		t.volume = 0;
		System.out.println("CH:" + t.channel + ", VOL:" + t.volume);
		t.channelDown();
		t.volumeDown();
		System.out.println("CH:" + t.channel + ", VOL:" + t.volume);
		t.volume = 100;
		t.channellUp();
		t.volumeUp();
		System.out.println("CH:" + t.channel + ", VOL:" + t.volume);
		}
	}
<결과>
CH:100, VOL:0
CH:99, VOL:0
CH:100, VOL:100

6-20. 메서드 작성 및 테스트

  • 메서드명 : max
  • 기 능 : 주어진 int형 배열의 값 중에서 제일 큰 값을 반환한다.
    만일 주어진 배열이 null이거나 크기가 0인 경우, -999999를 반환한다.
  • 반환타입 : int
  • 매개변수 : int[ ] arr - 최대값을 구할 배열

  • 예제
class Exercise6_20 {
	/*
	 * ( 1) max메서드를 작성하시오.
	 */
	public static void main(String[] args) {
		int[] data = { 3, 2, 9, 4, 7 };
		System.out.println(java.util.Arrays.toString(data));
		System.out.println("최대값:" + max(data));
		System.out.println("최대값:" + max(null));
		System.out.println("최대값:" + max(new int[] {})); // 크기가 0인 배열
	}
}
<결과>
[3, 2, 9, 4, 7]
최대값:9
최대값:-999999
최대값:-999999
  • 내 풀이:
package effort;

class Note {
	/*
	 * ( 1) max메서드를 작성하시오.
	 */
	static int max(int[]arr) {
		if(arr==null || arr.length==0) {
			return -999999;
		}
		int tmp=arr[0];
		for(int i=0; i<arr.length; i++) {
			if(tmp<arr[i]) {
				tmp = arr[i];
			}
		}
		return tmp;
	}
	
	public static void main(String[] args) {
		int[] data = { 3, 2, 9, 4, 7 };
		System.out.println(java.util.Arrays.toString(data));
		System.out.println("최대값:" + max(data));
		System.out.println("최대값:" + max(null));
		System.out.println("최대값:" + max(new int[] {})); // 크기가 0인 배열
	}
}
<결과>
[3, 2, 9, 4, 7]
최대값:9
최대값:-999999
최대값:-999999
  • 모범답안:
class Exercise6_20{
public static int max(int[] arr) {
if(arr==null || arr.length==0)
return -999999;
int max = arr[0]; // . 배열의 첫 번째 값으로 최대값을 초기화 한다
for(int i=1; i< arr.length;i++) {// . 배열의 두 번째 값부터 비교한다
if(arr[i] > max)
max = arr[i];
}
return max;
}
public static void main(String[] args)
{
int[] data = {3,2,9,4,7};
System.out.println(java.util.Arrays.toString(data));
System.out.println(" :"+max(data)); 최대값
System.out.println(" :"+max(null)); 최대값
System.out.println(" :"+max(new int[]{})); // 크기가 0인 배열
}
}
  • ⭐ 차이점 : arr[0]은 이미 자기자신이므로 arr[1]부터 비교했다. 또, 변수명으로 max를 사용해 직관성을 높였다. 처리과정을 줄이고 직관적인 코드를 만들자!

6-20. 메서드 작성 및 테스트

  • 메서드명 : abs
  • 기 능 : 주어진 값의 절대값을 반환한다.
  • 반환타입 : int
  • 매개변수 : int value

  • 예제
class Exercise6_21 {
	/*
	(1) abs메서드를 작성하시오.
	*/
	public static void main(String[] args)
	{
	int value = 5;
	System. out. println (value + "의절대값:" + abs(value));
	value = -10;
	System. out. println(value + "의 절대값:" + abs(value));
	}
}
<결과>
5의 절대값:5
-10의 절대값:10
  • 풀이 접근 : 결국 절대값은 제곱 /제곱근의 과정이다.
  • 나의 풀이:
class Note {
	/*
	(1) abs메서드를 작성하시오.
	*/
	static int abs(int value) {
		int result = (int)Math.sqrt(value*value);	//어차피 정수^2를 루트씌우면 정수이므로 (int) 강제형변환 가능
		return result;
	}
	public static void main(String[] args)
	{
	int value = 5;
	System. out. println (value + "의 절대값:" + abs(value));
	value = -10;
	System. out. println(value + "의 절대값:" + abs(value));
	}
}
<결과>
5의절대값:5
-10의 절대값:10
  • 모범답안
<모범답안1>
class Exercise6_21
{
public static int abs(int value) {
return value >=0 ? value : -value;
}
public static void main(String[] args)
{
int value = 5;
System.out.println(value+" :"+abs(value)); 의 절대값
value = -10;
System.out.println(value+" :"+abs(value)); 의 절대값
}
}

<모범답안2>
public static int abs(int value) {
if(value >=0) {
return value;
} else {
return -value; // value , . 가 음수인 경우 부호를 변경한다
}
}
  • 차이점 : 삼항 연산자 또는 if문을 사용하여 부호연산자(-)를 통해 올바른 결과를 산출하고 있다.

참고서적 :

  • 남궁성 - 자바의 정석 기초편 : 예제, 모범답안
profile
9에서 0으로, 백엔드 개발블로그

0개의 댓글