작성
·
127
·
수정됨
0
import java.util.*;
class IO {
int Count;
String[] memName= new String[this.Count];
int[] memAge = new int[this.Count];
int[] memReport = new int[this.Count];
IO() {
}
void howMany(){
Scanner sc = new Scanner(System.in);
System.out.print("참가 인원 수: ");
int Count = sc.nextInt();
this.Count= Count;
}
void memStoring(){
Scanner sc = new Scanner(System.in);
System.out.println("정보를 입력하시오. (순서) 이름 나이 성적");
for(int i =0; i<this.Count; i++){
this.memName[i] = sc.next();
this.memAge[i] = sc.nextInt();
this.memReport[i] = sc.nextInt();
}
for(int i =0; i<this.Count; i++){
System.out.printf("이름:%s 나이:%d 성적:%d %n", this.memName[i], this.memAge[i], this.memReport[i]);
}
}
void memRank(){
System.out.print(this.memAge[1]);
}
}
public class ClassTwo {
public static void main(String[] args){
IO io1 = new IO();
io1.whatMany();
io1.memStoring();
io1.memRank();
}
}
구상하려는 목적은, IO 클래스를 통해 시험 성적 랭크를 만들어 표현하는 코드를 만들기 위해 작성 중입니다.
howMany 메소드를 통해 무언가의 시험 참가 인원수를 받음
Scanner를 사용하여 memStoring 메소드로 배열을 저장
memRank에서 높은 성적순으로 3명만 표현 (아직 미구현, 다만 this를 사용하여 문제없이 저장된 배열 출력 가능 확인)
다만, 위 코드를 작동하면 [ Index 0 out of bounds for length 0 ]와 같은 오류가 발생합니다.
오류의 원인은 class io의 필드 변수 중 배열의 매개변수에 howMany에서 입력한 값이 저장되지 않은 것..
실제, class io의 필드 변수 Count에 3을 직접 저장시키니 정상적으로 작동하는 것을 확인 했습니다.
질문1.
class io의 필드 변수 Count에 직접 값을 저장하는 것이 아닌 howMany에서 입력한 값으로 필드에 있는 배열 매개변수에 저장하도록 하는 방법이 있을지 문의 드립니다.
질문2.
제가 작성한 코드의 잘못된 점이 있다면 마구마구 집어 주시면 감사하겠습니다.
아직 초보라 잘 부탁드립니다!
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
jungmin Lee님의 문제에 대해 답변드립니다.
문제는 IO
클래스에서 배열의 크기를 초기화하는 시점에 있습니다. IO
클래스의 생성자에서 Count
변수는 0으로 초기화되며, 이 시점에서 memName
, memAge
, memReport
배열도 Count
값인 0으로 크기가 정해집니다. howMany
메소드에서 Count
값을 변경하더라도, 이미 생성된 배열의 크기는 변경되지 않습니다. 즉, 배열의 크기가 0에서 변경되지 않아서 발생하는 문제입니다.
질문1에 대한 답변:
IO
클래스의 배열 크기를 동적으로 할당하려면, 배열을 초기화하는 시점을 howMany
메소드 내부, 즉 Count
값을 입력받은 직후로 변경해야 합니다. 예를 들어, howMany
메소드 내에서 Count
값을 설정한 후 즉시 배열을 초기화하는 코드를 추가합니다.
void howMany(){
Scanner sc = new Scanner(System.in);
System.out.print("참가 인원 수: ");
this.Count = sc.nextInt();
this.memName = new String[this.Count];
this.memAge = new int[this.Count];
this.memReport = new int[this.Count];
}
질문2에 대한 답변:
위 코드 외에도, 메인 클래스에서 IO
객체의 whatMany
메소드를 호출하려고 하셨는데, 클래스 내에 정의된 메소드 이름은 howMany
입니다. 메인 클래스에서 메소드 호출 부분을 io1.howMany();
로 변경해야 합니다.
추가적으로, memRank
메소드에서 랭킹을 구현하기 위해서는 성적 데이터를 기준으로 정렬하는 로직이 필요합니다. 배열을 정렬하고 상위 N개의 데이터를 추출하는 코드를 추가하면 원하는 기능을 구현할 수 있습니다. 랭킹 구현은 다소 복잡할 수 있기 때문에 기본적인 정렬 알고리즘을 학습하거나, 자바에서 제공하는 정렬 기능을 사용해 보시는 것을 권장드립니다.
이 정보가 jungmin Lee님의 문제 해결에 도움이 되길 바랍니다!