문자열의 줄 수를 구하는 코드

프로그래밍 2007.09.04 03:18
  제가 필요해서 만들어 본 짧막한 자바코드 입니다.

  지금 만들고 있는 게시판에 필요해서 짜 본 코드이거든요. 이 짧막한 코드가 하는 일은 아주 간단합니다. 파라메터로 문자열을 넣어주면 그 문자열이 몇 줄 짜리인지를 알아내서 int형으로 리턴해줍니다.


public class Utility{
    public static int getLineNum(String content){
        int linenum = 0;
        int point = 0;
        int endcheck = content.lastIndexOf ('\n');
        while(true){
            point = content.indexOf('\n', point);
            linenum++;
            if(endcheck == point++) break;
        }
        return linenum;
    }
}

  필요한 곳에서 Utility.getLineNum(str); 요론 식으로 사용하기 위해서 정적 메소드로 선언해 두었습니다. 객체를 생성해서 사용 할 필요까지는 없어서요. 필요한 것은 저 메소드 하나이기 때문에...

  코드는 매우 간단합니다.

  • endcheck변수에 문자열의 마지막 줄바꿈의 인덱스번호를 넣어둡니다.
  • 루프 속에서 point변수에 문자열의 앞 부분부터 줄바꿈의 위치를 찾아갑니다.
  • 줄바꿈을 한 개 찾을 때 마다 linenum변수에 찾은 개수를 늘려갑니다.
  • if문에선 지금 찾아낸 줄바꿈의 인덱스와 마지막 줄바꿈의 인덱스를 가지고 있는 endcheck와 비교를 합니다.
  • 지금 찾은 인덱스가 마지막 인덱스와 같다면 break;
  • 마지막으로 linenum을 리턴하게 되는데, linenum은 줄바꿈이 없을 때 1, 1번 줄 바꿈이 있을 때 2를.. 이런 방식으로 문자열의 줄 수를 리턴하게 됩니다.

  if문 안에서 point++을 하기 싫다면 다음 라인에 point를 증가시키는 코드를 추가 해 줘야 합니다.

  증가시켜 주지 않는다면 point는 계속 한 곳의 인덱스만을 가르키며 while문이 무한루프하게 됩니다. 또한 if문 안에서 ++point로 바꾸게 되면 endcheck와 같은 값이 나오지 않게되어 while문이 무한루프에 빠지게 됩니다.

  간단한 코드 이지만 이걸 만들면서 잠시동안 재미 있었어요^^S

Update 2007/9/4

public static int getLineNum(String content){
    int linenum = 0;
    for(int i = 0; i < content.length(); i++){
        if('\n' == content.charAt(i)) linenum++;
    }
    return linenum;
}


  sonegy님이 달아주신 댓글을 보고 메소드를 새로 만들었습니다. charAt()메소드를 사용하면 훨씬 간단하게 만들 수 있는데 먼 길로 돌아서 코드를 만들었네요...;;

  코드를 만들때 머릿속에 indexOf()가 먼저 떠올라서 다른 방법을 생각할 수 없게 되었었습니다...ㅠㅠ

  이게 코드도 짧고 훨씬 낫네요..ㅎㅎ

'프로그래밍' 카테고리의 다른 글

에어론체어 갖고싶다~~  (18) 2007.09.24
스트럿츠로 게시판 작업중  (0) 2007.09.18
문자열의 줄 수를 구하는 코드  (8) 2007.09.04
대단하다 스팸!!  (4) 2007.09.03
맥 OS X 오라클  (6) 2007.08.27
학교에서 배운 지식은 죽은 지식이다??  (4) 2007.08.20
top
  1. Favicon of http://sonegy.egloos.com sonegy 2007.09.04 10:47 신고 수정/삭제 댓글

    String 객체의 lastIndexOf 보단 charAt으로 char값을 비교해서 count하는게 더 보기 좋을듯하네요.
    음 근데 Utility 객체가 저러다 수퍼클래스가 되지 않을까 걱정입니다~~

    • Favicon of http://signpen.net 싸인펜 2007.09.04 15:19 신고 수정/삭제

      오오!! 감사합니다!!

      머리가 나빠서 charAt()를 사용하는 방법을 미처 생각하지 못했었네요.
      코드가 훨씬 간단하고 보기좋고 더불어 효율적으로 바뀌었습니다^^ㅋ

      그런데 Utility객체가 수퍼클래스가 된다는게 무슨 말씀인지 잘 모르겠습니다...;;;

  2. Favicon of http://www.myhyuny.net/ 화현 2007.09.05 01:32 신고 수정/삭제 댓글

    음, 조금 특이한 방법으로 만들어 봤어요
    public static int getLineNum(String content){
    int linenum = -1;
    for(int temp=1; temp > 0; linenum++){
    temp = content.indexOf("\n", temp) + 1;
    }
    return linenum;
    }
    하지만 속도와 효율성을 봐서는 싸인펜님이 2번째로 만든 코드가 더 낳아보이네요 ㅎㅎ

  3. Favicon of http://mewmew.tistory.com/ 야옹*^^* 2007.09.05 17:21 신고 수정/삭제 댓글

    오호.. 대단하신분들이세요. @.@

    • Favicon of http://signpen.net 싸인펜 2007.09.06 02:40 신고 수정/삭제

      야옹님, 칭찬 감사합니당~~

      대단하신 분들이라고 하시지 말고 저 대단하다고 해 주세요~~ 징징~~
      (칭찬에 목마른 1人, 이 댓글은.. 조크입니다)

  4. Favicon of http://luminance.kr/ 루미넌스 2007.09.14 17:56 신고 수정/삭제 댓글

    시스템에 따라서는 줄바꿈에 \n을 사용하지 않는 경우도 있습니다^^
    \n는 LineFeed문자이구요.. \r이라는 CarriageReturn 문자도 있죠.. 도스, 윈도우계열은 통상 \r\n을 줄 끝에 넣구요.. 유닉스 계열은 통상 \n을 넣습니다.
    하지만 정확히 기억안나는 모종의 시스템은 \r만을 씁니다. ^^

    • Favicon of http://signpen.net 싸인펜 2007.09.18 01:15 신고 수정/삭제

      예전에 소켓통신 관련 부분을 공부할 때 \r\n과 \n 등을 써먹었던게 기억이 납니다. \r만 사용하는 시스템도 있었군요^^ㅋ

      루미넌스님의 댓글엔 항상 정보가 담겨있는 것 같아요^^ㅋ

      지금 제가 사용하는 곳에는 \n이 제대로 작동이 되는데 나중에 필요로 할 때가 있을테니 다시한번 머릿속에 입력을 해 두어야 겠습니다^^

댓글 쓰기

자바의 클래스와 메소드

프로그래밍 2006.11.09 00:52
  자바를 처음 접할때 클래스가 무엇이고 메소드가 무엇인지 잘 구별이 되질 않는다. 어떤 형태로 이해를 하면 될까?
  나의 경우엔 학교에서 교수님이 붕어빵 틀과 붕어빵, 자동차 차체와 엔진, 이런 것들을 예로 들며 설명 해 주셨다. 사실 교수님껜 죄송한 일이지만, 그 설명이 잘 와닿질 않았다. 너무나 추상적이어서 이해하기 힘들었었다....OTL

  그래서 이번에 블로그를 통해 내가 이해하고 있는 방식으로 클래스와 메소드를 설명 해 볼까 한다.

  자바에 관심을 가지고 공부를 하고 있는 사람들이라면 컴퓨터에 관심이 많을 테니까 컴퓨터를 기준으로 한번 설명 해 보려한다.

★클래스와 메소드

복잡한 컴퓨터이지만 우선 모니터랑 키보드만..

  모니터와 본체, 키보드로 이루어져 있는 자바로 만들어져 있는 간단한 컴퓨터가 있다고 생각해 보자. 본체에는 모니터와 키보드가 연결되어 있고 본체가 하는 일은 키보드에서 입력된 내용을 모니터로 보내주는 일을 한다. 모니터는 본체가 키보드로부터 받은 입력내용을 보내주면 화면에 출력하는 역할을 한다.

  모니터와 키보드, 본체라는 케이스가 있다. 그 케이스가 바로 Class. 그리고 그 케이스 안에서 작동되는 모든 행위가 메소드를 뜻한다. 간략하게 자바 문법으로 보면,

//모니터
class Monitor{
  void OutScreen(String input){
  //input을 화면에 그려주는 내용
  }
  void OutScreen(그림 input){
   //input그림을 화면에 그려주는 내용
  }
}

//키보드
class Keyboard{
  String GetKey(){
  return 입력내용;
  //키보드 입력내용이 무엇인지 알아내는 내용
  }
}

//본체
class Main{
  public static void main(String[] args){
  Monitor 모니터 = new Monitor();  //본체에모니터 연결
   Keyboard 키보드 = new Keyboard();  //본체에 키보드 연결
  모니터.OutScreen(키보드.GetKey());
  //키보드에서 입력되는 내용을 받아서 모니터 출력부에 넣어준다.
  }
}

  물론 세세한 매커니즘은 다르겠지만 대략적인 내용은 이렇다는걸 설명하고 싶었다. 키보드 틀 안에는 입력받은 키값을 문자로 보내주는 행위를 하는 메소드가 들어있다. 본체 안에는 모니터와 키보드를 연결하고, 키보드의 입력값을 알아내는 메소드로 문자를 받아 그 받은 문자를 모니터의 화면출력을 하는 메소드 안으로 보내주는 역할을 한다. 모니터라는 틀 안에는 입력값을 받아서 모니터 화면에 뿌려주는 행위를 하는 메소드가 화면에 문자를 뿌려주는 행위를 하는 간단한 구조를 짜 보았다. 다시 한번 정리하면 모니터, 키보드, 본체 이렇게 3개의 틀이 각각의 클래스이고 그 안에서 어떠한 행위를 하는 것이 메소드 이다.

  쉬울꺼라 생각 했는데 일단 내가 써 놓고도 조금 복잡한 내용이 되어버렸지만 여러번 읽어보면 어떻게든 이해가 되지 않을까 싶다.

★클래스의 재활용

복잡한 비디오도 내맘대로 간단하게..ㅎㅎ

  자바는 객체지향 언어이다. 객체지향 언어의 장점은 만들어 놓은 객체(클래스)의 재활용성이 있다는 것이다. 한번 만들어 둔 객체는 다른 곳에서도 활용이 가능 하다는 것이다. 그래서 이번엔 만들어 놓은 모니터를 다른 부분에다 붙여서 쓰는 방법을 설명해 보겠다.

  자, 컴퓨터를 만드느라 만들어 둔 모니터를 VTR에 가져다 붙여보겠다. 실 생활에서도 컴퓨터 모니터로 출력이 가능한 연결부가 붙어있는 VTR이라면 일반 TV를 대신해 비디오화면을 출력할 수 있지 않을까 생각된다. 그래서 컴퓨터 모니터를 VTR에 붙여서 사용하는 자바코드를 한번 만들어 보겠다.

//VTR
class VTR{
  public static void main(String[] args){
  Monitor 모니터 = new Monitor();  //모니터를 VTR에다가 연결한다.
  그림 a = 테입으로로부터 읽어온 영상;
    //비디오테입으로부터 영상을 받아 그림형태의 a 변수에 대입한다.
  모니터.OutScreen(a);
  //테입의 영상이 들어있는 그림을 모니터의 출력메소드에 넣는다.
  }
}

  비디오를 만드는데 모니터를 새로 설계 할 필요가 없다. 컴퓨터에서 쓰던 모니터를 연결하면 되는 것이니까. 모니터는 쓰던걸 가져다 연결해 사용하면 되니깐 우리는 VTR틀과 내용물만 설계 해 주면 되는것이다. VTR에 있어야 하는것은 비디오 테입을 읽는것과 읽어온 영상을 모니터로 보내주는 내용만 들어가면 된다.

★오버로딩(Overloading)

  모니터 클래스에는 같은 이름의 메소드가 2개나 들어가 있다. 같은 이름의 메소드가 2개 있을때 들어가는 인수에 따라서 사용되는 메소드는 각각 다르다. 들어가는 인수가 문자열의 형태라면 첫번째 메소드가 사용되는 것이고, 그림의 형태라면 두번째 메소드가 사용되는 것이다.
  이것을 바로 오버로딩(Overloading)이라고 하는 것인데, 같은 이름의 메소드를 여러개 만들어서 메소드가 사용될 때 들어오는 인수의 갯수나 형태에 의해서 메소드 사용이 결정되는 것이다.

  에고고, 일단 글이 너무 길어져서 쓰다 지쳐버렸다. 다음에 또 이런 글을 쓸 기회가 올때 오버로딩에 대해서는 다시한번 자세히 적어봐야 하겠다. 오늘은 힘들어서 여기까지..S

'프로그래밍' 카테고리의 다른 글

자바의 예외처리  (6) 2006.11.13
그 교수님이 그립다.  (6) 2006.11.09
자바의 클래스와 메소드  (2) 2006.11.09
자바에 포인터가 없다?  (5) 2006.11.05
자바의 코바(CORBA)  (4) 2006.10.25
JSP스터디 진척상황 - 자바빈즈  (0) 2006.10.15
top
     TAG 메소드, 자바, 클래스
  1. Favicon of http://mahoutskai.pe.kr Poisoner 2006.11.09 09:54 신고 수정/삭제 댓글

    이야아......저도 이렇게 가르쳐주는 분이 계셨으면 자바를 좀 더 열심히 했을건데
    초기에 자바 배울 때 정말 -_-; 이게 뭔 개소리인지.....

    "선생님 우리 자바 때려치우고 C하면 안될까요?" 이런 소리까지 했었죠.
    하하하하하하하.

    • Favicon of http://signpen.net 싸인펜 2006.11.09 21:24 신고 수정/삭제

      전 C++을 정말 재미있게 가르쳐 주시는 교수님이 계셨는데 그분이 학교를 그만 두시는 바람에 C++을 제대로 배울 기회를 잃어버려서 자바에 올인하게 되어버렸습니다.

      처음엔 자바보다 C++이 더 재미있게 느껴졌었거든요. 자바를 가르쳐주시는 교수님은 쭈욱 학교에 계시다 보니 자바를 더 할수밖에 없는 환경이 되어서이기도 하겠지만, 지금은 C++보다 자바가 더 재미있다고 느끼게 되어버렸습니다.

      스승이라는 존재는 확실히 영향력이 큰것 같습니다.

댓글 쓰기