전체코드
int[] answers =new int[]{1,2,3,4,5};
int[] supo1 = {1,2,3,4,5};
int[] supo2 = {2,1,2,3,2,4,2,5};
int[] supo3 = {3,3,1,1,2,2,4,4,5,5};
List<Integer> correctList = new ArrayList<>();
for(int i=1; i <= 3; i++){
correctList.add(0);
}
for(int i=0; i<answers.length; i++){
if(answers[i] == supo1[i%5]){
correctList.set(0, correctList.get(0)+1);
}
if(answers[i] == supo2[i%8]){
correctList.set(1, correctList.get(1)+1);
}
if(answers[i] == supo3[i%10]){
correctList.set(2, correctList.get(2)+1);
}
}
Integer max = Collections.max(correctList);
System.out.println(max);
List<Integer> returnList = new ArrayList<>();
for(int i=1; i<= correctList.size(); i++){
if(max == correctList.get(i-1)){
returnList.add(i);
}
}
int[] answer = new int[returnList.size()];
for(int i=0; i< returnList.size(); i++){
answer[i] = returnList.get(i);
}
System.out.println(Arrays.toString(answer));
10,11,12 테스트 코드 에러
- Collections. max(correctList) 의 타입을 Integer로 하니 10,11,12 부분에서 에러가 발생 하였습니다.
문제점
- Integer 객체 간 비교에 >.< 같은 비교 연산자는 사용이 가능하지만, 동등 연산자인 (==) 경우에는 Integer 객체의 주소값을 비교 하게 되어 문제가 발생하였습니다.
- Integer 객체 간 값 비교를 할때는 equals() 메서드를 사용해야 합니다.
문제 해결 방법
Sol 1
- eqauls 메서드를 사용하지 않고, == 연산자를 사용했음에도 불구하고 3개를 제외한 테스트는 통과하였습니다.
Integer에는 -128 ~ 127 까지는 캐시를 이용하여 자동으로 같은 주소를 참조하게 하는 IntegerCache라는 클래스가 선언 되어 있습니다.
- 예를들어 Integer a = 100; , Integer b = 100; 으로 초기화한다면 IntegerCache로 인해 b변수를 선언하고 초기화 할 때 -128 ~ 127 사이의 수 중 이미 존재하는 객체가 있는지 확인하고 있을 경우 그 객체에 b를 연결만 시켜줌을 통해 같은 값을 지닌 중복 객체 생성을 생략합니다.
- 즉 100에 대한 객체는 이미 a를 초기화할때 생겼으므로 b는 a와 같은 객체를 참조하기만 하면 됩니다.결과적으로 a와 b는 같은 객체를 참조해 객체의 값 100과 객체의 주소값을 모두 공유하게 됩니다.
- 그래서 이 같은 경우에는 객체의 값을 비교하는 equals메서드와 객체의 주소값을 비교하는 == 동등연산자가 같은 결과를 반환하게 됩니다.
Sol 2
- 예를 들어 Integer a = 128; Integer b =128; 일 경우에는 a를 초기화할 때 분명히 128값의 객체를 생성했음에도 불구하고 128이 IntegerCache의 범위 밖이여서 b를 초기화 할때는 새로운 128값의 객체를 또 만들게 됩니다.
- 이 경우에는 a와 b가 참조하는 객체들의 값은 128 로 같지만, 참조하고 있는 객체 자체는 달라서 a와 b는 그저 같은 값을 가진 서로 다른 객체이므로 equals 메서드를 사용해야 합니다.
Sol 3
- 각 패턴별 정답회수가 127 이하인 경우에는 IntegerCache를 통해 같은 주소값을 고융해 == 동등연산자로 비교해도 equals 메서드와 같은결과를 얻었지만, 패턴별 정답횟수가 128 이상인 경우는 IntegerCache의 영향을 받지 않아 같은 정답횟수를 자겨도 == 동등연산자로 비교하면 equals 메서드와 다른 결과를 얻어 문제가 발생하였습니다.
int max = Collections.max(correctList);
- 위와 같이 바꿔준다면 모든 테스트가 통과 됩니다.