본문 바로가기

Java

Java 기초 다지기 - 문자열

포스팅 하나로 다 하려 했는데 진짜 너무 많아질거 같아서 따로 뺴야겠다. 

 

문자열 자료형 char / String

  • char - 한 개의 문자 
char a = 'C' - 2; // 67 - 2
System.out.println(a); // ASCII 65 = A

 

  • String - char[] 배열로 이루어진 데이터 자료
  • String은 참조 자료형으로 heap 영역에 저장되고 주소만 stack 영역에 저장된다.
  • 기본적으로 자바에서 String 객체의 값은 변경할 수 없다.
String a = "Hello";
a = a + "World"; 
// 객체의 값이 변경되는게 아니라 Hello World를 따로 메모리에 만들어서 다시 참조한다.
  • String 주소 할당 방식에는 2가지가 있다. 결과는 똑같지만 내부적으로 큰 차이가 존재한다. 리터럴 값으로 할당한 변수가 같은 값을 가지면 같은 메모리 주소를 가르키기 때문에 메로리를 절약할 수 있다.
String str1 = "Hi"; // 문자열 리터럴을 이용한 방식 -> string constant pool 영역에 존재
String str2 = "Hi"; 

String str3 = new String("Hi"); // new 연산자를 이용한 방식 -> Heqp 영역에 존재
String str4 = new String("Hi");

 

출처 - ☕ 자바 String 타입 특징 이해하기 (String Pool & 문자열 비교) (tistory.com)

 

  • 문자열 비교 연산에서 == 연산자는 주소값을 비교하는데 equals 메소드는 값을 비교한다. 
System.out.println(str1==str2); // true

System.out.println(str3==str4); // false
System.out.println(str3.equals(str4)); // true

System.out.println(str1==str3); // false
System.out.println(str3.equlas(str1)); // true
  • 문자열 내장 메소드 (자주 쓰는거만)
char charAt(int index) 지정된 위치(index)의 문자 리턴
int compareTo(String str) 두 문자를 사전식 순서로 비교해서 같으면 0 str이 작으면 음수, 크면 양수 리턴
int indexOf(String str) 문자열에서 지정된 문자열이 시작되는 첫 번째 위치 리턴, 없으면 -1
int length() 문자열 길이 리턴
String replace(char oldChar, char newChar) 문자열에서 oldChar을 newChar로 변경한 문자열 리턴
String toLowerCase() 문자열의 모든 문자를 소문자로 변환한 문자열 리턴
String toUpperCase() 문자열의 모든 문자를 대문자로 변환한 문자열 리턴
String substring(int beginIndex, int endIndex) 문자열에서 beginIndex부터 endIndex-1까지의 문자열을 리턴
String[] split(String str) 문자열을 정규표현식(regex)으로 분리하여 문자열 배열로 리턴
String trim() 문자열 양 끝 공백 제거한 문자열 리턴
boolean contains(String str) 주어진 문자열 (str)을 포함하는지 확인
int lastIndexOf(String str) 문자열에서 주어진 문자열(str)이 시작되는 마지막 위치 리턴 , 없으면 -1
boolean isEmpty() 문자열이 비었는지(길이가 0인지) 확인하여 결과 리턴
String repeat(int n) java 11부터 가능 문자열 반복

 

+ String.toCharArray() - 문자열을 char 타입의 배열로 만들어준다.

+ String.join(결합 문자, 데이터, ...) - String 문자열 결합 반환 타입 String

  • 문자열로 바꾸는 2가지 방법 toString() / valueOf()
int n = 12;
String str1 = Integer.toString(n); // "12"
String str2 = String.valueOf(n); // "12"

String str = null;
str.toString() // NullPointerException 에러
String.valueOf(str); // "null"
  • 문자열 연결 + / concat / StringBuilder / format
// + // 모든 데이터 타입 연결 가능 null은 "null"로 변환
String str1 = "Hi";
String str2 = "cat";

System.out.println(str1 + str2); // HiCat

// StringBuilder
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Hi");

System.out.println(stringBuilder); //HiCat

// concat() // String 값만 연결이 가능하다. // null 예외 발생
String str = "Hi".concat("Cat");

System.out.println(str); // HiCat

// format()
String str1 = "Hi";
String str2 = "Cat";

String str = String.format("%s, %s", str1, str2);
System.out.println(str); // HiCat
  • concat()은 문자열의 길이가 0보다 커야 새 문자열을 생성한다.
String str1 = "Hi";
String str2 = "";

String str3 = str1.concat(str2);
String str4 = str1 + str2;

System.out.println(str3 == str1); // true
System.out.println(str4 == str1); // false
  • 아까 뭐라했는가 == 연산자는 주소값을 비교한다. 그런데 concat()은 길이가 0보다 커야 새 문자열을 생성한다 했는데 ""는 길이가 0이라 새 문자열을 생성하지 않는다! 그럼 str1.concat(str2)의 결과는 이미 있던 str1과 똑같기 때문에 같은 주소를 공유해서 true가 나오게 된다!

* 번외로 문자열에서 Int형으로 변환

String str = "1234";
int num = Integer.parseInt(str); // 1234

int num2 = Integer.valueOf(str); // 1234

 

  • 그럼 이제 2개의 차이점이 궁금해야 한다... 결과는 똑같은데 다른게 너무 많다.
  • parseInt 는 원시 데이터인 int 타입을 반환한다.
  • valudOf()는 Integer 객체를 반환한다. -> 내부적으로 new Integer(Integer.parsInt(str))과 같다.

 

참고 출처

☕ 자바 String 타입 특징 이해하기 (String Pool & 문자열 비교) (tistory.com)

 

☕ 자바 String 타입 특징 이해하기 (String Pool & 문자열 비교)

여타 대부분의 프로그래밍 언어에서 문자열 이라는 데이터를 저장하기 위해 string 이라는 데이터 타입을 사용한다. 이 string 데이터를 다루는데 있어 특별히 유의해야 할점은 없어보이지만, 자바

inpa.tistory.com