본문 바로가기
BackEnd/Java

[Java] 문자(Character), 문자열(String)

by summer_light 2021. 7. 1.

문자와 문자열

이름이 비슷하지만, 문자와 문자열은 완전히 다른 개념이다. 문자는 '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에 넣는다.

 

실제로, Open Declaration을 하여 String 클래스를 확인해보면 'final'이 붙어 있다.

 

 

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  " " 생성 비교

문자열을 생성하는 방법은 두 가지이다. 

  1. String str1 = new String("Hi");
    new를 사용해서 String 인스턴스 생성
    → str1에 새롭게 메모리 할당, 할 때 마다 새로운 주소를 받으므로 매번 주소값이 다르다.
  2. 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

댓글