java/java.lang

[java/lang] 3. String 클래스

jeri 2024. 6. 14. 14:15
반응형

01. String 클래스의 개념

  • 문자열을 표현하기 위한 클래스
  • 문자열을 저장하기 위한 객체 생성
  • String 객체에 저장된 문자열에 대한 다양한 기능을 메소드로 제공
  • String 객체는 문자열을 내부적으로 byte 배열로 처리하여 배열 요소에 문자를 하나씩 저장
  • 필요하다면 문자열 vs byte배열 서로 저장 가능

String클래스 vs StringBuffer클래스

  • String클래스 : 기존 값은 놔두고 따로 처리함
  • StringBuffer클래스 : 갖고 있는 값 자체를 처리함
  • 문자열처리속도는 StringBuffer가 더 빠름

 

 

 

02. String객체 생성 방법

1. " " 기호를 사용해 String 객체 생성하기

  • 메모리의 정적영역(메소드영역)에 딱 한번만 객체 생성
  • 즉, 정적영역(메소드영역)에는 동일한 문자열이 저장된 String 객체를 딱 하나만 생성함
  • " " 기호를 사용하여 String 객체를 표현한 경우 동일한 문자열이 저장된 String 객체가 존재하면 기존 String 객체를 제공받아 사용
  • String 객체 재사용
String str1="ABC"; //String 객체를 생성하여 참조변수에 저장
String str2="ABC"; //재사용

2. new 연산자로 생성자를 호출해 String 객체 생성하기

  • 메모리의 Heap 영역에 new연산자 사용할 때마다 객체 생성
String str3=new String("ABC"); //새로운 객체

3. 비교연산자 이용해 메모리 주소 비교하기

  • 참조변수를 비교연산자로 비교한 경우 참조변수에 저장된 객체의 메모리 주소를 비교
  • String 객체의 문자열을 비교하는 것이 아니라 String 객체의 메모리 주소 비교
if(str1==str2) {
	System.out.println("str1 변수와 str2 변수에 저장된 String 객체의 메모리 주소가 같습니다.");
} else {
	System.out.println("str1 변수와 str2 변수에 저장된 String 객체의 메모리 주소가 다릅니다.");
}
//str1 변수와 str2 변수에 저장된 String 객체의 메모리 주소가 같습니다.


if(str1==str3) {
	System.out.println("str1 변수와 str3 변수에 저장된 String 객체의 메모리 주소가 같습니다.");
} else {
	System.out.println("str1 변수와 str3 변수에 저장된 String 객체의 메모리 주소가 다릅니다.");
}
//str1 변수와 str3 변수에 저장된 String 객체의 메모리 주소가 다릅니다.

 

 

 

03. String객체의 메소드

String.toString() - 문자열반환, 생략가능

  • String 객체에 저장된 문자열을 반환하는 메소드참조변수를 출력할 경우
  • 자동으로 toString() 메소드 호출 - 메소드 호출 생략 가능
String str1="ABC";
System.out.println("str1.toString() = "+str1.toString());
//str1.toString() = ABC
System.out.println("str1 = "+str1);
//str1 = ABC

 

String.equals(String str) - 문자열비교

  • String 객체에 저장된 문자열과 매개변수로 전달받은 문자열을 비교하여 다른 경우
  • false를 반환하고 같은 경우 true를 반환하는 메소드
  • 단, 비교문자열의 영문자는 대소문자를 구분함
String str1="ABC";
String str2="ABC";
String str3=new String("ABC");
String str4="abc"

if(str1.equals(str3)) {
	System.out.println("str1 변수와 str3 변수에 저장된 String 객체의 문자열이 같습니다.");
} else {
	System.out.println("str1 변수와 str3 변수에 저장된 String 객체의 문자열이 다릅니다.");
}
//str1 변수와 str3 변수에 저장된 String 객체의 문자열이 같습니다.

if(str1.equals(str4)) {
	System.out.println("str1 변수와 str4 변수에 저장된 String 객체의 문자열이 같습니다.");
} else {
	System.out.println("str1 변수와 str4 변수에 저장된 String 객체의 문자열이 다릅니다.");
}
//str1 변수와 str4 변수에 저장된 String 객체의 문자열이 다릅니다.

 

String.equalsIgnoreCase(String str) - 문자열비교 (대소문자구분x)

  • String 객체에 저장된 문자열과 매개변수로 전달받은 문자열을 대소문자를 구분없이 비교하여
  • 다른 경우 false를 반환하고 같은 경우 true를 반환하는 메소드
String str1="ABC";
String str2="ABC";
String str3=new String("ABC");
String str4="abc"

if(str1.equalsIgnoreCase(str4)) {
	System.out.println("str1 변수와 str4 변수에 저장된 String 객체의 문자열이 같습니다.");
} else {
	System.out.println("str1 변수와 str4 변수에 저장된 String 객체의 문자열이 다릅니다.");
}
//str1 변수와 str4 변수에 저장된 String 객체의 문자열이 같습니다.

 

String.compareTo(String str) - 문자열 크기 비교

  • String 객체에 저장된 문자열과 매개변수로 전달받은 문자열을 비교하여,
  • String 객체의 문자열이 큰 경우 - 양수 반환
  • 매개변수의 문자열이 큰 경우 - 음수 반환
  • String 객체의 문자열과 매개변수의 문자열이 같은 경우 - 0 반환하는 메소드
  • 🍯 사전을 생각하자!! - 대문자가 앞에, 소문자가 뒤에
String str1="ABC";
String str2="ABC";
String str3=new String("ABC");
String str4="abc"

if(str1.compareTo(str4)>0) {
	System.out.println("str1 변수에 저장된 String 객체의 문자열이 str4 변수에 저장된 String 객체의 문자열보다 큽니다.");
} else if(str1.compareTo(str4)<0) {
	System.out.println("str1 변수에 저장된 String 객체의 문자열이 str4 변수에 저장된 String 객체의 문자열보다 작습니다.");
} else {
	System.out.println("str1 변수와 str4 변수에 저장된 String 객체의 문자열이 같습니다.");
}
//str1 변수에 저장된 String 객체의 문자열이 str4 변수에 저장된 String 객체의 문자열보다 작습니다.

 

String.getBytes( ) - byte 배열로 반환

  • String 객체에 저장된 문자열을 byte 배열로 변환하여 반환하는 메소드
  • byte 배열의 요소에는 문자열의 문자 코드값(정수값)이 차례대로 저장
byte[] array=str1.getBytes();
for(byte ch:array) {
	System.out.print(ch);
}
//656667


for(byte ch:array) {
	//byte 배열 요소값을 문자로 형변환하여 출력
	System.out.print((char)ch);
}
//ABC

 

String.length() - 문자갯수 반환

  • String객체에 저장된 문자열의 문자 갯수를 반환하는 메소드
String str5 = "ABCDEFG";
System.out.println("문자열의 문자 갯수 = "+ str5.length());
//문자열의 문자 갯수 = 7

 

 

String.charAt(int Index) - 문자위치의 문자로 반환

  • String 객체에 저장된 문자열에서 첨자(Index) 0,1,2,3... 위치의 문자를 반환하는 메소드
String str5 = "ABCDEFG";
System.out.println("두번째 위치의 문자 = "+ str5.charAt(1));
//두번째 위치의 문자 = B

 

String.indexOf(String str) - 문자위치의 인덱스로 반환

String.lastIndexOf(String str) - 뒤에서부터 문자위치의 인덱스로 반환

  • String 객체에 저장된 문자열에서 매개변수에 저장된 문자열(문자)을 검색하여 시작위치를 첨자로 반환하는 메소드
  • 매개변수의 문자열을 찾을 수 없는 경우 : -1 반환
  • 원하는 문자가 있는지 검색할 때 사용
String str5 = "ABCDEFG";

System.out.println("A 문자열의 저장 위치 = "+ str5.indexOf("A"));
//A 문자열의 저장 위치 = 0
System.out.println("A 문자열의 저장 위치 = "+ str5.indexOf("EFG"));
//A 문자열의 저장 위치 = 4
System.out.println("A 문자열의 저장 위치 = "+ str5.indexOf("X"));
//A 문자열의 저장 위치 = -1

 

 

 

String.toUpperCase( ) - 대문자 문자열로 반환

  • String 객체에 저장된 문자열을 모두 대문자로 변환하여 반환하는 메소드
String str6 = "Java Programming";
System.out.println("str6 = "+ str6);
//str6 = Java Programming
System.out.println("str6(대문자) = "+ str6.toUpperCase());
//str6(대문자) = JAVA PROGRAMMING

 

String.toLowerCase( ) - 소문자 문자열로 반환

  • String 객체에 저장된 문자열을 모두 소문자로 변환하여 반환하는 메소드
String str6 = "Java Programming";
System.out.println("str6 = "+ str6);
//str6 = Java Programming
System.out.println("str6(소문자) = "+ str6.toLowerCase());
//str6(소문자) = java programming

 

 

String.trim( ) - 앞뒤 공백제거

  • String 객체에 저장된 문자열을 앞과 뒤에 존재하는 모든 공백을 제거하여 반환하는 메소드
  • 앞뒤 공백만 제거
  • 중간 공백은 제거 못함
String str7="    홍길동        ";
System.out.println("입력된 이름은 ["+str7+"]입니다.");
//입력된 이름은 [    홍길동        ]입니다.
System.out.println("입력된 이름은 ["+str7.trim()+"]입니다.");
//입력된 이름은 [홍길동]입니다.

 

String.replace(String regEX, String replacement) - 문자열 변경

  • String객체에 저장된 문자열에서 검색 문자열(정규표현식)을 찾을 치환 문자열로 변경하여 반환하는 메소드
String str8="  임  꺽  정  ";
System.out.println("입력된 이름은 ["+str8+"]입니다.");
//입력된 이름은 [  임  꺽  정  ]입니다.
System.out.println("입력된 이름은 ["+str8.replace(" ","").replace("꺽", "걱")+"]입니다.");
//입력된 이름은 [임걱정]입니다.

 

String.split(String regEX) - 문자열 분리

  • String객체에 저장된 문자열을 매개변수에 저장된 문자열(정규표현식)로 구분 분리하여 문자열 배열로 반환하는 메소드
  • 정규표현식에서 사용되는 메타문자를 일반문자로 처리하기 위해 \\를 사용하여 회피문자(Escape Character)로 처리하여 표현
  • ex) (””) → ("\\") (문자 별표로 인식함)
String str9="010-1234-5678";
System.out.println("전화번호 = "+str9); //전화번호 = 010-1234-5678
String[] numArray=str9.split("-");
System.out.println("전화번호 앞부분 = "+numArray[0]); //전화번호 앞부분 = 010
System.out.println("전화번호 중간부분 = "+numArray[1]); //전화번호 중간부분 = 1234
System.out.println("전화번호 뒷부분 = "+numArray[2]); //전화번호 뒷부분 = 5678


String str9="010*1234*5678";
System.out.println("전화번호 = "+str9); //전화번호 = 010*1234*5678

String[] numArray=str9.split("\\*");
System.out.println("전화번호 앞부분 = "+numArray[0]); //전화번호 앞부분 = 010
System.out.println("전화번호 중간부분 = "+numArray[1]); //전화번호 중간부분 = 1234
System.out.println("전화번호 뒷부분 = "+numArray[2]); //전화번호 뒷부분 = 5678

 

String.subString(int beginIndex, int endIndex) - 원하는 곳만 분리

  • String객체에 저장된 문자열에서 시작첨자(문자포함)부터 종료첨자(문자미포함)까지의 문자열을 분리하여 반환하는 메소드
String str9="010-1234-5678";

System.out.println("전화번호 = "+str9);
//전화번호 = 010-1234-5678

System.out.println("전화번호 앞부분 = "+str9.substring(0, 3));
//전화번호 앞부분 = 010

System.out.println("전화번호 중간부분 = "+str9.substring(4, 8));
//전화번호 중간부분 = 1234

System.out.println("전화번호 뒷부분 = "+str9.substring(9, 13));
//전화번호 뒷부분 = 5678


// => 매개변수에 시작첨자만 전달한 경우 시작첨자의 문자부터 문자열의 마지막 문자까지 분리하여 반환
System.out.println("전화번호 뒷부분 = "+str9.substring(9));
//전화번호 뒷부분 = 5678

 

String.valueOf(Object obj) - 모든값을 문자열로 변환

  • 매개변수로 전달된 값을 문자열(String 객체)로 변환하여 반환하는 메소드
String numString=String.valueOf(100);
System.out.println("numString = "+numString);
//numString = 100


// ""+값 또는 값+"" 형식으로 값을 문자열로 결합하여 변환 가능
String numString=100+"";
System.out.println("numString = "+numString);
//numString = 100

 

String.concat(String str) - 문자열 결합

+(문자열 결합연산자) - 문자열 결합 (concat보다 더 많이 이용됨)

 

 

 

 

 

04. PersonNumberApp프로그램

package xyz.itwill.lang;
import java.util.Scanner;

//키보드로 주민등록번호를 입력받아 생년월일과 성별을 출력하는 프로그램
//=> 주민번호는 14자리이며, 7번째 자리에 반드시 - 문자가 존재
//=> 비정상적인 주민번호가 입력될 경우 에러메세지 출력 후 재입력되도록 처리
//ex) 주민번호 입력[ex. 901225-1234567] >> 000101-4567890
//	 [결과]: 생년월일 = 2000년 01월 1일, 성별 = 여자
public class PersonNumberApp {
	public static void main(String[] args) {
	
		//1.
		Scanner scanner = new Scanner(System.in);

		//2.
		//주민번호를 입력받아 저장 >> 입력값 검증
		String number;
		while(true) {//입력값 검증을 위한 반복문
			System.out.print("주민번호 입력[ex. 901225-1234567] >> ");
			
			//number = scanner.nextLine().trim(); //입력된 문자열의 앞뒤 공백을 제거한 후 변수에 저장
			number=scanner.nextLine().replace(" ",""); //입력된 문자열의 모든 공백을 제거한 후 변수에 저장

			//정상적인 주민번호가 입력된 경우 반복문 종료
			//=> 1. 주민번호가 14자리여야함 , 2. 7번째 자리에 - 필수
			//if(number.length() == 14 && number.charAt(6) == '-' ) break;
			if(number.length() == 14 && number.indexOf("-") == 6 ) break;
			System.out.println("[에러]형식에 맞게 주민번호를 입력해 주세요.");
		}

		//3.
		scanner.close();

		//4.
		//사용자에게 정상적인 입력값 받은 뒤 원하는 출력값으로 만들기		
		String seperation = number.substring(7,8); //입력된 주민번호에서 8번째 자리의 문자를 분리하여 저장
		//System.out.println("seperation = "+seperation); // 제대로 분리되었는지 확인		
		String birthday = ""; //입력된 주민번호에서 생년월일을 분리하여 저장
		if(seperation.equals("1") || seperation.equals("2")) {
			//String.concat(String str) : String 객체에 저장된 문자열에 매개변수에 저장된 문자열을 결합하여 반환하는 메소드 대신  + 연산자로 문자열을 결합하는 것을 권장
			//birthday=birthday.concat("19");
			birthday += "19";
		} else if(seperation.equals("3") || seperation.equals("4")){
			birthday += "20";
		}
		birthday += number.substring(0,2) + "년 ";
		birthday += number.substring(2,4) + "월 ";
		birthday += number.substring(4,6) + "일 ";
		//System.out.println("[결과] 생년월일 = " + birthday);

		String gender=""; //입력된 주민번호에서 성별을 구분하여 저장
		if(seperation.equals("1") || seperation.equals("3")) {
			gender += "남자";
		} else if(seperation.equals("2") || seperation.equals("4")){
			gender += "여자";
		}
		System.out.println("[결과] 생년월일 = " + birthday + ", 성별 = "+ gender);

	}
}
반응형