Language/Java

String과 Char

사과만쥬 2024. 9. 14. 11:28

파이썬으로 코테를 풀던 시절에는 문자, 문자열에 대해 신경을 쓸 필요가 전혀 없었다.

그냥 '가 쓰고 싶으면 '를 쓰고, "가 쓰고 싶으면 "를 쓰면 됐다..

그러나 자바로 코테를 풀기로 시작하고 나니, 이런 거에 신경을 써야 한다...

 

 

자바는 String과 Char 타입을 "와 '로 구분한다는 것을 이번에 처음 알았다...

 

 


 

 

Char(문자)란?

  • 한 개의 문자 값에 대한 자료형을 의미한다.
  • 유니코드 문자 하나를 표현한다. 자바는 UTF-16 인코딩을 사용하므로, 0에서 66,535 사이의 정수값으로 표현된다.
  • 원시형 데이터 타입이다(primitive type)
  • 값을 직접 변경할 수 있다.
  • 기본 타입이므로 메모리 상에서 스택(stack)에 저장된다.
    • 이로 인해 접근 속도가 빠르다.
  • 크기가 2바이트(16비트)이며, 유니코드 문자 하나를 저장한다.

 

String(문자열)이란?

  • 여러 문자의 시퀀스를 저장한다.
  • 내부적으로 char의 배열로 구현되어 있다. 따라서 빈 문자열부터 매우 긴 문자열까지 표현할 수 있다.
  • 참조형 데이터 타입이다.(reference type) 이로 인해 문자열 함수가 상당히 다양하게 있다. (아래는 일부만 제시했다.)

1.  startWith : 문자열이 지정한 문자로 시작하는지 (대소문자 구별한다.) : 같으면 true , 다르면 false

2.  endsWith : 문자열이 지정한 문자로 끝나는지 (대소문자 구별한다.) : 같으면 true , 다르면 false

3.  equals : 두개의 문자열을 비교해서 반환  : 같으면 true , 다르면 false 

4.  indexOf : 찾고 싶은 문자가 문자열에 몇번째에 있는지 반환 : 반환값 int

5.  length : 문자열의 길이를 반환  : 반환값 int

6.  replace : 문자열에서 바꾸고 싶은 문자를 찾아서 바꿔서 출력  

7.  split : 자르고 싶은 문자로 문자열을 잘라서 배열로 반환

8.  toLowerCase: 대문자를 소문자로 변환

9.  toUpperCase : 소문자를 대문자로 변환

10.  trim : 문자열의 공백 제거( 문자열 처음과 끝만 공백제거)

11.  compareTo: 문자열의 비교 (사전순으로 비교)  : 반환값 int

12.  contains : 원본 문자열에서 찾고 싶은 문자열을 포함하면 true , 없으면 false 

13.  charAt : 문자열에서 입력받은 몇번째의 문자를 반환  : 반환값 'char'

14.  concat : 문자열과 문자열 연결

 

  • 불변 타입이다. 이로 인해 한 번 생성된 String 객체는 변경할 수 없다. 문자열을 수정하는 경우 새로운 String 객체가 생성된다.
  • 객체 타입이므로 메모리 상에서 heap에 저장된다.
    • String Pool이라는 특별한 메모리 영역을 사용하며, 이를 통해 문자열 리터럴의 재사용성을 높이고 메모리를 절약할 수 있다.
  • (파이썬을 주 언어로 사용하던 입장에서는) 비교 연산 시 상당히 번거로운데, char의 경우에는 == 연산자를 이용해서 직접 값을 비교할 수 있으나, String의 경우 내용 비교 시 equals()를 이용해야 한다. ==는 객체의 참조를 비교하는 것이다. 이와 관련해서는 아래에 샘플을 제시하였다.

 

 


String과 Char 간의 변환

 

String -> Char

public static void main(String[] args) throws IOException {
    String m = new String("Hello");
    char a = m.charAt(1);
}

 

charAt()을 이용하여 변환하고, 안에는 String의 몇번째 인덱스를 char로 반환할지 결정한다.

여기서 문자 여러개 넣으면 오류뜬다.

 

만약 charAt(문자) - "0"의 형태로 입력받는 경우, int 타입을 반환한다.

 

String str = "123";
char ch = str.charAt(1);  // '2'
int num1 = ch - '0';      // 2
int num2 = str.charAt(1); // 50 (문자 '2'의 ASCII 값)

 

 

 

Char -> String

public static void main(String[] args) throws IOException {
    char a = '2';
    String b = String.valueOf(a);
}

 

String.valueOf()를 이용해서 변환한다.


번외

 

Rust는 char만 14가지이다.

Rust 한번 찍먹해보실?