본문 바로가기

자바(JAVA)
[자바(Java)] String

int a; 정수형 변수
String str; 문자형 클래스의 레퍼런스(참조) 변수


// String(문자열) 타입

==> object(객체)
==> 문자열은 String 객체로 생성됨.

   String name = "홍길동"; // 객체로 생성되고, 각각 대입된다(주소가).
   String hobby = "여행";

~ name, hobby : stack(스택) 영역에 저장됨.
~ "홍길동", "여행" : heap(힙) 영역에 저장됨.

   String name = "홍길동"; 
   String hobby = "여행";

   String name1 = "홍길동";
   String name2= "홍길동";

** String 객체가 같을 경우 heap 영역의 주소를 공유한다.

package ex01.sample01;

public class Heap_Stack {

	public static void main(String[] args) {
		/*int[] arr1;
		int[] arr2;
		int[] arr3;
		
		arr1 = new int[] {1,2,3}; //배열을 생성해서 arr1에 대입
		arr2 = new int[] {1,2,3}; //배열을 생성해서 arr2에 대입
		arr3 = arr2;
		
		System.out.println(arr1 == arr2); //false
		System.out.println(arr2 == arr3); //true*/
		
		String name = "길동";
		name = null;
		
		String name1 = "순신";
		String name2 = name1	;
		name1 = null;
		System.out.println("name2 : " + name2);	
			
	}

}


** null: 참조하는 것이 없다.


   String name1 = new String("홍길동");
   String name2 = "홍길동"

** new 연산자를 이용할 경우 새롭게 만들기 때문에 주소가 달라진다.


//문자열 함수

문자열 함수


- str.length() : 문자열의 길이값 반환

package ex01.sample01;

public class String_01 {

	public static void main(String[] args) {
		
		//str.length()
		
		String str = "Java Program";
		int len; // 문자열의 길이값을 저장하는 변수 선언
		
		len = str.length();
		
		System.out.printf("문자열 : %s\n", str);
		System.out.printf("문자열의 길이 : %d\n", len);

	}

}


- str.charAt(index) : 문자열의 index에 해당하는 값 추출

package ex01.sample01;

import java.util.Scanner;

public class String_02 {

	public static void main(String[] args) {
		
		//str.charAt()
		
		Scanner sc = new Scanner(System.in);
		String str;
		
		System.out.print("문자열을 입력 : ");
		str = sc.nextLine();
		
		// a ==> *, o ==> ^  특정 값을 받으면 다른 값으로 변경하기 
		System.out.print("문자열 출력 : ");	
		for(int i = 0; i < str.length(); i++) {
			if(str.charAt(i) == 'a' )
				System.out.printf("%c", '^');
			else
				System.out.printf("%c", str.charAt(i));
		
		}
	
	}

}


- str.indexOf(), str.lastIndexof() : 특정 문자열의 위치값 반환
   ~ 찾고자 하는 문자열이 없을 때에는 -1을 반환

package ex01.sample01;

public class String_03 {

	public static void main(String[] args) {
		
		// indexOf(), lastIndexOf() : 특정 문자열의 위치를 찾음
		// Java Programming Java Programming Java
		// 찾고자 하는 문자열이 없을 때에는 -1을 반환
		
		String str = "Java Programming Java";
		
		System.out.println("문자열 : " + str);
		
		System.out.print("제일 처음 나오는 Java의 위치는 : ");
		System.out.println(str.indexOf("Java"));
		
		System.out.print("제일 마지막으로 나오는 Java의 위치는 : ");
		System.out.println(str.lastIndexOf("Java"));

	}

}


- str.toUpperCase() :  소문자를 대문자로 변환

- str.toLowerCase() :  대문자를 소문자로 변환

- str.trim() : 앞뒤 공백 제거

package ex01.sample01;

public class String_04 {

	public static void main(String[] args) {
		// 대소문자 변환, 앞뒤 공백 문자 제거
		
		String str = "  Java  Program  ";
		
		System.out.println("문자열 : [" + str + "]");
		System.out.println("대문자 : [" + str.toUpperCase()+"]");
		System.out.println("대문자 : [" + str.toLowerCase()+"]");
		System.out.println("공백 제거 : [" + str.trim()+"]");
		
		String result = "";
		for(int i=0; i<str.length(); i++) {			
			if(str.charAt(i) != ' ')
				result += str.charAt(i);
		}		
		System.out.println("모든 공백 제거 : [" + result +"]");
		
	}

}


-
 str.replace(charSequnce target, CharSequence replacement) :  기존의 문자를 원하는 문자로 치환

- str.replaceFirst(String regex, String replacement) :  여러 개의 문자들이 일치할 경우, 가장 앞에서 일치하는 부분만 원하는 문자로 치환

package com.sorrel012.string;

import java.util.Scanner;

public class Q11 {
	
	public String solution(String str) {
		
		for(int i = 0; i < str.length(); i++) {

			char c = str.charAt(i);
			int count = 0;
			
			for(int j = i; j < str.length(); j++) {
				
				if(str.charAt(j) == c) {
					count++;
				} else {
					break;
				}
			}
			
			if(count != 1) {
				String tmp = "";
				for(int j = 0; j < count; j++) {
					tmp += c;
				}
				str = str.replaceFirst(tmp, c+String.valueOf(count));
			}
			
		}
		
		return str;
	}
	
	public static void main(String[] args) {

		Q11 t = new Q11();
		
		Scanner scan = new Scanner(System.in);
		
		String str = scan.nextLine();
		
		System.out.print(t.solution(str));

	} //main
	
}


- str.substring(beginIndex, endIndes): 문자열 슬라이싱 역할을 함.
   ~ 시작위치는 포함하지만, 끝 위치는 포함하지 않는다.(파이썬 range함수처럼)

import java.util.*;
 
public class Ex01 {
    public static void main(String[] args){
    String str = "abchefg"; 
    System.out.println(str.replace('h','d'));
    str = str.replace('h','d');
    System.out.println(str.substring(2, 6));
    }    
}


- str.equals() : 문자열의 값을 비교하여 결과를 출력(true | false)
 
** str.equals() vs ==
- str.equals() : 문자열의 값만 비교하여 결과를 출력
- == : 문자열의 값뿐만 아니라 저장된 위치도 비교하여 결과를 출력

★ 문자열을 비교하는 경우에는 equals()를 사용하는 것이 좋다.

package ex01.sample01;

public class String_05 {

	public static void main(String[] args) {
		
		// == vs str.equals()
		// str.equals() : 문자열의 값만 비교하여 결과를 출력
		// == : 문자열의 값뿐만 아니라 저장된 위치도 비교하여 결과를 출력
		// 문자열을 비교하는 경우에는 equals()를 사용하는 것이 좋다.
		
		String str1 = "Java Programming";
		String str2 = "Java Programming";
		String str3 = new String("Java Programming");
		
		System.out.println("문자열 str1 : [" + str1 + "]");
		System.out.println("문자열 str2 : [" + str2 + "]");
		System.out.println("문자열 str3 : [" + str3 + "]\n");
		
		System.out.println("str1 == str2의 결과 : \t" + (str1 == str2)); 
		System.out.println("str1.equlas(str2)의 결과 :" + str1.equals(str2));
		
		System.out.println("str1 == str3의 결과 : \t" + (str1 == str3)); 
		System.out.println("str1.equlas(str3)의 결과 :" + str1.equals(str3));
	}

}


- str.contains(str2) : 해당 문자열을 포함하고 있는지 true/false로 반환

- str.repeat(횟수) : 해당 문자열을 지정한 횟수만큼 반복

- String.format("%", ) : printf와 비슷한 역할을 하지만 출력용이 아닌 조작용이다.
    ~ String msg = String.format("오늘은 %s입니다.", "수요일")


//StringBuilder

- StringBuilder 변수명 = new StringBuilder(문자열);

- 배열 처리를 하여 조작이 가능하다. 

- 참조변수명.apped(String) : 문자열 연결
    ~  StringBuilder txt2 = new StringBuilder("홍길동");
         txt2.append(".");