1. 문자열의 표현과 객체 생성
- 실제 데이터인 String 객체는 힙 메모리에 위치하고 참조 변수는 힙 메모리의 실제 객체 위치를 가리키게 됨
1) String 클래스의 객체 생성방빕 1
- String 참조 변수명 = new String("문자열");
String str = new String("안녕");
- String 클래스의 생성자
- new 키워드 : 실제 데이터가 힙 메모리에 위치
2) String 클래스의 객체 생성방법 2
- 간단히 문자열 리터럴, 즉 문자열 값만 입력하는 방법
- String 참조 변수명 = "문자열";
String str = "안녕";
2. String 클래스의 2가지 특징
1) 객체 안의 값을 변경하면 새로운 객체를 생성
-String 객체는 내부에 포함된 문자열을 변경할 수 없음
String str1 = new String("안녕");
String str2 = str1;
str1="안녕하세요";
System.out.println(str1); //안녕하세요
System.out.println(str2); //안녕
-String str1 = new String("안녕");
: 메모리 클래스 영역에는 String 클래스의 바이트 코드가 로딩되고, 스택에는 참조 변수 str1의 공간이 생김
: 실제 데이터인 "안녕"은 힙 메모리에 생성되며, 생성된 실제 데이터의 위칫값이 스택 메모리의 str1 공간에 저장
-String str2 =str1
: 참조 자료형의 값을 복사하면 스택 메모리의 값이 복사되므로 str1과 str2는 이제 모두 동일한 객체를 가리키고 있음
-str1 = "안녕하세요";
: 자바 가상 머신은 기존의 문자열을 수정하는 것이 아닌 "안녕하세요"라는 문자열을 포함하고 있는 새로운 String 객체를 생성하고, 이 위치를 str1의 공간에 저장
cf) 배열은 객체의 값 자체가 수정되므로 참조 변수 복사 이후 하나의 변수에서 수정하면 나머지 변수에도 적용
- String 객체의 문자열 수정 및 다른 참조 자료형과의 비교
package Stringex;
import java.util.Arrays;
public class Stringex1 {
public static void main(String[] args) {
//문자열 수정
String str1 = new String("안녕");
String str2 = str1;
str1 = "안녕하세요"; //새로운 객체 생성
System.out.println(str1);
System.out.println(str2);
//배열 참조 자료형
int[] array1 = new int[] {3,4,5};
int[] array2 = array1;
array1[0]=6; //array2가 가리키는 값도 변경
array1[1]=7;
array1[2]=8;
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
}
}
2) 리터럴을 바로 입력한 데이터는 문자열이 같을 때 하나의 객체를 공유
-문자열 리터럴만 입력해 String 객체를 생성하면 하나의 문자열을 여러 객체가 공유할 수 있음
String str1 = new String("안녕");
String str2 ="안녕";
String str3 ="안녕";
String str4 = new String("안녕");
- new 로 생성할 때는 동일한 문자열 객체가 힙 메모리에 있든, 없든 무조건 새롭게 객체 생성
- 문자열 리터럴로 생성할 때는 힙 메모리에 리터럴로 생성된 동일 문자열을 포함하고 있는 객체가 있으면 그 객체를 공유
-문자열 리터럴에 따른 생성 문자열 객체의 공유
package Stringex;
public class Stringex2 {
public static void main(String[] args) {
String str1 = new String("안녕");
String str2 = "안녕";
String str3 = "안녕";
String str4 = new String("안녕");
//스택 메모리값 비교
System.out.println(str1==str2);
System.out.println(str2==str3);
System.out.println(str3==str4);
System.out.println(str4==str1);
}
}
3. String 객체의 '+' 연산
-문자열 연결하기
1) 문자열 +문자열 연산
- String 객체의 내용을 변경할 수 없음
- 메모리에는 각각의 문자열 객체가 만들어짐
- "안녕"+"하세요"가 수행될 때 객체 하나가 새롭게 만들어지며
- "안녕하세요"+"!"가 수행될 때 또 객체가 만들어짐
- 최종적으로 참조 변수에는 마지막 객체의 위칫값이 저장
String str1 = "안녕" +"하세요" +"!";
System.out.println(str1); //안녕하세요!
String str2 = "반갑";
str2 += "습니다";
str2 += "!";
System.out.println(str2); //반갑습니다!
System.out.println();
2) 문자열 +기본 자료형 또는 기본 자료형 + 문자열 연산
-기본 자료형과 문자열을 연산하려면 먼저 기본 자료형을 문자열로 바꾸고, 이어서 '문자열+문자열'연산 수행
System.out.println(1+"안녕"); //1안녕
System.out.println(1+"안녕"+2); //1안녕2
System.out.println("안녕"+1+2); //안녕12
System.out.println(1+2+"안녕"); //3안녕
-1+2는 '정수+정수'이므로 문자열로 변환되지 않음
4. String 클래스의 주요 메서드
1) String 클래스의 주요 메서드 1
- length() :문자열의 길이를 리턴
- charAt() : 문자열에서 특정 인덱스에 위치해 있는 문자를 알아냄
- indexOf() : 문자열에서 특정 문자나 특정 문자열을 앞에서 부터 찾아 위칫값을 알아냄
- lastIndexOf() : 문자열에서 특정 문자나 특정 문자열을 뒤에서 부터 찾아 위칫값을 알아냄
- String.valueOf() : 기본 자료형을 문자열로 바꾸는 정적 메서드
- concat() : 2개의 문자열을 연결. +연산자와 동일한 기능 수행
- getBytes() : 문자열을 byte 배열로 변환. 자바 입출력 과정에서 주로 사용
- toCharArray() : 문자열을 char 배열로 반환. 자바 입출력 과정에서 주로 사용
package Stringex;
import java.util.Arrays;
public class Stringex3 {
public static void main(String[] args) {
//문자열 길이
String str1 ="Hello Java";
String str2 = "안녕하세요! 반갑습니다.";
System.out.println(str1.length());
System.out.println(str2.length()); //한글, 영문 구분 없이 한 문자당 1개의 크기를 가짐
System.out.println();
//문자열 검색
//@charA()
System.out.println(str1.charAt(1));
System.out.println(str2.charAt(1));
System.out.println();
//@indexOf(), lastIndexOf(0)
System.out.println(str1.indexOf('a'));//앞에서부터 첫 번째 'a'가 위치한 인덱스
System.out.println(str1.lastIndexOf('a')); //뒤에서 부터 첫 번째 'a'가 위치한 인덱스
System.out.println(str1.indexOf('a',8));
System.out.println(str1.lastIndexOf('a',8));
System.out.println(str1.indexOf("java"));
System.out.println(str1.lastIndexOf("java"));
System.out.println(str2.indexOf("하세요"));
System.out.println(str2.lastIndexOf("하세요"));
System.out.println(str1.indexOf("Bye"));
System.out.println(str2.lastIndexOf("고맙습니다"));
System.out.println();
//문자열 변환 및 연결
//@String.valueOf(기본 자료형) : 기본 자료형 -> 문자열 변환
String str3 = String.valueOf(2.3);
String str4 = String.valueOf(false);
System.out.println(str3);
System.out.println(str4);
//@concat() :문자열 연결
String str5 = str3.concat(str4);
System.out.println(str5);
//String.valueOf() + concat()
String str6 = "안녕" + 3;
String str7 = "안녕".concat(String.valueOf(3));
//문자열을 byte[] 또는 char[]로 변환
String str8 = "Hello Java!";
String str9 = "안녕하세요";
//@getBytes() : 문자열 -> byte[]로 변환
byte[] array1 = str8.getBytes();
byte[] array2 = str9.getBytes();
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
//@toCharArray() :문자열 -> char[] 변환
char[] array3 = str8.toCharArray();
char[] array4 = str9.toCharArray();
System.out.println(Arrays.toString(array3));
System.out.println(Arrays.toString(array4));
}
}
2) String 메서드의 주요 메서드 2
- toLowerCase() : 영문 문자를 모두 소문자로 변환
- toUpperCase() : 영문 문자를 모두 대문자로 변환
- replace() : 일부 문자열을 다른 문자열로 대체
- substring() : 문자열의 일부만을 포함하는 새로운 문자열 객체를 생성
- split() : 특정 기호를 기준으로 문자열을 분리
- trim() : 문자열의 좌우 공백을 제거
- equals() : 두 문자열의 위칫값이 아닌 실제 데이터 값을 비교. 이때 대소문자로 구분
- equalslgnoreCase() : 두 문자열의 위칫값이 아닌 실제 데이터값을 비교. 이때 대소문자를 구분하지 않는다.
package Stringex;
import java.util.Arrays;
public class Stringex4 {
public static void main(String[] args) {
//문자열 수정
//@toLowerCase(), toUpperCase()
String str1 = "Java Study";
System.out.println(str1.toLowerCase());
System.out.println(str1.toUpperCase());
//@replace()
System.out.println(str1.replace("Study","공부")); //"Study" 문자열을 공부로 변경
//@substring()
System.out.println(str1.substring(0,5));
//@split()
String[] strArray ="abc/def-ghi jkl".split("/|-|");
System.out.println(Arrays.toString(strArray));
//@trim()
System.out.println(" abc ".trim());
System.out.println();
//문자열의 내용 비교
String str2 = new String("Java"); //new로 생성해 메모리에 별도의 객체로 생성
String str3 = new String("Java");
String str4 = new String("java");
//@Stack 메모리 비교(==) : 위치(번지) 비교
System.out.println(str2 == str3);
System.out.println(str3 == str4);
System.out.println(str4 == str2);
//@equals(), @equalsIgnoreCase() : 내용 비교
System.out.println(str2.equals(str3));
System.out.println(str3.equals(str4));
System.out.println(str3.equalsIgnoreCase(str4));
}
}
'Java' 카테고리의 다른 글
11-1장 final 제어자 (0) | 2023.06.02 |
---|---|
6-1 장 클래스와 객체의 개념 (2) | 2023.04.24 |
5-1장 배열 (2) (0) | 2023.04.22 |
5-1장 배열(1) (0) | 2023.04.22 |
4-2장 제어 키워드 (0) | 2023.04.21 |