간단히 멤버변수로 표현해주면 되는 문제지만, 멤버 번수에는 인스턴스 변수와 클래스 변수(static 변수)가 있어 두가지로 표현했고 간단히 설명에 나온 내용으로 유효성 검사도 체크했다.
package excercise6_1;
public class StudaCard2 {
int num;
boolean isKwang;
String text;
public static void main(String[] args) {
StudaCard2 s = new StudaCard2();
s.num = 11;
s.text = "광";
if(s.num >= 1 && s.num <= 10){
System.out.println("유효한 값이다.");
}
else {
System.out.println("유효하지 않은 값이다.");
}
if(s.text == "광") {
s.isKwang = true;
System.out.println(s.isKwang);
}
else {
s.isKwang = false;
System.out.println(s.isKwang);
}
}
}
package excercise6_1;
public class SutdaCard {
static int num = 11;
static String text = "";
static boolean isKwang;
public static void main(String[] args) {
// 1. 변수 num 1 ~ 10 사이 정수 유효성 체크 if 문
if(num >= 1 && num <= 10) {
System.out.println("유효한 값이다.");
}
else {
System.out.println("유효하지 않은 값이다.");
}
// 2. 불리언 isKwang이 "광" 과 텍스트가 동일하면 true 출력 아니면 false 출력
if(text == "광") {
isKwang = true;
System.out.println(isKwang);
}
else {
isKwang = false;
System.out.println(isKwang);
}
}
}
text 라는 변수가 추가로 들어가 있어, 예제와 다르게 변수가 추가되었다.
기존 정답은 아래와 같다.
class StudaCard {
int num;
boolean isKwang;
}
어려웠던 점은 실행 결과 "1K"가 어떻게 나와야하는가 가장 고민이 많았다. 그래서 가장 쉽게 생각했다.
car1 인스턴스 변수 3, false가 아니면 문자열 '1K' 출력하는 방법으로 접근했다.
하지만 답지 내용은 isKwang true 이면 "K", false 이면 "" 빈 문자열로 표현하여 생성자 첫번째 매개변수와 더하기 연산자로 return 반환 해주면 된다.
여기서 내가 간과하게 있다.
더하기 연산자는 피연산자가 하나라도 문자열이 있으면 문자열로 계산된다는 것이다.
정답은 아래와 같다.
package ch6;
class Excercise6_2 {
public static void main(String args[]) {
StudaCard card1 = new StudaCard(3, false);
StudaCard card2 = new StudaCard();
System.out.println(card1.info());
System.out.println(card2.info());
}
}
class StudaCard {
int num;
boolean isKwang;
// 1. 기본 생성자에서 매개변수 2개가 있는 생성자를 호출하여 1, true로 초기화
StudaCard (){
this(1, true);
}
// 2. 매개변수 2개인 생성자
StudaCard (int num, boolean isKwang){
this.num = num;
this.isKwang = isKwang;
}
// 3. 반환 타입이 String 인 info 메서드 생성
String info() {
// 4. isKwang 이 true 이면 "K", false 이면 "" 빈 문자열 나온 결과값과 num 합쳐서 반환
return num + (isKwang? "K" : "");
}
}
추가로 if-else 삼항 연산자를 사용하여 코드를 줄여봐야겠다. 잘 사용하지 않아서 익숙해져야 할 거 같다.
문제가 간단하여 따로 코드는 안 적겠다.
해당 문제에서 가장 어려웠던 부분은 소수점 둘째자리에서 반올림하는 것이었다.
먼저 정답은 아래와 같다.
package ch6;
public class Exercise6_4 {
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;
Student () {}
int getTotal(){
return kor + eng + math;
}
float getAverage(){
return (int) ((getTotal()/3f * 10 + 0.5f)) / 10f;
}
}
getAverage 의 return 값에 대해서 순차적으로 내용 정리를 하면
하나 하나 풀어서 쓰면 알 수 있던 문제였다.
단순히 6-4 계산 값을 반환 타입 String의 메서드 info 에서 써주기만 하면 된다.
package ch6;
public class Excercise6_5 {
public static void main(String args[]) {
Student s = new Student("홍길동",1,1,100,60,76);
System.out.println(s.info());
}
}
class Student {
String name;
int ban;
int no;
int kor;
int eng;
int math;
Student() {}
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;
}
int getTotal(){
return kor + eng + math;
}
float getAverage(){
return (int) ((getTotal()/3f * 10 + 0.5f)) / 10f;
}
String info(){
return name + "," + ban + "," + no + "," + kor + "," + eng + "," + math + "," + getTotal() + "," + getAverage();
}
}
출처 : Java의 정석 3rd Edition 도우출판