• 로그인 함 해보끄나?

  • Sarangnamu.net June 17, 2003
    Home Login Profile Study Open Project Q&A Google Code
    C++ 프로그래머 Java 맛보기 #24
    Last Modify : 13 January, 2011(01:12)

    문자열의 경우는 문자열 중간 중간에 데이터를 따로 가져와야하는 경우들이 존재한다. 가령

     

    String anotherPalindrome = "Niagara. O roar again!"; 
    char aChar = anotherPalindrome.charAt(9);

     

    와 같은 코드가 존재했다고 했을 때 어떤 결과를 얻게 되는 것일 까? String 내의 9번째 데이터 인 O를 char aChar 에 넣을 수 있게 된다. 문자열에 대한 메모리 구조는

     

     

    처럼 선형 구조이기 때문에 가능한 일이며  c++ 에 anotherPalindrome[9] 와 동일하게 작동하게 된다.

     

    만약 필요한 문자열 만을 얻기 위해서는 substring 을 이용하면 된다. 인자는 시작점과 끝 점을 지정해서 사용한다.

     

    String anotherPalindrome = "Niagara. O roar again!"; 
    String roar = anotherPalindrome.substring(11, 15);

     

     

    먼저 문자열의 치환, 검색, 추출등의 기능에 메소드를 보도록 하자.

     

    split : 정규표현식을 이용하여 문자열을 잘라 배열로 리턴한다. 비슷한 역활을 하는 클래스로 StringTokenizer 가 있다.

     

    subSequence : substring 과 동일한 역활을 하지만 CharSequence 인터페이스를 구현할 수 있다.

     

    trim :  문자열의 앞뒤 공백을 제거 한다.

     

    toLowerCase : 소문자로 변경한다.

     

    toUpperCase : 대문자로 변경한다.

     

    indexOf : 원하는 문자에 처음부터 검색해서 위치를 리턴한다.

     

    lastIndexOf : 원하는 문자를 뒤에서 부터 검색해서 위치를 리턴한다.

     

    contains : 문자열 내에 지정한 문자열이 존재하는지 (find?) 알려준다.

     

    replace : 문자를 치환한다.

     

    replaceAll : 정규식을 이용하여 문자열을 치환한다.

     

    등이 존재한다.

     

     

    위의 예제를 참조해서 간단한 문자열 관련 예제를 하나 보도록 하겠다. 주 내용은 lastIndexOf 와 substring 을 이용한 문자열 파싱이다.

    public class Filename {
        private String fullPath;
        private char pathSeparator, extensionSeparator;

        public Filename(String str, char sep, char ext) {
            fullPath = str;
            pathSeparator = sep;
            extensionSeparator = ext;
        }

        public String extension() {
            int dot = fullPath.lastIndexOf(extensionSeparator);
            return fullPath.substring(dot + 1);
        }

        public String filename() {  // gets filename without extension
            int dot = fullPath.lastIndexOf(extensionSeparator);
            int sep = fullPath.lastIndexOf(pathSeparator);
            return fullPath.substring(sep + 1, dot);
        }

        public String path() {
            int sep = fullPath.lastIndexOf(pathSeparator);
            return fullPath.substring(0, sep);
        }
    }

     

    Filename 클래스는 파일 경로를 입력 받은 후 file extension/filename/path 를 얻을 수 있는 클래스이다.


    public class FilenameDemo {
        public static void main(String[] args) {
            final String FPATH = "/home/mem/index.html";
            Filename myHomePage = new Filename(FPATH, '/', '.');
            System.out.println("Extension = " + myHomePage.extension());
            System.out.println("Filename = " + myHomePage.filename());
            System.out.println("Path = " + myHomePage.path());
        }
    }

     

     

    FilenameDemo 의 데모를 실행시키면 아래와 같은 결과를 얻을 수 있다.

    Extension = html
    Filename = index
    Path = /home/mem

     

     

    위의 예제는 c++ 에 string 에 rfind, substr 을 이용해 동일하게 생성할 수 있다. (같은 개념이기 때문에 자세한 설명을 하지 않겠다.)

     

     

    c++ 에서는 문자열 비교를 위해 주로 strcmp 또는 stl 일 경우 == operator 를 이용해 비교를 해왔다. java에서는 아래의 메소드를 이용해서 주로 비교를 하는 듯하고 메소들에 대해서 간단하게 설명을 하도록 한다.


    boolean endsWith(String suffix) : 문자열이 지정된 접미말로 끝나는지 체크

     

    boolean startsWith(String prefix) : 문자열이 지정한 접두사로 시작되는지 체크

     

    int compareTo(String anotherString) : 문자열이 동일한지를 비교하는 메소드로 equals 와 동일하지만 리턴값이 참일 때 0을 리턴하게 된다.

     

    boolean equals(Object anObject) : 문자열이 동일인지 비교하고 참일 대 true를 리턴한다.

     

    boolean equalsIgnoreCase(String anotherString) : 대/소문자 구분없는 equals 이다.

     

    boolean regionMatches(int toffset, String other, int ooffset, int len) : 문자열 내에 특정 영역을 지정 후 문자열을 비교한다.

     

    boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) : 위와 동일하지만 대/소문자 구분없이 한다.

     

    boolean matches(String regex) : 입력한 정규식에 해당하는지 체크

     

    위의 내용 중 regionMatches 활용 예제를 보도록 하겠다.

     

    public class RegionMatchesDemo {
     public static void main(String[] args) {
      String searchMe = "Green Eggs and Ham";
      String findMe = "Eggs";
      int searchMeLength = searchMe.length();
      int findMeLength = findMe.length();
      boolean foundIt = false;
      for (int i = 0; i <= (searchMeLength - findMeLength); i++) {
         if (searchMe.regionMatches(i, findMe, 0, findMeLength)) {
            foundIt = true;
            System.out.println(searchMe.substring(i, i + findMeLength));
            break; 
         }
      }
      if (!foundIt) System.out.println("No match found.");
     }
    }

     

    참고로 regionMatches 에서 인자에 대해서 설명하자면

    1. searchMe 에 offset find
    2. 비교할 string
    3. 2 에 offset
    4. 비교할 string 에 length

    이다.

     

    ps.

    문자열에서 가장 많이 사용하는 str.Format or sprintf 와 같은 걸 java에서 하기 위해선 다음 같이 해야 된다.

     

    String v;
    v = String.format("test %d %s", 1, "Hello");
    System.out.println(v);

     

    여기서 format 은 static 형태이다.


    Comment


    입력하3 1498429511



    Locations of visitors to this page