본문 바로가기

Java

5-2장 문자열을 저장하는 String

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