포스팅 하나로 다 하려 했는데 진짜 너무 많아질거 같아서 따로 뺴야겠다.
문자열 자료형 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");
- 문자열 비교 연산에서 == 연산자는 주소값을 비교하는데 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)
'Java' 카테고리의 다른 글
static과 final (1) | 2024.06.05 |
---|---|
Class, Object, Instance (0) | 2024.06.05 |
Java 메모리 - Stack, Heap, Method(Static) (0) | 2024.06.03 |
Java 자료구조 - 배열과 리스트 (0) | 2024.06.02 |
Java 기초 다지기 - 객체지향 특성 ( 인터페이스를 곁들인 ) (0) | 2024.05.30 |