문자와 문자열
이름이 비슷하지만, 문자와 문자열은 완전히 다른 개념이다. 문자는 'A'와 같이 한 글자를 나타내는 용어이고, 문자열은 "안녕하세요" 같은 긴 문장을 나타내는 용어이다.
1. 문자(Character)
- Character.isUpperCase(char);
입력한 char이 대문자면 true, 그 외 문자들(소문자, 숫자, 특수기호)이면 false 반환 - Character.isLowerCase(char);
입력한 char이 소문자면 true, 그 외 문자들(대문자, 숫자, 특수기호)이면 false 반환 - Character.isDigit(char);
입력한 char이 숫자이면 true, 그 외 문자들(영문자, 특수기호)이면 false 반환
2. 문자열(String)
char배열에 여러 가지 기능을 추가하여 확장한 것이 문자열(String)이다.
2-1. String은 불변(Immutable) 객체
한번 정해진 값은 변하지 않는다는 뜻이다.
String a = "abc";
a = a + "d";
// 기존 a의 문자열 abc를 변경해서 abcd로 만들지 않고,
// abcd라는 문자열 객체를 새로 생성해서 a에 넣는다.
2-2. 주요 메서드
- string.charAt
문자열에서 해당 위치에 있는 문자 리턴 - string.length
문자열의 길이 리턴 - string.substring
부분 문자열 리턴 - string.equals
문자열의 내용이 같은지 확인 true / false - string.toCharArray
문자열을 char[]로 변환해서 리턴 - string.concat("a")
string에 "a"를 뒤쪽에 이어 붙여 리턴 - string.contains('a')
string에 "a"의 포함 여부 true/false 리턴 - string.endsWith("a")
string이 "a"로 끝나는 지 여부 true/false 리턴 - String.charAt(int)
문자열의 int번째 문자 반환, 만약 int 자리에 실수가 와도 int로 자동 변환됨 - String.length()
문자열의 길이 리턴 - String(배열)
배열의 값을 모두 이어 붙여 String 으로 리턴 - String(배열, 시작위치, 길이)
시작위치로부터 길이만큼을 이어 붙여 String 으로 리턴
주요 메서드 사용 예시
package jun04;
public class String01 {
public static void main(String[] args) {
String str = "Hi";
String str2 = new String("Hi");
str = str + " java";
System.out.println(str);// Hi java
byte[] byteArr = { 97, 98, 99, 100 }; // 직접 선언할 때는, { } 사용
//String(배열) : //97을 a, 98을 b... 로 변환하고 모두 이어 붙여 String에 저장
String str3 = new String(byteArr);
System.out.println(str3);//abcd
//String(배열, 시작 위치, 길이) : 시작위치로부터 길이에 해당하는 부분을 이어 붙여 String에 저장
String str4 = new String(byteArr, 0, 3);
System.out.println(str4);//abc
String str5 = new String(byteArr, 1, 3);
System.out.println(str5);//bcd
System.out.println(str5.length());//3
System.out.println(str5.charAt(str5.length() - 1));//d
//string.concat("a"): 뒤에 "a" 이어붙이기
str2 = str2.concat(" JAVA");
System.out.println(str2);//Hi JAVA
//string.contains("a"): "a" 포함 여부 true/false
boolean b1 = str2.contains("HI");
//대소문자 구분하기 때문에 false
System.out.println(b1);//false
//string.endsWith("a"): "a"로 끝나는 지 여부 true/false
System.out.println(str2.endsWith("A"));
}
}
2-3 new String vs " " 생성 비교
문자열을 생성하는 방법은 두 가지이다.
- String str1 = new String("Hi");
new를 사용해서 String 인스턴스 생성
→ str1에 새롭게 메모리 할당, 할 때 마다 새로운 주소를 받으므로 매번 주소값이 다르다. - String str2 = "Hi";
String str1 = "Hi";
String str2 = new String("Hi");
//String str2 = "Hi";
System.out.println(str1); //Hi
System.out.println(str2); //Hi
if (str1 == str2) {//객체에서 == 같은 객체야? (주소값 비교)
System.out.println("같아요");
} else {
System.out.println("달라요"); //달라요
}
if(str1.equals(str2)) {
System.out.println("같아요."); //같아요
}else {
System.out.println("달라요");
}
▲ 위와 같이, ==로 str1과 str2이 같은지 물어보면 주소값이 다르기 때문에 "달라요"가 출력된다.
.equals 로 str1과 str2이 같은지 물어보면 문자열의 내용은 같기 때문에 "같아요"가 출력된다.
package jun04;
public class Object01 {
public static void main(String[] args) {
String str1 = "Hi";
String str2 = new String("Hi");
//String str2 = "Hi";
str2 = str1;
System.out.println(str1 == str2); //true
System.out.println(str1.getBytes());//[B@5d22bbb7 str1 == str2 라면서 왜 다르지?, str1은 변한 게 없는데 왜 달라졌을까
System.out.println(str2.getBytes());//[B@41a4555e str1 == str2 라면서 왜 다르지?
System.out.println(str1.hashCode());//2337
System.out.println(str2.hashCode());//2337
str1 = "Hello";
str1 = "world";
//String의 값은 불변
System.out.println(str1 == str2); //false
for (int i = 0; i < 10; i++) {
str1 += i + "";
}
str1 = "Hello";
str2 = "Hello";
//str2 = str1;
//유니코드 문자열을 바이트코드로
System.out.println(str1.getBytes());//[B@3830f1c0
System.out.println(str2.getBytes());//[B@39ed3c8d
System.out.println(str1.getClass());//class java.lang.String
System.out.println(str2.getClass());//class java.lang.String
// 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴
System.out.println(str1.hashCode());//69609650
System.out.println(str2.hashCode());//69609650
}
}
▲ 내용이 같으면, 해시 코드의 값은 같다. 그러나 아직 왜 str2 = str1; 을 하였는데도 불구하고 왜 getBytes()의 결과 값은 다르게 나오는 지 이해할 수 없었다.
※ 해시코드의 성질
입력 값이 같으면 해시 코드의 값도 같다.
입력 값 → 해시함수 → 해시코드(출력 값)
예제 01. 문자열에서 특정 문자 갯수 골라내기
package jun04;
public class String01 {
public static void main(String[] args) {
String temp = "asfjhagie;woahjaklsadhfajdksafaewbalvgjaslfha";
//a는 총 몇 개?
int result = 0;
for (int i = 0; i < temp.length(); i++) {
if(temp.charAt(i) == 'a') {
result++;
}
}
System.out.println("a가 " + result + "개 있습니다.");//a가 11개 있습니다.
}
}
예제 02. 이메일에서 id, domain 구분하기
package jun04;
public class String01 {
public static void main(String[] args) {
String email = "gggg1@kakao.com";
//string.indexOf('a'): 'a'의 인덱스 리턴, 없으면 -1 리턴
System.out.println(email.indexOf('@'));//8
System.out.println(email.contains("@"));//true
//id 출력
System.out.println(email.substring(0, email.indexOf('@')));//gggg1
//domain 출력
System.out.println(email.substring(email.indexOf('@') + 1));//kakao.com
}
}
'BackEnd > Java' 카테고리의 다른 글
[Java] 동적가변배열 Dynamic Array (0) | 2021.07.01 |
---|---|
[Java] 날짜 형식 Date Format (0) | 2021.07.01 |
[Java] 다차원 배열 Multi Array (0) | 2021.07.01 |
[Java] 배열 Array (0) | 2021.07.01 |
[Java] 무한 반복문 While, Do While (0) | 2021.07.01 |
댓글