모바일 오유 바로가기
http://m.todayhumor.co.kr
분류 게시판
베스트
  • 베스트오브베스트
  • 베스트
  • 오늘의베스트
  • 유머
  • 유머자료
  • 유머글
  • 이야기
  • 자유
  • 고민
  • 연애
  • 결혼생활
  • 좋은글
  • 자랑
  • 공포
  • 멘붕
  • 사이다
  • 군대
  • 밀리터리
  • 미스터리
  • 술한잔
  • 오늘있잖아요
  • 투표인증
  • 새해
  • 이슈
  • 시사
  • 시사아카이브
  • 사회면
  • 사건사고
  • 생활
  • 패션
  • 패션착샷
  • 아동패션착샷
  • 뷰티
  • 인테리어
  • DIY
  • 요리
  • 커피&차
  • 육아
  • 법률
  • 동물
  • 지식
  • 취업정보
  • 식물
  • 다이어트
  • 의료
  • 영어
  • 맛집
  • 추천사이트
  • 해외직구
  • 취미
  • 사진
  • 사진강좌
  • 카메라
  • 만화
  • 애니메이션
  • 포니
  • 자전거
  • 자동차
  • 여행
  • 바이크
  • 민물낚시
  • 바다낚시
  • 장난감
  • 그림판
  • 학술
  • 경제
  • 역사
  • 예술
  • 과학
  • 철학
  • 심리학
  • 방송연예
  • 연예
  • 음악
  • 음악찾기
  • 악기
  • 음향기기
  • 영화
  • 다큐멘터리
  • 국내드라마
  • 해외드라마
  • 예능
  • 팟케스트
  • 방송프로그램
  • 무한도전
  • 더지니어스
  • 개그콘서트
  • 런닝맨
  • 나가수
  • 디지털
  • 컴퓨터
  • 프로그래머
  • IT
  • 안티바이러스
  • 애플
  • 안드로이드
  • 스마트폰
  • 윈도우폰
  • 심비안
  • 스포츠
  • 스포츠
  • 축구
  • 야구
  • 농구
  • 바둑
  • 야구팀
  • 삼성
  • 두산
  • NC
  • 넥센
  • 한화
  • SK
  • 기아
  • 롯데
  • LG
  • KT
  • 메이저리그
  • 일본프로야구리그
  • 게임1
  • 플래시게임
  • 게임토론방
  • 엑스박스
  • 플레이스테이션
  • 닌텐도
  • 모바일게임
  • 게임2
  • 던전앤파이터
  • 마비노기
  • 마비노기영웅전
  • 하스스톤
  • 히어로즈오브더스톰
  • gta5
  • 디아블로
  • 디아블로2
  • 피파온라인2
  • 피파온라인3
  • 워크래프트
  • 월드오브워크래프트
  • 밀리언아서
  • 월드오브탱크
  • 블레이드앤소울
  • 검은사막
  • 스타크래프트
  • 스타크래프트2
  • 베틀필드3
  • 마인크래프트
  • 데이즈
  • 문명
  • 서든어택
  • 테라
  • 아이온
  • 심시티5
  • 프리스타일풋볼
  • 스페셜포스
  • 사이퍼즈
  • 도타2
  • 메이플스토리1
  • 메이플스토리2
  • 오버워치
  • 오버워치그룹모집
  • 포켓몬고
  • 파이널판타지14
  • 배틀그라운드
  • 기타
  • 종교
  • 단어장
  • 자료창고
  • 운영
  • 공지사항
  • 오유운영
  • 게시판신청
  • 보류
  • 임시게시판
  • 메르스
  • 세월호
  • 원전사고
  • 2016리오올림픽
  • 2018평창올림픽
  • 코로나19
  • 2020도쿄올림픽
  • 게시판찾기
  • 오유인페이지
    개인차단 상태
    ansi5120님의
    개인페이지입니다
    가입 : 13-04-28
    방문 : 1490회
    닉네임변경 이력
    회원차단
    회원차단해제
    게시물ID : programmer_9140
    작성자 : ansi5120
    추천 : 5
    조회수 : 968
    IP : 72.53.***.30
    댓글 : 6개
    등록시간 : 2015/04/05 17:31:50
    http://todayhumor.com/?programmer_9140 모바일
    왜 StringBuilder가 필요한가?


    이 글에 달린 답글중에 답을 미처 못 한 부분이 있었습니다.

    >in loop 안에 변수 선언하는게 O(1)이고 O(N) 이라는게 무슨 말인지 모르겠네요.
    > int 고 string 이고 컴파일러 상에서의 차이는 아마 없을텐데요. 단지 스코프를 최소화하는게 정설이기 때문에 in loop 안에 선언하는걸 권장 할 뿐 아닌가요.

    다른 부분에 신경을 쓰느라 답이 늦었습니다.
    여하튼 설명하죠.

    원글에서 논하던 부분은 오브젝트 형성에 관련한 부분입니다.
    루프 안의 local variable을 지정해서 소모하는 문제지요.
    이게 primitive 타입이라면 상관 없는데 object 타입에 연산자를 지원한다면 문제가 됩니다.

    편의상 getNumber()와 getWord()란 함수가 있다고 치고, 예제를 봅시다.

    A)
    int sum = 0;
    while() {
       int i = getNumber();
       sum += i;
    }

    B)
    String line = "";
    while() {
       String word = getWord();
       line += word;
    }

    A)와 B)는 로직상으로 보면 거의 동일한 알고리즘입니다.
    매 루프에 정보의 일부분을 받고, 그걸 축적하는 거죠.

    문제는 A)의 int는 primitive인데 B)의 String은 오브젝트입니다. 게다가 수정이 불가능한 immutable한 놈이죠.
    이러면 어찌되느냐?
    A)의 루프안에서 sum을 업데이트하는 건 sum에 담겨있는 정보를 바꾸는 거에 불과합니다. 더 이상의 메모리 사용이 없죠.
    B)의 루프안에서 line을 업데이트하는 건 사실 새로운 오브젝트를 생성합니다. 추가로 메모리를 사용하는 겁니다.

    가령 예를 들면
    "this sentence is short"가 인풋이라면,
    첫번째 루프에선
    word = "this" 가 생성되고, line = "this"가 따로 생성됩니다. 전에 있던 line = ""는 GC에 붙들려갑니다(고 알고 있습니다).
    두번째 루프에선
    word = "sentence"가 생성되고, line = "this sentence"가 또 따로 생성됩니다. 전에 있던 line = "this"는 또 사라집니다.

    즉 오브젝트의 내용을 바꾸는 게 아니라 오브젝트 하나를 새로 만들어내는 일이죠.
    자바는 주 언어가 아니기때문에 잘 모르겠습니다만, 루프 안에서 GC에 매번 보내면 O(N)만큼의 시간이 추가로 소모됩니다.
    루프가 끝난 뒤에 한꺼번에 포인터 정리를 하는 알고리즘이라면 그게 해소될 때까지 O(N)만큼의 메모리가 잡혀있는 셈입니다.
    유명한 마인크래프트 퍼포먼스 문제는 후자의 경우가 발동되었던 거고요.


    이걸 피하기 위해 그러면 어떻게 하느냐?
    StringBuilder를 쓰면 됩니다.
    StringBuilder sb = new StringBuilder();
    while() {
       String word = getWord();
       sb.append(word);
    }
    return sb.toString();

    이러면, 매 루프에서 새로운 오브젝트를 생성하지 않습니다. 단지 sb 하의 정보가 업데이트될 뿐이죠.


    글을 좀 급하게 쓰느라 O(N)이라고 대충 써 넘겼습니다.
    이렇게 답을 남깁니다.

    이상.

    이 게시물을 추천한 분들의 목록입니다.
    [1] 2015/04/05 17:32:18  119.204.***.63  윤하홀릭  87487
    [2] 2015/04/05 17:48:05  122.38.***.234  REGENTAG  141650
    [3] 2015/04/05 22:24:26  112.169.***.56  벼랑끝의호모  287299
    [4] 2015/04/06 03:33:31  121.165.***.140  MGS  112354
    [5] 2015/04/06 05:01:14  50.161.***.8  라면은오짬  134886
    푸르딩딩:추천수 3이상 댓글은 배경색이 바뀝니다.
    (단,비공감수가 추천수의 1/3 초과시 해당없음)

    죄송합니다. 댓글 작성은 회원만 가능합니다.

    번호 제 목 이름 날짜 조회 추천
    79
    허위 무고가 왜 문제냐면 [3] ansi5120 17/08/03 11:15 72 12
    왜 StringBuilder가 필요한가? [7] ansi5120 15/04/05 17:31 53 5
    77
    Java를 쓰면서 들이면 곤란한 습관들 [18] ansi5120 15/04/05 06:54 103 8/4
    76
    그러니까 퀄리티가 떨어지는 질문은 무시하는게 상책이죠. [7] ansi5120 15/04/04 23:55 46 4/9
    75
    워드프레스는 좋은 코드가 아니죠 [18] ansi5120 15/02/21 00:38 54 5/5
    74
    멍청한 질문이 보기 싫으면 [3] ansi5120 15/02/06 14:45 58 3
    73
    시한폭탄 (수정) [14] ansi5120 15/02/06 13:05 69 2/5
    72
    음 그러니까 C로 시작할 필요 없다니까요. [14] ansi5120 15/02/03 15:55 100 4
    71
    한국어 스택오버플로우 좋죠. [11] ansi5120 15/02/03 11:18 83 4
    70
    마테마티카 평가 [6] ansi5120 15/01/25 13:18 53 13
    69
    굳이 C로 시작할 필요 없습니다. [11] ansi5120 15/01/10 16:46 69 6
    68
    광고알바도 온 김에 아이티뱅크 홍보해보죠. [5] ansi5120 15/01/09 16:26 24 10
    67
    네 반박해보죠. [23] ansi5120 15/01/09 13:41 94 11
    66
    베오베 갈 '흥했으나 몰락의 길을 걸었던 나라...' 로마사 반박. [4] ansi5120 14/12/18 12:41 124 50
    65
    이제는 싫어하는 것도 대세인가 [6] ansi5120 14/11/22 16:12 153 6
    64
    미성년때 야겜이야 다들 한번씩은 해봤겠죠. [5] ansi5120 14/10/01 03:31 152 4
    63
    캐나다는 유토피아가 아닙니다. [10] ansi5120 14/09/12 00:43 67 17
    62
    대학 다니던 때 유일하게 알고 지내던 한국사람 왈. ansi5120 14/09/11 23:07 62 4
    61
    왜 C에서 bool을 쓰면 안 되는가? [27] ansi5120 14/08/29 11:06 94 3/8
    60
    그러니까 그냥 답을 하지 말아요. [1] ansi5120 14/08/26 02:49 80 0
    59
    혹시 창룡전 개정판 중고 매물 아시는 분 있으십니까. ansi5120 14/01/07 09:12 22 0
    58
    '책 몇권이나 읽었냐'와 비길 정도로 신경질나는 질문은 ansi5120 14/01/07 09:03 58 7/5
    57
    2005년 페이스북에서 누출된 서버사이드 코드 ansi5120 13/11/01 11:39 51 0
    56
    개발자의 권익 옹호라던지 거창한 말이 가끔 나오는데 [3] ansi5120 13/10/30 10:52 74 1
    55
    소달구지씨에게 [1] ansi5120 13/10/29 12:09 54 0
    54
    프로그래머가 되는데 학위는 필수불가결이 아닙니다. [7] ansi5120 13/10/27 23:01 68 2
    53
    오늘의덕담씨에게 ansi5120 13/10/27 22:48 23 0
    52
    도고씨에게 ansi5120 13/10/24 09:32 44 0
    51
    건담 대화. [7] ansi5120 13/10/21 13:33 78 3
    50
    확실히 영웅 삼국지 이후로는 [1] ansi5120 13/10/21 13:30 24 0
    [1] [2] [3]
    단축키 운영진에게 바란다(삭제요청/제안) 운영게 게시판신청 자료창고 보류 개인정보취급방침 청소년보호정책 모바일홈