Java의 String, StringBuffer, StringBuilder 설명

Posted by 알 수 없는 사용자
2015. 3. 24. 22:35 프로그래밍/JAVA

 우리가 흔히 Java에서 문자열을 다룰때 사용하는 String과 생소하게 다가올 수 있는 StringBuffer, StringBuilder에 대해서 설명하려 한다.


1. String

 문자열을 처리하는 특별한 시스템 클래스의 객체이며, 변형 불가능(immutable)하다. 변형 불가능이라는 말은 String 인스턴스를 생성될 때 메모리의 힙(Heap) 영역에 할당되며 다시는 바꿀수가 없다는 것이다. 문자열을 조작하게 되면 새로운 문자열 인스턴스를 반환해줄 뿐이다. 아래에 작성된 코드는 메모리 영역에서 아래의 그림처럼 동작한다.




 그래서 아래와 같은 코드는 힙 영역에 지속적으로 할당될 수 밖에 없으므로 최악의 코드가 된다.

 JDK1.5 버전 부터는 "+" 연산자와 관련된 코드는 전부 컴파일시 StringBuilder로 변환된 후 사용된다. 하지만 .toString() 메소드로 String 인스턴스를 반환하는 것은 같다. 그러므로 문자열의 크기가 엄청 크거나, 문자열의 처리가 잦은 경우에는 성능상의 문제로 String을 사용하는 것을 고려해봐야 한다.


2. StringBuffer, StringBuilder

 StringBuffer와 StringBuilder는 String과는 다르게 변형 가능(mutable)하다. 내부적으로 배열의 형태로 선언되기 때문에 문자열 처리 후 새로운 인스턴스가 할당되는 것이 아닌 자신의 인스턴스를 계속적으로 변화시킨다고 할 수 있다. String에서의 동일한 예제가 아래와 그림과 같이 동작한다.


여기까진 StringBuffer와 StringBuilder가 같지만, 두개의 가장 큰 차이점은 "동기화"의 지원 여부이다. 두 클래스가 제공하는 메소드는 같지만 아래와 같이 멀티 쓰레드 상태에서 동기화를 지원하는 것이 다르다.


3개의 성능을 비교해보면 StringBuilder > StringBuffer > String 순으로 StringBuilder가 제일 빠른 것을 알 수 있다. 일반적으로 사용하는 String은 쓰기에도 편하고 가독성도 좋지만 문자열의 크기와 사용하고자 하는 용도에 따라서 3가지를 알고 사용하는 것이 현명하다고 할 수 있다.


※ 출처 : http://slipp.net/questions/271


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

JSTL Core Tag (c tag)  (4) 2015.06.02
Java의 Collections (List, Set, Map) 이해  (320) 2015.04.10
Java의 Garbage Collection  (315) 2015.03.27
JAVA 첫번째  (3) 2015.03.17

[개발방법론] 스크럼

Posted by jungbbong
2015. 3. 24. 19:16 프로그래밍/소프트웨어공학

1. 스크럼이란

카테고리적으로 말하면 애자일 개발방법론중에 하나라고 부른다


프로젝트를 위한 방법론이다


개발을 시작할때와 개발이 완료되어 유지보수를 할때에도 사용되는 방법론인것이다



2. 스크럼을 왜써야하나?


일정관리 개껌?

-> 개발을 하다보면 기간을 산정하는 부분이 있는데 팀원들간 매일매일 상호교류를 하면서 업무내용을 파악하므로써 간단히 가능


본인들이 개발을 너무 잘한다?

-> 그럴리 없음 개발자들을 무시하는것은 아니지만 코드가 있는곳에 버그가 있다 절대로 당신은 버그없는 프로그램을 만들어 낼 수 없다


위의 자신감을 가지고 프로세스를 무시한채 개발을 마구잡이로한다면

당신이 얻게되는것은?


주말출근, 일정연기, 야근, 잦은 기획서 변경-> 스펙변경



하.. 하얗게 불태웠어....


이러한 당신의 모습을 볼수 있다


물론 당신이 강백호라면?





아래의 얘기들은



그렇지 아니한가?


생략할필요가 없는 우리 일반인 독자들을 위해서 약을 한사발 더 들이키고 스크럼을 써주겠다


3. 스크럼




구구절절얘기보다 하나씩


#1 제품백로그


사용자관점에서 기능을 나열

실제 기획서를 기간별로 중요도 고려하여 하나하나 쪼갬

개발기간중에 스펙아웃이라던지 필요에 의한 추가 목록이 생성가능



- 제품 백로그 작성방법예시



#2 스프린트 (2주에서 4주)


개발우선순위를 정함

작업시 예측


- 스프린트 예시





위의 사진중에 burn down chart를 좀더 자세히보면?




예상 개발 기간보다 실제개발 기간을 확인할수 있다 보통 실제 개발기간의 그래프가 상위에 있기마련 ㅎㅎㅎ 




이렇게 매일매일 위의 것들을 수행하면서


#3 프로젝트기획서를 스크럼회의를 통하여 (보통 15분)




매일매일 아침마다 짧게 서서 15분정도 



#4 스프린트하나의 셋이 끝나면 회고를 통하여 다른 스프린트를 통해 반복한다



이게 바로 아주 경량화된 애자일 방법론

우리는 이렇게 하여금 수많은 문제들을 발견할 수 있다


이렇게 하다보면 프로젝트속에 우리가 모르고 지나치던 것들에 대한 답을




ㅋㅋㅋ가끔 피키캐스트가 주는것은 아니고

우리와 함께하는 프로젝트 팀원과 나열된 문제속에서 답을 얻어낼 수 있다



다시 요약하면


반복

빠른피드백

빠른오류처리

위험감소

스프린트를 통한 기간관리


거대한 프로젝트를 스프린트로 통하여 분명한목표를 가진 소규모로 명확한기능으로 분류


C# 가비지 컬렉션(Garbage Collection)

Posted by 알 수 없는 사용자
2015. 3. 23. 23:19 프로그래밍/C#

C/C++ 프로그래밍에서는 메모리 할당과 해제를 개발자가 직접했어야 했다.

하지만 닷넷기반에서는 가비지컬렉션(GC)에 의해 메모리를 세대별로 나눠서 관리한다.

세대별로 나눠서 관리하는 이유는 GC가 동작하는 모든 객체를 조사하고 관리하는 비용이 크기 때문이다.

GC는 총 3가지 세대로 나눠서 관리를 한다.

0세대 : 처음 할당되는 객체는 모두 0세대에 속한다. 0세대의 용량이 일정 크기를 초과하면 GC는 가비지를 수집한다.

1세대 : 0세대에서 가비지 수집 시 계속 사용되는 객체가 있다면 1세대로 승격된다.

    1세대에서도 일정 크기의 용량을 초과하면 GC는 가비지를 수집하고 보통 0세대에서 컬렉션이 많이 발생한다.

2세대 : 1세대에서 가비지 수집 시 계속 사용되는 객체가 2세대로 승격된다.

    2세대 영역에서도 1세대와 마찬가지로 일정 크기의 용량을 초과하면 GC가 가비지를 수집한다.

GC가 수행되는 동안 모든 스레드 작업은 중단된다.

이는 더 이상 참조되지 않는 객체들을 해제하고 그 빈 공간을 채우기 위해 사용 중인 다른 객체들의 위치를 재 조정하기 때문이다.


GC의 동작

[그림 1]


[그림 2]

위 [그림 1]은 사용 중인 메모리 공간을 보여준다. 그리고 b는 d를 참조하고 있다고 가정한다.

만약 b = null, g = null 을 대입하고 GC가 수행되면 b, d, h가 삭제되어 [그림 2]와 같이 메모리가 해제된 빈 공간이 생기게 된다.


[그림 3]

b, d, h가 삭제되어 메모리공간이 비어있게 되면 메모리공간을 효율적으로 사용하기 위해 GC는 아직 사용 중인 객체들을 [그림 3]과 같이 재 배치한다.



[그림 4]

[그림 4]에서 보면 처음 0세대에서 GC가 수행된 후 남아있는 객체들은 1세대로 승격되고 추가로 생성된 객체(i, j, k)들은 0세대에 추가된다.

2세대까지의 승격도 위와 같은 방법으로 일어나고 0세대의 GC는 활발하게 일어나지만 1세대, 2세대로 갈 수록 빈도는 줄어든다.



출처 : 

시작하세요! C# 프로그래밍




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

C# Linq  (3) 2015.05.18
C# 람다식(Lamda Expression)  (9) 2015.04.11
C# 대리자(Delegate)  (288) 2015.04.08
C# 기본자료형, 변수  (10) 2015.03.22