[Java] 문자열 조작

INO·2022년 3월 24일
0
post-thumbnail

문자열

자바는 문자열을 String 클래스로 다루는 것이 기본입니다. 문자형인 char도 있지만 String이 더 사용에 용이하기 때문에 주로 문자열에는 String을 사용합니다.

String

String 클래스는 일반 클래스와 구별되어 특별 취급을 받습니다. String은 참조 변수로 선언됨에도 불구하고 new를 사용하지 않고 인스턴스화할 수 있습니다.

String str = "문자열";
String str = new String("문자열");

String은 위의 2가지 방법으로 선언할 수 있으나 쌍따옴표를 사용하는 방법이 좀 더 사용에 용이하며 일반적인 방법입니다.

String 클래스는 인스턴스의 데이터가 변하지 않는 불변, Immutable 클래스입니다.
즉, String 인스턴스의 값이 변경되면 해당 객체의 값이 바뀌는 것이 아닌 인스턴스를 새로 생성합니다.

  • 불변
    인스턴스의 내용이 절대로 변하지 않는 클래스를 불변 클래스라고 합니다. 불변 클래스의 내용을 변경하면 인스턴스를 다시 생성하는 것이고, 인스턴스를 다시 생성하는 것은 메모리 공간과 처리 능력을 소비하게 됩니다. 그러므로 불변 클래스를 이용할때는 내용의 변경에 유의해야 합니다.

문자열 연결

String text1 = "정말";
Strng text2 = "감사합니다.";
text1 += text2;

위의 경우 하나의 문자열로 만들 수 있지만 문자열을 결합할 때 +연산자를 사용하는 방법은 좋은 방법이 아닙니다.

이유 - String 클래스는 영원히 변하지 않는다.

위의 코드를 보면 text1과 text2가 합쳐져 text1에 저장되는 것처럼 보이기에 인스턴스를 2개만 생성하는 것처럼 보이지만 String은 불변 클래스이기 때문에 인스턴스를 3번 생성하게 됩니다.

인스터스 생성은 비용이 드는 처리이기 때문에 많은 인스턴스를 생성하게 되면 프로그램의 동작이 느려질 수 있습니다. 심할 경우 메모리 자원을 고갈시켜 프로그램이 멈출 수도 있으므로 효율적으로 작성하면 좋습니다.

  • 가비지 컬렉터
    프로그래밍 언어에 따라 메모리를 관리해야 하는 경우가 있지만 자바는 필요 없어진 메모리를 가비지 컬렉터가 자동으로 해제합니다. 자바는 프로그래머가 메모리 공간을 관리하지 않아도 된다는 장점이 있지만 프로그래머라면 낭비되는 메모리가 없도록 고려하는 것이 프로그래머의 자세일 것입니다.

문자열 연결에는 StringBuilder를 사용하자

  • 연산자를 대신하여 사용할 수 있는 것이 StringBuilde입니다. StringBuilder는 append 메서드로 문자열을 축적하고 toString으로 문자열을 출력합니다.
String text1 = "감사합니다.";
StringBuilder sb = new StringBuilder("정말");
sb.append(text1);

2개의 인스턴스를 만든 것만으로 동일한 결과를 얻어낼 수 있습니다. StringBuilder를 사용하면 인스턴스 내부에서 문자열을 연결할 수 있습니다.

  • java 8 부터는 문자열 연결에는 StringJoiner도 사용할 수 있습니다.

문자열 형식(문자열 포맷)

포맷은 일정한 틀에 따라 문자열의 형식을 바꾸는 것을 의미합니다.

문자열 포맷을 사용하기 위해서는 String 클래스의 정적 메서드인 format을 사용하면 됩니다.

String result = String.format("%-10s%10d원", "쌀5kg", new BigDecimal(15000).longValue());
  • 여기서 longValue는 long타입으로 반환하기 위한 BigDecimal의 메서드이다.

%s : 문자열
%d : 수치
%10s : 문자열을 오른쪽 정렬하고 10자리로 하며 남는 자리에 공백
%-10s : 문자열을 왼쪽 정렬하고 10자리로 하며 남는 자리에 공백

수치의 포맷

%,10s원

위와 같이 %뒤에 ,를 사용하게 되면 3자리마다 콤마로 구분해주게 됩니다.

수치로 변환할 때 String.format으로 어려울 떄는 DecimalFormat을 사용하면 됩니다.

  • DecimalFormat은 수치를 서식에 따라 문자로 변환하는 클래스입니다.

0 : 수치가 들어가는 위치 (자릿수가 모자르면 0이 들어감)
'#' : 수치가 들어가는 위치 (자릿수가 모자라도 들어가지 않음)
, : 해당 위치에 콤마가 들어감
. : 해당 위치에 도트가 들어감

###,##0
000,000

DecimalFormat df = new DecimalFormat("###,##0");
String result = df.format(new BigDecimal(15000).longValue());

12를 넣게되면 첫번째는 12가 나오게 되고 두번째는 000,012가 나오게 됩니다.

  • 이 외에도 문자열을 가공하는 방법은 많습니다. 예를 들어 파일 전체의 문자열을 포맷하기 위해서는 Apache Velocity를 사용합니다.
profile
🎢

0개의 댓글