언어/Java

[Java의 정석/연습문제 6장] 오답 정리

닥스훈스 2019. 2. 8. 01:15

[6-5]

info()메서드는 내가 작성한 코드와는 다르게 다음과 같이 풀이되어 있었다.

public String info(){
		return name
				+","+ban
				+","+no
				+","+kor
				+","+eng
				+","+math
				+","+getTotal()
				+","+getAverage()
				;
//		System.out.println(name+","+ban+","+no+","+kor+","+eng+","+math); //내가 작성한 코드
	}

즉 책에서는 String메서드를 정의하여 return값을 주었지만, 나는 return값이 없는 void info()를 정의하여 화면에 출력되도록 작성하였는데 이렇게 되면 main함수의 System.out.println(s.info())가 에러값이 뜨게 된다.

나는 String메서드를 사용할 생각을 하지 못한것이다. 위 메서드로 작성하면 다음과 같은 결과를 출력할 수 있다.



[6-9]

메서드에서 어떤것에 static을 붙여야할까?

메서드는 어떠한 작업을 하는 것으로 인스턴스변수를 사용하면 인스턴트 메서드로, 그렇지 않으면 static메서드로 하면 된다. 

여기서 메서드 weaponUp()과 armorUp()은 각각 statc변수 weapon과 armor를 가지고 작업을 하기 때문에 static을 붙이는것이 맞다.

반면 메서드 move(int x, int y)는 인스턴스변수 x와 y를 가지고 작업하기 때문에 staitc을 붙여서는 안된다.



[6-10]

생성자에 대한 설명으로 옳지 않은 것을 고르는 문제이다.

a.모든 생성자의 이름은 클래스의 이름과 동일해야 한다.

b.생성자는 객체를 생성하기 위한 것이다. new연산자

→생성자는 객체를 초기화할 목적으로 사용되는 것으로 여기서 생성자의 정의에 대해 주목할 필요가 있다.

※책에 나온 생성자의 정의: '인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드이다.'

객체를 생성하는 것은 생성자가 아닌 new연산자이다.

c. 클래스에는 생성자가 반드시 하나 이상 있어야 한다.

d. 생성자가 없는 클래스는 컴파일러가 기본 생성자를 추가한다.

e. 생성자는 오버로딩 할 수 없다. 있다

→오버로딩이란? 한 클래스내에 같은 이름의 메서드를 여러개 정의하는 것이다. 오버로딩이 가능하기 때문에 하나의 클래스에 여러 생성자를 정의할 수 있다.



[6-19]

나는 change()메서드의 매개변수가 참조형이기 때문에 기존str값이 변할거라고 생각을 하였다.

하지만, change()메서드에서 넘겨받은 문자열에 "456"을 붙이게 되면, 문자열은 내용을 변경할 수 없기 때문에 새로운 문자열이 생성되고, 새로운 문자열의 주소가 변수str에 저장된다.

이렇게 change()메서드가 종료되면 change()메서드의 지역변수인 str도 제거되고, main메서드로 돌아와서 str을 출력하면 처음의 값과 변함없게 된다.



[6-20]

나는 유효성검사를 넣지 않았는데, 매개변수로 어떤 값이 넘어올지 모르기 때문에 유효성검사를 해주어야 한다.

public class Exercise6_20 {
	
	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()*9); //0부터 8사이의 수
			int tmp=arr[i]; //arr[i]와 arr[j]의 자리를 바꾼다.그러면 이 배열에 있는 수안에서 어떤 범위를 벗어나지 않고 셔플이 가능하다.
			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));

	}	

}


[6-22]

주어진 문자열이 모두 숫자로만 이루어져있는지 확인하는 메서드를 작성하는 문제이다.

나는 문자열에 숫자가 포함되어 있는지 판단하는 로직을 어떻게 구현해야할지에 대해 많은 시간동안 고민을 해보았다.

charAt()메서드를 사용해 각각의 문자열 하나하나를 판단해야 겠다는 생각은 들었지만, 그 다음 과정을 해결해나가는 과정이 생각이 나질 않았다. 

해설지에는 (str.charAt(i)<'0'||str.charAt(i)>'9')으로 해당 문자가 숫자가 아닐 경우 false를 반환하도록 하였다.

※여기서 다른 해결책으로 isStringDouble()를 사용하여 파라미터(인수)로 받은 문자열이, 정수/실수로 변환될 수 있는지 여부를 확인 할 수 있다. 예는 다음과 같다.

public class Exercise6_22 { //isStringDouble() 예제
	  public static void main(String[] args) {

		    String str = "123abcdefg";
		    if (isStringDouble(str))
		      System.out.println("숫자입니다.");
		    else
		      System.out.println("숫자가 아닙니다.");

		  }

		  public static boolean isStringDouble(String s) {
		    try {
		        Double.parseDouble(s);
		        return true;
		    } catch (NumberFormatException e) {
		        return false;
		    }
		  }
		}


[6-24]

내장함수 Math.abs()를 사용해서 구할 수 있지만 삼항연산자를 사용하여 코드를 얻을 수 있다.

	static int abs(int value) {
//		return Math.abs(value);
		return value >= 0 ? value : -value;
	}



연습문제를 풀고 느낀점

객체지향 파트는 한번 훑는것으로 지식이 완벽하게 내것이 되기는 힘든것 같다. 복습을 거듭하고 더 다양한 문제에 접근해보면서 최종적으로는 내것으로 만들어야 겠다는 생각이 들었다. 생각보다 오답이 많았고 풀이를 하면서 시간이 많이 들었는데 정리하면서 몰랐던 부분도 되새길수 있었다. 다음 객체지향II에서는 어떤 공부를 하게 될지 기대가 된다.(^^)