본문 바로가기
수업 일지/JAVA

18일차 - [JAVA] StringTokenizer 클래스/split()/asList()

by 쿠쿠씨 2022. 1. 24.
반응형

 

연습 문제 : StudentScoreTest

 

StudentScore 클래스

4~8라인 필드 num, name, korean, english, science를 선언한다.

10~14라인 커스텀 생성자를 선언한다.

27~29라인 toString 메소드를 재정의한다.

31~35라인 합계를 구하는 sum 메소드, 평균을 구하는 avg 메소드를 선언한다.

37~53라인 필드의 getter, setter 메소드를 선언한다.

 

StudentScoreTest 클래스

11라인 객체를 저장할 배열 stus를 선언하고 길이를 10으로 한다.

13라인 난수의 최대값을 100, 최소값을 10으로 선언한다.

20라인 학생 인원수 num에 Integer.parseInt(sc.nextLine())로 입력받은 정수를 저장한다.

21~24라인 1~10이 아닌 수를 입력 했을 경우 다시 입력하도록 한다.

29~30라인 커스텀 생성자로 StudentScore 객체를 생성하여 stus 배열에 저장한다.

34라인 학생의 이름을 입력받아 stus 배열 내 객체의 name 필드 값을 저장한다.

38라인 DecimalFormat 클래스로 숫자 형식을 지정한다.

39라인 향상된 for문으로 stus 배열의 필드 값들을 출력한다.

41라인 배열 값이 null이 아니면 출력한다. if(score==null) break; 가능

49라인 총점이 가장 높은 학생을 구하기위해 stus 배열의 0번 인덱스의 총점을 max_sum으로 설정한다.

51라인 총점 최대값의 인덱스 max_idx를 0으로 초기화한다.

52~55라인 각 인덱스 값과 순서대로 비교하여 큰 값을 max_sum으로 하고 i값을 max_idx로 한다.

 

결과

 

StudentScoreTest2 클래스 : 배열을 ArrayList로 변경

 

39라인 ArrayList는 데이터에 따라 길이가 변하기 때문에 'null이 아닐 경우' 조건이 필요 없다.

 

 

StringTokenizer 클래스

 

java.util에 포함되어 있는 클래스이다.

하나의 문자열을 여러 개의 토큰으로 분리한다.

StringTokenizer(문자열): 공백, 탭(\t), 줄 바꿈(\n)으로 구분하여 토큰을 만든다.

StringTokenizer(문자열, 구분자) 구분자로 토큰을 만든다.

여러 개의 구분자로 토큰을 만들 수 있다. ex) StringTokenizer(String,":][") →  : ] [로 구분

결과 값이 문자열이다.

StudentScore 클래스 커스텀 생성자를 생성한다.

14라인 문자열 temp를 선언한다.

15라인 temp를 공백을 기준으로 토큰화 한다.

17~19라인 while문과 hasMoreToken 메소드로 다음 토큰이 있다면 출력한다.

 hasMoreToken(): 남아있는 토큰이 있으면 true, 없으면 false 반환.

 nextToken(): 객체에서 다음 토큰을 반환

25~29라인 나눈 토큰들을 SudentScore 객체로 만든다. 

38라인 ArrayList 클래스로 변수 stuList를 선언한다

39라인 while문과 hasMoreToken 메소드로 더 이상 토큰이 없을 때까지 반복한다.

41~44라인 4개씩 토큰을 만들어서 객체에 저장한다.

46라인 만든 객체를 stuList에 저장한다.

 

String 클래스 - split 메소드

 

String 클래스에 속해있는 메소드이다.

정규 표현식으로 구분한다.

빈 문자열을 토큰으로 인식한다.

결과 값이 문자열 배열(String [])이다.

 

9라인 temp를 공백으로 구분한 값을 String 배열 result에 저장한다.

11~14라인 result의 항목들을 출력한다.

19,20라인 temp를 쉼표로 구분한 값을 result에 저장한다.

25,26라인 temp를 -로 구분한 값을 result에 저장한다.

28라인 배열 result의 크기는 4이다.

 

 

파일 입/출력, StringTokenizer, split 예제 : MyDictionaryApp

 

Word 클래스

7,8라인 String 필드 english, List <String> 필드 koreans를 선언한다.

11~16라인 커스텀 생성자를 선언한다.

19~20라인 toString 메소드를 재정의한다.

22~28라인 getter, setter 메소드를 선언한다.

 

MyDictionaryApp 클래스

15라인 ArrayList 클래스로 변수 mywords를 선언한다.

18라인 종료 조건 변수 run을 true로 선언한다.

23라인 변수 filename에 파일의 경로를 저장한다.

24라인 입력받은 sel값에 해당하는 기능을 사용하기 위해 switch문을 사용한다.

25~27라인 문자열 "1"을 입력받으면 단어 저장 메소드 wordAdd를 실행한다.

28~30라인 문자열 "2"를 입력받으면 단어장 출력 메소드 wordList를 실행한다.

31~33라인 문자열 "3"을 입력받으면 파일 출력(저장) 메소드 wordSave를 실행한다.

34~36라인 문자열 "4"를 입력받으면 파일 입력(불러오기) 메소드 wordRead를 실행한다.

37~39라인 문자열 "5"를 입력받으면 run을 false로 하여 프로그램을 종료한다..

40~42라인 1~5 외의 문자를 입력 받으면 오류 메시지를 출력한다.

 

wordAdd 메소드

52~55라인 영어를 입력받아 eng, 한글 뜻을 입력받아 kor에 저장한다.

57라인 List 변수 koreans 를 선언한다.

58라인 변수 index를 -1로 선언한다.

59~60라인 mywords의 인덱스의 값을 w에 저장하고 for문으로 if문의 내용을 검사한다.

61라인 w의 english 필드 값에 입력받은 eng가 있다면(단어장에 있는 단어라면)

62라인 index에 i를 저장한다.

63라인 이미 존재하는 리스트 객체(저장된 한글 뜻)를 가져와서 koreans 변수가 참조한다.

64라인 새로 입력 받은 뜻 kor을 추가하고 break으로 for문을 종료한다.

68라인 index가 -1이라면(eng가 단어장에 없다면)

69라인 ArrayList를 생성하고 koreans에 저장한다.

70라인 koreans에 kor을 추가한다.

71라인 Word 객체를 생성하여 mywords에 추가한다.

74라인 y를 입력받으면 반복하고 다른 문자열을 입력받으면 do-while문을 종료한다.

 

wordList, wordSave 메소드

79~81라인 향상된 for문으로 mywords에 저장된 객체를 w에 저장하고 출력한다.

86라인 File 객체를 생성하고 변수 file에 참조시킨다..

89라인 PrintWriter 객체를 생성하고 변수 pw에 참조시킨다.

90,91라인 mywords에 저장된 값을 파일로 출력한다.  

93라인 close 메소드로 파일 작업을 종료한다.

95,96라인 경로를 잘못 지정하여 FileNotFoundException 오류가 발생할 경우 출력문을 출력한다.

 

wordRead 메소드

101라인 File 객체를 생성하고 변수 file에 참조시킨다.

104라인 Scanner 객체를 생성하고 변수 fsc에 참조시킨다.

106라인 while문과 hasNext 메소드로 다음 라인이 없을 때까지 while문을 반복한다.

108라인 StringTokenizer 객체를 생성하고 파일에서 1라인씩 읽어오고 ": [ ]"을 구분자로 하여 토큰화한다.

109라인 더 이상 토큰이 없을 때까지 while문을 반복한다.

111라인 첫 번째 토큰을 Word 객체 english 필드에 저장한다.

112라인 두 번째 토큰을 쉼표로 구분하여 배열에 저장하고 Arrays.asList 메소드로 List로 변환시켜 kor에 저장한다.

 Arrays.asList(배열) : 배열을 List로 변환한다. 고정 길이 List 

113라인 kor을 w 객체 koreans 필드값으로 참조한다.

114라인 mywords에 w 객체를 추가한다.

 

결과

 

Arrays.asList() 메소드

 

36~39라인 List 객체를 생성하고 result 배열의 항목을 추가한다.(배열에서 리스트로 직접 변환, 가변 길이 리스트)

44라인 list에 Arrays.asList 메소드로 result 배열을 List로 변환한다. (고정 길이 리스트)

47,48라인 Arrays.asList 메소드로 생성된 List는 새로운 데이터 추가/삭제가 불가능하다.

50라인 새로운 List 객체를 만들어 인자에 list를 넣는다. (인자는 Collection 타입)

51라인 배열은 Collection 타입이 아니므로 인자에 넣을 수 없다.

52라인 list에 새로운 데이터를 추가할 수 있다. (가변 길이 리스트)

55라인 Collection 인터페이스의 하위 구조로는 List, Set 인터페이스가 있다.

반응형

댓글