Frudy
7k
2019-06-25 17:18:22
11
701

split할 때 어떤결과를 기대하시나요?


개발자가 기대하지 않은 결과 = 버그라고 생각하는대요,


String test = " a b c d ";

System.out.println(Arrays.toString(test.split(" "))); 하면


Java의 String클래스의 split() 결과는

" ", "a", "b", "c", "d"가 나와요.

첫 공백은 나오는데 마지막 공백은 포함이 안되요.


어쨌든 Java만든 Oracle회사에서는

첫번째 공백이 나오고 마지막 공백이 안나오는 저 결과를 기대했으니까 저렇게 만든거같은대..

이유가 있나요?


전 아무리생각해도..

" a b c d "를 공백으로 split한다고 하면,


개발자는 " ", "a", "b", "c", "d", " "이렇게 앞뒤공백까지 다 나오던가,

아니면 "a" "b" "c" "d" 이렇게 앞뒤공백 아예 다 안나오던가,


둘중 하나의 상황을 기대하면 기대했지,

앞공백만 나오고 뒷공백이 안나오는 상황을 기대하는건 좀 이상하다고생각해요.


대략 이런 메소드를 두개 만들었는대요,


구분자의 종류를 넣으면, 

1. 실제로 사용된 구분자의 순서대로 저장된 리스트 반환하는거랑,

2. 구분자의 종류대로 split해서 리스트로 반환하는거랑 2개를 만들었는대..


split()결과에서 empty string을 어떻게 해야할지 모르겠어요.

개발자가 원하는 split()결과대로 만들어줄수는있는대 뭘 원하는지...

0
  • 답변 11

  • 자라선
    1k
    2019-06-25 17:26:37

    답변은 안되는데.. 

    "Java만든 Oracle회사에서는"  라는 의미는 Oracle JDK 를 말씀하시는건가요?

  • Frudy
    7k
    2019-06-25 17:29:22

    Java를 만든 회사가 오라클 아닌가요?

    그럼 String클래스의 split()메소드도 오라클에서 만든거라고 생각했...었어요

  • 자라선
    1k
    2019-06-25 17:39:46 작성 2019-06-25 17:40:47 수정됨

    @Frudy  

    Sun사에서 개발했고 Oracle이 인수한걸로 알고 있어요

    그래서 OpenJDK 와 OralceJDK로 나뉜거고 

    한때 Oracle 이 자바 유료화 선언해서 자바 망한다 어쩌니 이슈 됬었죠 ㅋㅋ..

  • Frudy
    7k
    2019-06-25 17:46:11 작성 2019-06-25 17:46:25 수정됨

    자라선 아~ 맞네요..들은기억이있어요.

    제가쓰는 jdk 버전은 8이에요.

    이게 오라클에서 만든건지 sun에서 만든건지는 관심이 없지만...


    아무튼 split의 어떤 결과를 개발자가 기대해야하는지 모르겠네요잉..

  • 초코쪼꼬
    6k
    2019-06-25 17:47:32

    정규식을 쓰면 될 문제 같은데...

  • LichKing
    16k
    2019-06-25 17:54:19 작성 2019-06-25 18:01:24 수정됨

    split을 할때 내부적으로 substring을 사용해서 문자열을 자릅니다. 정확히 표현하면 subsequence 메서드인데.. 둘이 같으니 좀 더 친숙한 substring으로 얘기하면..

    제일처음에 0부터 시작하고요.

    예제로 들어주신 " a b c d e " 같은경우 생각해보면

    초기인덱스 0. 그리고 처음으로 " " 조건에 걸리는 인덱스가 들어갑니다. 제일 처음이 " "니까 얘가 걸리겠죠?

    그럼 substring(0, 0)이 됩니다. 그럼 0은 조건에 걸린애니까 그 다음 이걸 건너뛰고 1부터 다시 찾습니다. 그럼 다음 " "이 2가 되겠죠. 그래서 substring(1, 2) 를 사용합니다. 그 다음 substring(3, 4)... 이런순으로 진행됩니다.

    쉽게 표현해서 조건으로 다 자르고 자른거 앞에 문자가져온다고 생각하심됩니다. 그럼 젤 처음엔 아무것도 없으니 빈문자열이 들어오겠죠.

  • rvo
    102
    2019-06-25 18:23:18

    마지막 공백 문자열들도 포함하고 싶으시면 String.split(" ", -1) 하시면 됩니다.

    이와 같은 행동을 한다고 자바 API 문서에 나와 있습니다.

    limit 값이 0과 음수일 때를 한번 더 나눠놓은게 오히려 API를 설계할 때 고민을 많이하고 만들었다는 생각이 드네네요. 생각할수록 괜찮은 방법 같기도 합니다.

    다른 언어도 궁금해서 go의 strings.SplitN 함수를 보니 limit이 양수일땐 같은 동작을 하지만 음수나 0일땐 자바와 동작이 다르네요. 언어 차이인듯

  • Frudy
    7k
    2019-06-25 20:31:23 작성 2019-06-25 20:33:19 수정됨

    LichKing rvo

    제가 질문을 이상하게 했나보네요.. 부족한 글솜씨에 시간을 낭비하게하여 죄송함니다..


    음..저도 실제 소스 까보면서 첫, 마지막 구분자(예제는 공백)를

    포함할지 안할지는 구현할 수 있습니다.


    제가 궁금한건, 어떤 언어든 간에 split()을 했을 때 개발자는 어떤 결과를 기대하는지 궁금했어요.

    1. 구분자(예제는 공백)가 앞뒤로 빈문자열이 포함되는 결과를 기대하는지,

    2. 앞만 포함되는걸 기대하는지,

    3. 뒤만 포함되는걸 기대하는지,

    4. 아예 앞뒤로 포함되지 않는 결과를 기대하는지요.


    Java는 2번으로 작동되지만, 다른분들은 어떤결과를 기대하는지 궁금합니다.

    split이 어떻게 작동되는게 이상적인가요?

  • Frudy
    7k
    2019-06-25 20:33:11

    혹시 부족한 글솜씨에 대해 지적해주신다면 감사히 받겠습니다.

  • rvo
    102
    2019-06-25 23:25:39

    함수 Split: LIMIT ↦ ARRAY: N → ℙ(N⨯String)는 의미적으로 잘 정의되었지만 이 함수의 정의역을 Z로 확장함에 있어 이상적이라고 부를 만한 함수가 있을까요. 이상적이라는 말이 정의되지 않은 것 같습니다.

    제가 이해를 잘못해서 자바는 왜 Split(String _) = Split(String _, 0) 으로 해논 이유에 대해 물어보시는거면...

  • Frudy
    7k
    2019-06-26 04:38:44

    음... 나중에 다시한번 생각해보겠습니다.

    뭔가 단순하게만 생각했다보니

    지금 해결할 수 없는고민이네요.


    도움주셔서 감사합니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.