[자료구조] 문자열 (String)

SOL·2023년 7월 9일
0

알고리즘

목록 보기
3/31

Java.lang.String

String은 Java.lang 패키지로 제공되는 Java 문자열 클래스로, 별도의 import 없이 사용 가능합니다.

문자열은 여러개의 문자가 배열을 이룬 것으로
자바에서 문자는 작은따옴표, 문자열은 큰따옴표를 사용하여 나타냅니다.

char ch = 'A';
String str = 'java';


String 선언의 두가지 방법

// 1.literal로 생성
String str_literal = "Hello";

// 2.object로 생성
String str_object = new String("Hello");

두 선언의 차이점은 저장되는 메모리영역이 다릅니다.
literal은 Heap에서 공동으로 사용하는 constant String pool 에 저장되고, 인스턴스로 만든 문자열은 그냥 Heap 영역에 저장됩니다.

String str1 = "abc";
String str2 = new String("abc");
// str1 == str2 는 false입니다.
// 둘의 메모리 주소값은 다릅니다.

String str1 = "abc";
String str2 = "abc";
// str1 == str2 는 true입니다.

String str1 = new String("abc");
String str2 = new String("abc");
// str1 == str2 는 false입니다.


String 내 Character 다루기

자바에서 String 클래스로 표현되는 문자열은 문자의 배열입니다. 문자열 내 문자를 가져오는 방법은 두가지 입니다.

//인덱스에 해당하는 문자 가져오기
String.charAt(int index);

// char[] 배열에 문자 담기 
String.toCharArray();

Character

알아두면 좋을 Character 내장 라이브러리를 알아보겠습니다.

// 문자를 숫자로
char digit = '7';
int digitToInt = Character.getNumericValue(digit);

// 문자인지 확인 (주로 공백 체크할때 사용)
char c = 'A';
Character.isAlphabetic(c); // boolean값을 반환합니다.

// 대문자를 소문자로, 소문자를 대문자로
Character.toUpperCase(c);
Character.toLowerCase(c);

// 대소문자 확인
Character.isUpperCase(c);
Character.isLowerCase(c);


아스키 코드

char형으로 표현되는 문자는 사실 내부적으로 정수형 int로 취급됩니다.
따라서 문자를 정수로, 정수를 문자로 바꿀 때 아스키 코드를 사용합니다. 아스키 코드는 기본적인 128개의 문자가 가지는 정수 코드입니다.

모든 코드를 외울 필요는 없지만 기준이 되는 문자는 알아두면 좋습니다.

'0' = 48
'A' = 65
'a' = 97
char base = 65; 

System.out.print(base);       // 'A'
System.out.print((int)base);  // 65
System.out.print((char)65);   // 'A'
System.out.print('Z' - 'A');  // 25
System.out.print(base + 25);  // 90
System.out.print((char)90);   // 'Z'

예를 들어 문자 '2'를 정수로 표현하고 싶다면 '2' - '0'을 해주면 정수 2가 됩니다.
주의할점은 char끼리 연산하면 int형으로 형 변환합니다. 따라서 문자로 반환받고 싶다면 (char)을 붙여서 강제 형 변환을 시켜주어야 합니다.



String 수정하기

String은 한번 인스턴스가 생성되면 수정할 수 없습니다. (immutable object)
그러나 값의 변경은 불가능하지만, 새로운 String을 만들어 바꿀 수는 있습니다.

toCharArray() 이용

String str = "ABC";

char[] temp_arr = str.toCharArray();
temp_arr[2] = 'D';

str = new String(temp_arr);

substring() 이용

String str = "ABCEFG";
str = str.substring(0,3) + 'D' + str.substring(3,6)

StringBuilder

문자열을 쉽고 효율적으로 수정할때는 StringBuilder를 이용합니다.
문자를 이어 붙이거나 삭제하는 등 수정할 때마다 매번 새로운 String객체를 만들지않고 내부 배열에서 직접 수정합니다.

자주 사용되는 StringBuilder 메서드를 알아두면 좋습니다.


StringBuilder sb = new StringBuilder();
 
// String으로 반환
sb.toString()

// 문자 c를 문자열 끝에 이어 붙인다
sb.append(char c)

// 문자열 길이를 반환
sb.length()

// 문자열을 뒤집는다
sb.reverse()


String으로 형 변환

자주 쓰이는 3가지 방법을 알아보겠습니다.

1. String.valueOf(Object obj)

  • 파라미터가 nul이면 "null"을 반환합니다.

2. Casting

  • 대상이 null이면 NullPointerException이 발생합니다.

3. toString()

  • 대상이 null이면 NullPointerException이 발생합니다.


String 내장 라이브러리

String.charAt(int index)

String str = "hello";
// 해당 index의 문자를 반환한다.
char c = str.charAt(0); //'h'

String.toCharArray()

String str = "hello";
// String을 쪼개어 char 배열로 만들어준다.
char[] arr = str.toCharArray(); //['h','e','l','l','o']

String.repeat(int n)

String str = "hello";
// str을 n번 반복해준다.
String repeat = str.repeat(3); //"hellohellohello"

String.equals()

String str = "hello";
// 문자열은 객체이므로 비교연산자(==)로 비교할 수 없다.
// 다른 문자열과 비교하여 boolean값 반환한다.
if(str.equals("hi"))

String.length()

String str = "hello";
// 문자열의 길이를 반환
int length = str.length(); //5

String.substring(int startIndex, int endIndex)

String str = "hello";
// 문자열의 startIndex부터 endIndex-1까지 잘라서 반환
String subStr = str.substring(0,3); // "hel"

// 매개변수를 하나만 받으면 해당 index부터 끝까지 반환
String subStr = str.substring(3); // "lo"

String.toUpperCase()

String str = "hello";
// 문자열의 모든 알파벳이 대문자로 변환
String upper = str.toUpperCase(); //"HELLO"

String.toLowerCase()

String str = "HELLO";
// 문자열의 모든 알파벳이 소문자로 변환
String upper = str.toLowerCase(); //"hello"

String.join(Char separator, Object[] values)

String[] arr = {"a", "b", "c"};
// 구분 기호 separator로 배열의 원소들을 연결한다. 
String join = String.join("", arr); // "abc"

String.valueOf()

// String으로 형변환 해준다.
String str = String.valueOf(1); //"1"
String str = String.valueOf(1.2); //"1.2"
String str = String.valueOf('a'); //"a"
String str = String.valueOf({'j','a','v','a'}); //"java"
String str = String.valueOf(true); //"true"

String.indexOf()

// 문자열에 문자 또는 부분 문자열의 포함여부를 확인한다.
String str = "hello";
str.indexOf("ll"); // 있다면 시작 인덱스 2를 반환하고 없으면 -1을 반환한다.

String.contains()

// 문자열에 문자 또는 부분 문자열의 포함여부를 확인한다.
String str = "hello";
str.contains("ll"); // 있다면 true 없다면 false 반환한다.

String.startsWith()

// 원본 문자열이 전달받은 문자열로 시작하는지 검사한다.
String str = "hello";
str.startsWith("he"); // 해당 문자열로 시작하면 true 아니라면 false를 반환한다.

String.endsWith()

// 원본 문자열이 전달받은 문자열로 끝나는지 검사한다.
String str = "hello";
str.startsWith("llo"); // 해당 문자열로 끝나면 true 아니라면 false를 반환한다.


profile
개발 개념 정리

0개의 댓글

관련 채용 정보