h-i-s-t-o-r-y

[Java] String 클래스 - 문자열 관련 메서드들 정리 본문

Java

[Java] String 클래스 - 문자열 관련 메서드들 정리

H' 2021. 7. 17. 23:59
/*



1. 얕은복사( shallow clone )과 깊은복사( deep clone ) 개념 설명하세요.
참조하고 있는 객체가 복사되지 않으면 얕은 복사,
참조하고 있는 객체도 복사되면 깊은 복사




2-1. 클래스로더(ClassLoader) 란? 
Class객체를 생성하고 클래스파일을 메모리에 동적으로 로드하는 역할
2-2. Class 객체란?
그 클래스의 모든 정보를 담고 있는 객체이다. 클래스당 하나만 존재한다.
2-3. Class 객체를 얻는 2가지 방법
  ㄱ.객체명.getClass() 메서드
  ㄴ. Class.forName(클래스명)
    
3. String 클래스의 가장 큰 특징은 ? 
* 변경이 불가능하다.
값이 변경되는 게 아니라 새로 만들어진 객체를 참조하는 것
days21.Ex04

4. String 클래스 대신에 StringBuffer와 StringBuilder 클래스를 사용하는 경우는?
String 클래스가 변경이 불가능하기 때문에
문자열을 수정,삭제,추가 하는 작업들을 하고자 할 때
StringBuffer, StringBuilder를 사용한다.
days21.Ex05_02



5. StringBuffer와 StringBuilder 클래스의 차이점은 ? 
StringBuffer는 동기화 되어 있다. 멀티 쓰레드에 안전하다.
동기화 처리 여부 예.화장실 있는 사람이 쓰고(잠금) 나와야지 사용할 수 있는 것


6. 아래 코딩에 대해서 각 라인별 주석(설명)을 적으세요. 
	p.472 문자 인코딩 변환
		byte[]  utf8Arr = "가".getBytes("UTF-8");	 //문자열을 UTF-8로 변환
		for (byte b : utf8Arr) {		
			System.out.println(b);		//
		}
				 
		String str = new String(utf8Arr, "UTF-8");	//byte배열을 문자열로 변환
		 
7. 아래 경로 path 변수에서 확장자명과 파일명을 분리해서 출력하세요. 
  String path  ="c:\\test\\sample\\sample.html";  
  String fileName, ext ;// 파일명과 확장자명을 저장할 변수
  
  [풀이]
 	String path = "c:\\test\\sample\\sample.html";  
	String fileName, ext ;// 파일명과 확장자명을 저장할 변수
	//		sample	html
	
	int idx = path.lastIndexOf("\\") + 1;
	System.out.println(path.substring(idx));
	
	
	String [] datas = path.substring(idx).split("\\.");
	fileName = datas[0];
	ext = datas[1];
	
	System.out.println(fileName);
	System.out.println(ext);
	
	
	// regex 정규표현식
	// "".split(regex);
	// \d	[0-9]
	// \D	[^0-9]	0~9까지 숫자를 ^제외한^
	// .	모든 문자
	// \.	문자 점(.)
  


  
8. String msg = "System.out.println( 총페이지수 )";
	[풀이]
		String msg = "System.out.println( 총페이지수 )";
		StringBuffer sb = new StringBuffer(msg);
//		  ㄱ. println 문자열을 print 문자열로 변경하기
		int start = sb.indexOf("println");
		int end = start + "println".length();
		sb.replace(start, end, "print");
		System.out.println(sb);
		
//		  ㄴ. 총페이지수 앞 뒤에 "" 쌍따옴표 삽입하기
		int offset = sb.indexOf("총페이지수");
		sb.insert(offset, '"');
		offset += "총페이지수".length() + 1;
		sb.insert(offset, '"');
		System.out.println(sb);
		
//		  ㄷ. 문자열 맨 뒤에 ;(세미콜론) 붙이기
		sb.append(";");
				
		sb.insert(sb.length(), ";");
		System.out.println(sb);
		
//		  ㄹ. 총페이지수 의 총 한 문자 삭제하기.
		// sb.setCharAt(index, ch);
		sb.deleteCharAt(sb.indexOf("총페이지수"));
		System.out.println(sb);
		


  ㄱ. println 문자열을 print 문자열로 변경하기
		msg = msg.replace("println", "print");

  ㄴ. 총페이지수 앞 뒤에 "" 쌍따옴표 삽입하기
		int idx = msg.indexOf("총");
		int len = msg.length();
		System.out.println(msg.substring(0, idx) + "\"" +
			msg.substring(idx, idx+5) + "\"" + msg.substring(idx+5, len));
		
		// msg = msg.replace("총페이지수", "\"총페이지수\"");
		
  ㄷ. 문자열 맨 뒤에 ;(세미콜론) 붙이기
		msg = msg.concat(";");

  ㄹ. 총페이지수 의 총 한 문자 삭제하기.
		int idx = msg.indexOf("총");
		int len = msg.length();
		System.out.println(msg.substring(0, idx) + msg.substring(idx+1, len));
		
		// msg = msg.replace("총페이지수", "페이지수");
		// msg = msg.replace("총", "");	//모든 총이 사라짐 주의


  
9. String [] arr = { "dog,cat,bear" }
   위의 배열의 각 요소를 얻어와서 아래와 같이 출력하기
   
   [결과]
  <ol>
    <li>dog</li>
    <li>cat</li>
    <li>bear</li>
  </ol>

		String [] arr = { "dog,cat,bear" };
		String str = arr[0];
		String [] sArr = str.split(",");
		
		
		CharSequence prefix = "<ol>\n\t<li>";
		CharSequence delimiter = "</li>\n\t<li>";
		CharSequence suffix = "</li>\n</ol>";
		
		StringJoiner sj = new StringJoiner(delimiter, prefix, suffix);
		
		for (String s : sArr) {
			sj.add(s);
		}
		System.out.println(sj);



  
10. 전체 코딩을 하세요.  
	길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 
	예를들어 n이 4이면 "수박수박"을 리턴하고 
	3이라면 "수박수"를 리턴하면 됩니다.
	
	제한 조건
	n은 길이 10,000이하인 자연수입니다.
	입출력 예
	n	return
	3	"수박수"
	4	"수박수박"

	*** StringBuilder 클래스
	
	public static String solution(int n) {
		StringBuilder sb = new StringBuilder("");
		int quot = n / 2;
		int rmd = n % 2;
		for (int i = 1; i <= quot; i++) {
			sb.append("수박");
		}
		if (rmd == 1) sb.append("수");
		return new String(sb);
	}





11.  double money = 1234567.1234
   위의 머니를 소수점은 2자리 까지 출력하고 
   세 자리마다 콤마(,)를 찍어서 출력하세요.
   
   [출력]
   1,234,567.12

		double money = 1234567.1234;
		String s = String.format("%,.2f", money);
		System.out.println(s);
		
		 //형식화 클래스
		String pattern = "#,###.00";
		DecimalFormat df = new DecimalFormat(pattern);
		String data = df.format(money);
		System.out.println(data);

   
12. String data = "강현구, 권희준, 김나린, 김민희";
    위의 코딩을 StringTokenizer를 사용해서 
    아래와 같이 출력하세요.
    
	[출력]    
	강현구
	권희준
	김나린
	김민희
       


		String data = "강현구, 권희준, 김나린, 김민희";
		StringTokenizer st = new StringTokenizer(data);
		for (int i = 0; i < 4; i++) {			
			System.out.println(st.nextToken(", "));
		}


		String datas = "강현구, 권희준, 김나린, 김민희";
		StringTokenizer st = new StringTokenizer(datas,", ");
		while (st.hasMoreTokens()) {
			System.out.println(st.nextToken());
		}
		


*/
package days21;

public class Ex04 {

	public static void main(String[] args) {
		// 문자열 다루는 클래스 - [String클래스]
		// 업캐스팅:	CharSequence cseq = new String("홍길동");
		// String은 char타입의 배열 형태
		// 1. *** String클래스는 변경 불가능한 클래스이다. *** (가장큰특징)
		
		// String a = new String();		(X)
		
		String a = "a";		// == new String("a");
		String b = "a";
		
		// ** a의 값을 바꾸는 게 아니라 새로운 인스턴스(ab)의 주소값을 a에 참조
		a = a + b;
		
		//같은 주소값을 참조한다는 거..
		System.out.println(a == b);			//true
		System.out.println(a.equals(b));	//true
		
		// 그래서 1번의 이유로..
		// 2. 문자열 간 결합/추출/수정 등의 문자열을 다루고자 할 때는
		//	String클래스 대신 StringBuffer/StringBuilder클래스를 사용한다.
		
		

	}//main

}//class
package days21;

public class Ex04_02 {

	public static void main(String[] args) {
		// p.466
		String a = new String("a");
		String b = new String("a");
		
		System.out.println(a == b);			//false 다른객체참조
		System.out.println(a.equals(b));	//true	오버라이딩 된거라고 생각
		
		// 빈 문자열 (empty String)
		String s = "";
		// char [] s = new char[0];	이거 가능하다는 얘기
		// String s = null;	참조하고 있는게 없다는 의미 (구별)
		
		// 빈 문자
		char c = ' ';	//기본 초기화 (''가 아님)
		// char c = '\u0000' 널문자
		
	}

}
package days21;

import java.text.DecimalFormat;
import java.util.Arrays;

public class Ex05 {

	public static void main(String[] args) {
		String msg = "hi hello world~";
		
		/*
		// 1. 문자열 길이
		System.out.println(msg.length());	//12
		*/
		
		/*
		// 2. charAt(index)
		for (int i = 0; i < msg.length(); i++) {
			System.out.println(msg.charAt(i));
		}
		*/
		
		/*
		// 3. split()
		String regex = " ";
		//String [] result = msg.split(regex);
		String [] result = msg.split(regex, 2);	//limit-원래 더잘려도 2개까지만 자름
		System.out.println(Arrays.toString(result));
		*/
		
		/*
		// 4.
		int beginIndex = 5;
		//System.out.println(msg.substring(beginIndex));
		int endIndex = 10;
		System.out.println(msg.substring(beginIndex, endIndex));
		*/
		
		/*
		// 5. String <-> char [] 변환
		char [] msgs = msg.toCharArray();
		String s = new String(msgs);
		*/
		
		/*
		// 6. 0~100 정수 입력 (입력 유효성검사)
		String kor = "89";
		String rgx = "100|[1-9]?[0-9]";
		kor.matches(rgx);	//true/false
		*/
		
		/*
		// 7. *** String.join() ***
		String [] msgs1 = msg.split(" ");
		System.out.println(String.join("//", msgs1));
		// hi//hello//world~
		*/
		
		/*
		// 8. String.format()
		int no = 2;
		// 0002 4자리의 숫자형식의  문자열로 저장/출력하고 싶다
		System.out.println(String.format("%04d", no));
		// 0 : 10진수 (값이 없을때 0)
		String pattern = "0000";
		DecimalFormat df = new DecimalFormat(pattern);
		System.out.println(df.format(no));
		*/
		
		
		/*
		// 문제
		int money = 12345678;
		// 12,345,678 천자리마다 콤마 출력
		System.out.println(String.format("%,d", money));
		
		// p.540 DecimalFormat
		// 형식화클래스 중에서 숫자를 형식화하는 클래스
		// # : 10진수
		// \u00A4 : 통화기호
		// ₩12,345,678
		
		String pattern = "\u00A4#,###";
		DecimalFormat df = new DecimalFormat(pattern);
		System.out.println(df.format(money));
		*/
		
		
	}

}
package days21;

public class Ex05_02 {

	public static void main(String[] args) {
		
		String msg = "hello world~";
		
		// 9. 대소문자 변환 메서드
//		System.out.println(msg.toUpperCase());
//		System.out.println(msg.toLowerCase());
		
		// 10. indexOf()	lastIndexOf()
//		int idx = msg.indexOf("wo");
//		int idx = msg.lastIndexOf("wo");
//		System.out.println(idx);	//6
		
		// 11. replace()
//		System.out.println(msg.replace('l', 'x'));	//hexxo worxd~
//		System.out.println(msg.replace("hello", "hi"));	//hi world~
		//msg.replaceAll(정규표현식, replacement)
		//msg.replaceFirst(정규표현식, replacement)
//		System.out.println(msg.replaceFirst("hello", "XXX"));
		
		// 12. concat() 문자열 연결 메서드
//		"hi".concat("world");	//hiworld
//		System.out.println("hi".concat("world"));
		
		// 13. trim()
		
		// 14. contains() - boolean
//		System.out.println(msg.contains("hello"));	//true
		
		// 15. valueOf() 어떤 자료형이든 String 변환
//		System.out.println(String.valueOf(4));
//		System.out.println(String.valueOf(true));
//		System.out.println(String.valueOf(3.14));
//		System.out.println(String.valueOf('a'));
		
		
		// 16. startsWith()	endsWith()
//		String url1 = "www.naver.go.kr";
//		String url2 = "http://www.naver.com";
		
		// url 문자열이 http:// 로 시작하니 ?
//		String prefix = "http://";	//접두사
//		System.out.println(url1.startsWith(prefix));	//false
//		System.out.println(url2.startsWith(prefix));	//true
		
		// url 문자열이 .com 으로 끝나니 ?
//		String suffix = ".com";		//접미사
//		System.out.println(url1.endsWith(suffix));	//false
//		System.out.println(url2.endsWith(suffix));	//true
		
		
		
	}

}
package days21;

import java.io.File;

public class Ex05_03 {

	public static void main(String[] args) {
		
		// 17. compareTo() 두 문자열 비교 메서드 - 같으면0, 부호나와서 앞뒤문자 구별가능
		System.out.println("kenik".compareTo("keNIk"));	//32
		System.out.println("keNIk".compareTo("kenik"));	//-32
		
		//	   equals()		true/false
		System.out.println("kenik".equals("keNIk"));	//false
		System.out.println("kenik".toUpperCase().equals("keNIk".toUpperCase()));	//true
		// 대소문자 구분 X
		System.out.println("kenik".equalsIgnoreCase("keNIk"));	//true
		
		
		//
		String dir = "C:\\test\\sample";
		String fileName = "test.java";
		
		System.out.println(File.separator);			// "\"
		System.out.println(File.separatorChar);		// '\'
		System.out.println(File.pathSeparator);		// ";"
		
		String path = null;
		
		//char endChar = dir.charAt(dir.length()-1)
		//String endStr = dir.substring(dir.length()-1)
		if (dir.endsWith(File.separator)) {
			path = dir.concat(fileName);
		} else {
			path = dir.concat(File.separator).concat(fileName);
		}
		
		// C:\test\sample\test.java
		System.out.println(path);
		
		
		
	}

}
package days21;

import java.util.StringJoiner;

public class Ex05_04 {

	public static void main(String[] args) {
		// StringJoiner 클래스 *기억*
		String [] arr = "dog,cat,bear".split(",");
		
		CharSequence delimiter = "</li><li>";
		CharSequence prefix = "<ol><li>";
		CharSequence suffix = "</li></ol>";
		
		StringJoiner sj = new StringJoiner(delimiter, prefix, suffix);
		
		for (String s : arr) {
			sj.add(s);
		}
		
		System.out.println(sj);

	}

}
package days21;

public class Ex06_02 {

	public static void main(String[] args) {
		
		String s = "100Akeniktrue";
		
		/*
		// kenik앞에 XXX삽입
		int idx = s.indexOf("kenik");
		// 100AXXXkeniktrue
		System.out.println(s.substring(0, idx) + "XXX" + s.substring(idx));
		*/
		
		
		/*
		// kenik문자열 제거, XXX수정, YYY삽입
		// s.contains("kenik") t/f 리턴 어디 위치에 있는진 몰라
		
		int idx = s.indexOf("kenik");
		System.out.println(s.substring(0, idx));
		
		idx += "kenik".length();
		System.out.println(s.substring(idx));
		
		// 100Atrue
		System.out.println(s.substring(0, s.indexOf("kenik")) + s.substring(idx));
		*/
		
		
		//
		StringBuffer sb = new StringBuffer(3);	//자동으로 크기 증가됨
		sb.append(100);
		sb.append('A');
		sb.append("kenik");
		sb.append(true);
		
		System.out.println(sb.toString());
		
		
		/*
		// sb.deleteCharAt(index)
		// 100Akeniktrue -> 100Atrue
		int start = sb.indexOf("kenik");
		int end = start + "kenik".length();
		System.out.println(sb.delete(start, end));
		*/
		
		
		
		//kenik -> XXX수정	100AXXXtrue
		int start = sb.indexOf("kenik");
		int end = start + "kenik".length();
		System.out.println(sb.replace(start, end, "XXX"));
		
		
		
		
		
	}

}
package days21;

public class Ex07 {

	public static void main(String[] args) {
		//String -> StringBuilder 코딩으로 수정
		
//		String s = "1234567";
		//		7654321
		
		StringBuilder sb = new StringBuilder("1234567");
		sb.reverse();
		sb.setCharAt(0, '0');	//0번째 문자 0으로
		sb.setLength(10);
		System.out.println("["+sb+"]");
		
		
		
		
		
		
		/*
		char [] sArr = new char[s.length()];
		for (int i = s.length()-1, j=0; i >= 0; i--) {
			//sArr[s.length()-1 -i] = s.charAt(i);
			sArr[j++] = s.charAt(i);
		}
		
		//			= new String(sArr)
		String result = String.valueOf(sArr);
		System.out.println(result);
		*/
		
	}

}
package days21;

public class Ex07_02 {

	public static void main(String[] args) {
//		select  rno, bno, reply, replyer, replydate, updatedate
//		 from 
//		   (
//		    select /*+INDEX(tbl_reply idx_reply) */ 
//		      rownum rn,  rno, bno, reply, replyer, replyDate, updatedate
//		    from tbl_reply
//		    where bno =  #{bno}
//		    and rno > 0
//		    and rownum <= #{cri.pageNum} * #{cri.amount}
//		   ) where rn > (#{cri.pageNum} -1) * #{cri.amount}

		
		String s = "1234567";
		//		7654321
		
		char [] sArr = new char[s.length()];
		for (int i = s.length()-1, j=0; i >= 0; i--) {
			//sArr[s.length()-1 -i] = s.charAt(i);
			sArr[j++] = s.charAt(i);
		}
		
		//			= new String(sArr)
		String result = String.valueOf(sArr);
		System.out.println(result);
		
		
	}

}
package days21;

import java.util.StringTokenizer;

public class Ex08 {

	public static void main(String[] args) {
		// StringTokenizer 클래스 보다 split() 메서드 사용 권장
		String data = "홍길동, 김길동, 이길동, 박길동";
		//				1		1	1		1	토큰(token)
		
		StringTokenizer st = new StringTokenizer(data);
		
		st.nextToken();
		
		
		/* 이거 사용하는게 나음
		//String.split(regex)
		String [] datas = data.split(",");
		for (String name : datas) {
			System.out.println(name);
		}
		*/

	}

}
package days22;

public class Ex02 {

	public static void main(String[] args) {
		String msg = "System.out.println( 총페이지수 )";
		StringBuffer sb = new StringBuffer(msg);
//		  ㄱ. println 문자열을 print 문자열로 변경하기
		int start = sb.indexOf("println");
		int end = start + "println".length();
		sb.replace(start, end, "print");
		System.out.println(sb);
		
//		  ㄴ. 총페이지수 앞 뒤에 "" 쌍따옴표 삽입하기
		int offset = sb.indexOf("총페이지수");
		sb.insert(offset, '"');
		offset += "총페이지수".length() + 1;
		sb.insert(offset, '"');
		System.out.println(sb);
		
//		  ㄷ. 문자열 맨 뒤에 ;(세미콜론) 붙이기
		sb.append(";");
				
		sb.insert(sb.length(), ";");
		System.out.println(sb);
		
//		  ㄹ. 총페이지수 의 총 한 문자 삭제하기.
		// sb.setCharAt(index, ch);
		sb.deleteCharAt(sb.indexOf("총페이지수"));
		System.out.println(sb);
		
		
	}

}
package days22;

import java.text.DecimalFormat;
import java.util.StringTokenizer;

public class Ex03 {

	public static void main(String[] args) {
		double money = 1234567.1234;
		String s = String.format("%,.2f", money);
		System.out.println(s);
		
		//형식화 클래스
		String pattern = "#,###.00";
		DecimalFormat df = new DecimalFormat(pattern);
		String data = df.format(money);
		System.out.println(data);
		
		
		
		String datas = "홍길동, 김길동, 이길동, 박길동";
		StringTokenizer st = new StringTokenizer(datas,", ");
		while (st.hasMoreTokens()) {
			System.out.println(st.nextToken());
		}
		
	}

}
package days22;

import java.text.DecimalFormat;
import java.util.StringTokenizer;

public class Ex03 {

	public static void main(String[] args) {
		double money = 1234567.1234;
		String s = String.format("%,.2f", money);
		System.out.println(s);
		
		//형식화 클래스
		String pattern = "#,###.00";
		DecimalFormat df = new DecimalFormat(pattern);
		String data = df.format(money);
		System.out.println(data);
		
		
		
		String datas = "강현구, 권희준, 김나린, 김민희";
		StringTokenizer st = new StringTokenizer(datas,", ");
		while (st.hasMoreTokens()) {
			System.out.println(st.nextToken());
		}
		
	}

}
Comments