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);
}
}
'java > java.lang' 카테고리의 다른 글
[java/lang] 6. Exception 클래스 (0) | 2024.06.16 |
---|---|
[java/lang] 5. StringBuffer 클래스 (0) | 2024.06.15 |
[java/lang] 4. Wrapper 클래스 (1) | 2024.06.15 |
[java/lang] 2. System 클래스 (1) | 2024.06.14 |
[java/lang] 1. Java API (0) | 2024.06.14 |