String 클래스의 구조
Java에는 문자열을 다루는 String 클래스가 존재하며, String 클래스에는 수많은 메서드가 존재합니다.
Java 프로그램 내에서 "abc"와 같은 리터럴 문자열은 모두 이 클래스의 인스턴스로 실행됩니다.
가장 유명한 메서드는 아마도 문자열 비교에 사용하는 equals 메서드일 것이다. 하지만 String 클래스는 이 외에도 유용한 메서드를 많이 가지고 있습니다.
여기서는 그중에서도 특히 split 메서드에 대해 설명하도록 하겠습니다.
split 메서드
split은 말 그대로 영어로 분할한다는 뜻으로, 그 의미 그대로 문자열을 분할하기 위한 메서드입니다. 사양은 아래와 같습니다.
public String[] split(String regex)
regex가 분할 방법을 나타내는 정규 표현입니다.
정규표현은 통상적인 문자 (a~ z 등)라고 메타캐릭터라고 불리는 특수문자로 구성되는 문자열의 패턴입니다.
예를 들면 [a-zA-Z] 라는 정규표현이 있으면 이것은 대소문자를 포함한 모든 알파벳의 문자위치 문자라고 표현을 합니다.
물론 이런 복잡한 기호가 아니라 단순한 공백이나 쉼표 같은 특정 문자나 기호를 여기에 넣어도 됩니다.
사실 split 메소드가 자주 사용되는 것이 스페이스나 쉼표 등 정해진 기호로 구분된 데이터를 문자열 안에서 가져오는 경우입니다.
그럼 실제로 샘플을 보도록 하죠.
String str = "apple,lemon ,banana ,grape ";
String[] fruit = str.split(",");
그렇다면,
fruit[0] = "apple";
fruit[1] = "lemon";
fruit[2] = "banana";
fruit[3] = "grape";
을 얻을 수 있습니다.
데이터 분할
그런데 split에는 이 외에도 오버로드된, 인수를 취하는 서술 방식이 존재합니다. 사양은 다음과 같습니다.
public String[] split(String regex, int limit)
라고 작성하는 방법이 있습니다.
limit은 분할 횟수를 나타냅니다. 반환값으로는 분할된 문자열의 배열이 반환됩니다.
즉, 지정한 구분 기호로 문자열을 분할한다는 것을 의미합니다.
이 인수는 패턴 적용 횟수, 즉 반환되는 배열의 길이를 제어하는 것입니다.
값이 n(>0)이라면, 이 패턴은 n - 1 이하의 횟수로 적용되며, 배열의 길이는 n 이하가 됩니다.
배열의 마지막 항목에는 마지막으로 일치하는 구분 기호 이후의 모든 입력 시퀀스가 포함됩니다.
단, n이 음수인 경우 이 패턴의 적용 횟수와 배열의 길이는 제한되지 않습니다.
그리고 n이 0인 경우 이 패턴의 적용 횟수와 배열의 길이에 제한이 없습니다. 단, 이후의 빈 문자열은 파기된다는 규칙이 있다.
예를 들어, 다음과 같은 처리가 있었다고 가정해 봅시다.
String str = "apple,,lemon ,banana ,grape,,,";
String[] fruit = str.split(",", 0);
로 되어 있는 경우,
fruit[0] = "apple";
fruit[1] = "";
fruit[2] = "lemon";
fruit[3] = "banana";
fruit[4] = "grape ";
하지만 이것을,
String str = "apple,,lemon ,banana ,grape,,,";
String[] fruit = str.split(",", -1);
라고 하자,
fruit[0] = "apple";
fruit[1] = "";
fruit[2] = "lemon";
fruit[3] = "banana";
fruit[4] = "grape";
fruit[5] = "";
fruit[6] = "";
fruit[7] = "";
와 같은 식이 됩니다.
즉, -1의 경우 맨 끝 위치에 공백만 들어가는 배열 요소는 저장됩니다.
참고로 split에서는 지정한 정규 표현식이 유효하지 않은 경우 PatternSyntaxException이라는 예외가 발생하므로 조건 지정에 주의해야 합니다.
csv 데이터 읽기
이처럼 split은 하나의 문자열을 패턴에 따라 여러 개의 문자열로 분할하는 것인데, 이 처리는 어떤 파일을 읽고 그 형식에 따라 데이터를 읽어야 하는 경우에 매우 유용하게 사용할 수 있습니다.
가장 대표적인 경우가 csv 포맷입니다.
csv 포맷이란?
csv 포맷은 텍스트 형식의 데이터 포맷의 일종으로 가장 널리 쓰이는 데이터 교환용 포맷 중 하나입니다.
csv는 Comma-Separated Values의 약자로, 쉼표로 구분된 값이라는 뜻입니다.
다만 이 포맷은 몇 가지 방언이 있으며, 데이터 사이를 ','가 아닌 반각 공백으로 구분하는 경우도 존재합니다. 또한, 특이하게도 (탭)으로 구분하는 경우도 있습니다. 이를 특히 TSV(Tab-Separated Values)라고 부르는 경우도 있습니다.
하지만 여기서는 어디까지나 가장 전형적인, 으로 구분하는 예시를 살펴보도록 하겠습니다. 실제 CSV 데이터는,
"Family","Name","Birthday","Zipcode","Address","Telephonenumber"
"Yung","Kim","1981/12/3","100-0002","Seoul","02-1234-5678"
"YungGu","Sung","2001/1/4","100-0002","Seoul","02-5454-1212"
와 같은 형태가 됩니다. 또한, 데이터가 숫자만 있는 경우,
10,200,300
30,400,500
와 같이 숫자를, 로 구분하는 것만으로도 충분합니다.
CSV 데이터 만드는 방법
이러한 CSV 데이터는 쉼표로 구분된 단순한 문자열 등의 나열이기 때문에 텍스트 편집기로 쉽게 만들 수 있지만, 엑셀에서도 쉽게 생성 및 편집할 수 있습니다.
엑셀의 셀에 데이터를 입력하고 저장 형식으로 csv 파일을 포맷하면 해당 데이터는 csv 파일로 저장됩니다.
또한, 반대로 저장한 csv 파일을 엑셀로 불러올 수도 있습니다.
Java로 CSV 데이터 불러오기
위의 내용을 바탕으로 실제로 Java로 CSV 데이터를 불러와서 표시하는 프로그램을 만들어 봅시다.
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
public class CSVFileReader {
public static void main( String[] args ) {
try {
BufferedReader br
= new BufferedReader( new FileReader("data.csv") );
// 한 줄 단위로 파일 읽기
String s;
while( (s = br.readLine()) != null ) {
// 읽은 행을 ","로 나누기
String array[] = s.split( "," );
// 내용 출력하기
for(String str : array){
System.out.print(str+" ");
}
System.out.println();
}
br.close();
} catch( IOException e ) {
System.out.println( "입출력 오류 발생" );
}
}
}
그럼 지금부터 프로그램에 대해 설명해 보겠습니다.
먼저,
BufferedReader br = new BufferedReader( new FileReader("data.csv") );
에서 파일을 불러올 준비를 하고 있습니다. 여기서는 "data.csv"라는 파일명을 사용했는데, 이 부분은 적절한 경로와 파일명으로 바꾸어 주시면 됩니다.
이를 바탕으로 파일을 한 줄씩 읽어 들입니다.
while( (s = br.readLine()) != null ) {
부분에서 한 줄씩 파일을 읽어옵니다. 읽기가 끝나면 null이 나오기 때문에 csv 파일의 마지막 줄에 차로 반복됩니다. 읽은 라인의 문자열은 변수 s에 대입됩니다.
그리고,
String array[] = s.split( "," );
에서 s를 쉼표로 여러 개로 구분한다.
예를 들어, 읽은 데이터가 '1,2,3'이라면
array[0] = "1";
array[1] = "2";
array[2] = "3";
라는 값이 들어있는 배열이 생성됩니다. 이렇게 생성된 데이터를 최종적으로 확장 for문을 사용하여 표시하고 있습니다.
이처럼 String 클래스의 split 메서드를 사용하면 쉽게 csv 파일을 불러올 수 있게 됩니다.
정리
String 클래스의 split 메서드는 위와 같이 어떤 파일 포맷을 읽고 거기서 데이터를 추출하고자 할 때 매우 유용합니다.
현재 원래 Java는 XML 파일도, json 파일도 읽을 수 있는 API를 가지고 있지만, 프로그래밍을 배우는 초기에는 연습 삼아 직접 이러한 포맷을 해석하여 파일을 읽어오는 프로그램을 만들어 보는 것도 좋을 것입니다.
[Java 입문] 배열과 초기화에 대하여
배열의 선언과 초기화 Java 언어뿐만 아니라 모든 언어에서 프로그래밍을 할 때 반드시 변수를 사용하게 됩니다. 대부분의 경우 변수는 선언과 초기화가 필요합니다. 선언은 어떤 변수를 앞으로
pgmovestep.tistory.com