문자열 String

jinkyung·2021년 1월 13일
0

JAVA

목록 보기
6/29

문자열

클래스영역의 상수영역에 문자열 영역이 포함된다.

String 클래스는 다른 객체와 조금 다른 특성을 가지고 있다.

package com.bit.day06.pm;

public class Ex09 {

	public static void main(String[] args) {
		String st1="문자열";                       //클래스영역의 상수영역의 문자열을 가리킨다.
		String st2=new String("문자열");           //힙영역에 문자열 객체를 생성한다.
		String st3="문자열";                       //st1이 가리키는 똑같은 문자열을 가리킨다.
		System.out.println(st1);
		System.out.println(st2);
		System.out.println(st1==st2);            //false 
		System.out.println(st1==st3);            //true 
		
		
		//주소+주소를 문자열에 한해서는 열어두었다.
		st3=st3+"추가"; 					//새로운 문자열 객체를 만들어 내는 것이다. 이후 st3은 문자열추가 객체를 가리키게 된다.
		System.out.println(st3);            //문자열추가 출력 - "문자열추가"라는 새로운 객체를 출력		 
		System.out.println(st1);            //문자열 출력 - 상수값이라 바뀌지 않는다. st3는 바뀐 것이 아니라 새로운 객체를 출력한 것.
	}
}

(다시 생각할 부분)메인을 호출하기 이전의 문자열은 상수이고 java를 상수영역에 썼을 것이고,

메인을 실행하는 과정에서 파라미터로 java를 받아 실행하면 스트링 객체를 찍어내는 것이므로 둘을 비교했을때 false.

효율적인 메모리의 사용을 위해 이렇게 만들어 놓은 것. 일반적인 객체와 다르게 만들어졌다.

public class Ex10 {

	public static void main(String[] args) {
		String st1="java";
		String st2="ja"+"va";		//클래스영역의 문자열영역에는 java, ja, va가 있다. st2는 이미 처리를 해서 java를 가리킨다. 안해봐도 java.
		String st3="ja";			
		String st4="va";
		String st5=st3+st4;			//해봐야 알수 있는 결과. 이 시점에서 만들어 지는 것.
		System.out.println(st1==st2);               //true
		System.out.println(st1==st5); 				//false
		
		//st2는 ja, va 따로따로를 가리키는게 아니라 +를 먼저 연산하여 나온 결과와 st1을 비교.
	}
}
  • equal 메소드 (non static method)
    :String의 value값 비교
package com.bit.day06;

public class Ex11 {

	public static void main(String[] args) {
		String st1="java";
		String st2=new String("java");
		String st3="java";
		System.out.println(st1==st2);
		
		//reference 비교가 아닌 value값 비교를 할 수 있는 기능
		System.out.println(st1.equals(st2));
		System.out.println(st2.equals(st3));

		
		
	//원칙대로라면 default값이 나와야 한다. 하지만 jdk1.6 이후부터 equal메소드 처리가 가능하도록 바꿔놓았다.	
		switch(st1){               //switch 문에서도 java가 출력된다. equal메소드를 통해 알아서 찾아간다.
		case "ja" :
			System.out.println("ja");
			break;
		case "va" :
			System.out.println("va");
			break;
		case "java" :
			System.out.println("java");
			break;
						
		default:
			System.out.println("같은게 없음");
			break;
		}
			
		
		
 //st2도 새로운 객체인 것이지만 주소가 아닌 value 문자열의 비교가 가능해졌다.
		switch(st2){               
		case "ja" :
			System.out.println("ja");
			break;
		case "va" :
			System.out.println("va");
			break;
		case "java" :
			System.out.println("java");
			break;
						
		default:
			System.out.println("같은게 없음");
			break;
		}
	}
}
  • 문자열의 더하기
package com.bit.day06;

public class Ex12 {

	public static void main(String[] args) {
		String st1=new String();
		System.out.println(st1.equals(""));         //true.문자가 하나도 없는 문자열. 띄어쓰기도 문자이다.
		System.out.println(st1+123+4);            //문자열+숫자 = 문자열. 그러므로 문자열 1234출력
//		System.out.println("1"*2);			//오류. 문자열과 연산할 수 있는 연산자는 + 하나뿐이다.
		
		String st2="ja";
		System.out.println(st2.concat("va"));		//java 출력 - 문자열 더하기의 기능. but 사칙연산자 X
	}
}
  • String의 생성자, 배열->문자열 출력
package com.bit.day06;

public class Ex12 {

	public static void main(String[] args) {
		String st1=new String();
		System.out.println(st1+123+4);    


		byte[] by={65,66,67,68};
		String st2=new String(by);
		System.out.println(st2); 	// ABCD출력 - byte배열로 문자열 출력
		
		char[] ch={'a','b','c','d'};
		String st3=new String(ch);
		System.out.println(st3);	//abcd 출력
		
		String st4="java";
		String st5=new String(st4);
		System.out.println(st5);	//java 출력
		System.out.println(st4==st5); 	//주소비교 = false
	}
}
  • 배열 형태의 문자열로 만들어주는 toString()
package com.bit.day06;

public class Ex13 {

	public static void main(String[] args) {
		String st1=new String("AaBbCcDd");
		System.out.println(st1.equals("AaBbCcDd"));
		
		byte[] by1=st1.getBytes();           //getBytes(): 문자열->바이트 배열로 바꿔준다.
		System.out.println(java.util.Arrays.toString(by1));   //byte배열로 출력

		char[] ch1=st1.toCharArray();
		System.out.println(java.util.Arrays.toString(ch1));	 //character 배열로 출력
		
		String st2=new String("가각");
		byte[] by2=st2.getBytes();
		System.out.println(java.util.Arrays.toString(by2));  //4개 출력 : 자바는 유니코드 2바이트 문자 
															//유니코드=2바이트 문자체계이므로 원래는 한 글자가 2바이트.
                                                //"가"를 ㄱ(1바이트)과 ㅏ(1바이트)로 따로 읽어서 -가 붙은 숫자를 출력한 것이다.
			
		
		String st3=new String("Aa");
		byte[] by3=st3.getBytes();
		System.out.println(java.util.Arrays.toString(by3));       //65, 97 출력
//2개 출력되는 이유?? : 자바의 유니코드 특성 - 메모리 사용을 줄이기 위해 노력하기 때문에
// -> 아스키코드에 해당하는 값이 1바이트 체계라면 1바이트를 쓴다.
	
	}
}
  • lowercase, uppercase 기능 직접 만들기
package com.bit.day06.pm;

public class Ex01 {
	//전체를 대문자로, 전체를 소문자로 출력하는 메소드 만들기
	
	public static String lower(String st1){
		int min=(int)'A';
		int max=(int)'Z';
		int gap='a'-'A';		//97-65=32
		
		byte[] by=st1.getBytes();
		for(int i=0; i<by.length; i++){
			if(by[i]>=min && by[i]<=max){      // =by[i]번지가 대문자라면
				by[i]+=gap;
			}
		}
		return new String(by);
		}
	
	
	public static String upper(String st1){
		int min=(int)'a';
		int max=(int)'z';
		int gap='a'-'A';		//97-65=32
		
		byte[] by=st1.getBytes();
		for(int i=0; i<by.length; i++){
			if(by[i]>=min && by[i]<=max){        // =by[i]번지가 소문자라면
				by[i]-=gap;
			}
		}
		return new String(by);
		}
	
	
	
	public static void main(String[] args) {

		String st1=new String("AaBbCcDd");
	
		String result=lower(st1);
		System.out.println(result);
		
		String result2=upper(st1);
		System.out.println(result2);	
	}
}
  • charAt(), length(), indexOf()
public class Ex14 {

public static void main(String[] args) {
String st1="AaBbCcDdEeFfGg";	
for(int i=0; i<st1.length(); i++){      //length메소드는 배열로 뽑은다음 길이를 반환해준다.
System.out.println(st1.charAt(i));
		}

System.out.println(st1.indexOf('A'));   //index번호를 반환해준다.
System.out.println(st1.indexOf("Bb"));  //첫 index번호를(B의 번호) 반환해준다.
		
System.out.println(st1.indexOf("BB")); //존재하지 않으므로 -1을 반환한다. return int값을 해줘야하므로.
System.out.println(st1.indexOf('c',1));   //5 출력 :  1번 인덱스부터 찾기 시작하여 몇번째 인덱스에 위치해있는지 출력.
	}
}
  • lastIndexOf()
    : 검색을 거꾸로,
    출력은 왼쪽에서부터 몇번째에 위치하는지 그 인덱스를 출력한다.
String st2="abcdabcaba";
System.out.println(st2.lastIndexOf('a',8));   //7출력 - 8번 인덱스부터 거꾸로 a를 찾겠다.

concat()

System.out.println(st1.concat("XYZ"));  //string 값은 상수이므로 자체적으로 바뀌지 않는다. 단, 새로운 문자열 객체를 생성하여 반환.
	
String st2="java";
String st3="ja"+"va";
String st4="ja".concat("va");
System.out.println(st3);
System.out.println(st4);
System.out.println(st2==st3);   			//true
System.out.println(st2==st4);   			//fasle 왜? concat은 새로운 객체를 찍어 return하니까.
	
System.out.println(st2.charAt(0));   		//j 출력 - 배열로 뽑은 다음 인덱스 위치의 문자를 반환해준다.
		
System.out.println("java".length());       //4 출력   
  • contains()
    :boolean type 리턴
	System.out.println(st1.contains("Bb"));        // true 출력
	System.out.println(st1.contains("BB"));        // false 출력
  • isEmpty()
    :ture or false 반환
	String st5="";
	System.out.println(st5.length()==0);     //값이 있는지 없는지 확인하기   --  true 출력
	System.out.println(st5.isEmpty());		//비어있으므로 true.
  • replace()
	String st6="abcd";
	System.out.println(st6.replace("bc", "BCDEFG"));        //aBCDEFGd 출력
        System.out.println(st6.replace("bc", ""));             //bc 없애기
  • substring()
    :인자가 2개이면 첫번째인자는 시작 인덱스, 두번째인자는 끝 인덱스.
    시작 인덱스는 0부터 끝 인덱스는 1부터 시작하며 센다.

String st1="AaBbCcDdEeFfGg";	

System.out.println(st1.substring(2));	       //BbCcDdEeFfGg 출력. 인덱스 2부터 끝까지 (인자가 1개면 끝까지)
System.out.println(st1.substring(0,2));		//Aa 출력. (뽑아서 출력)
  • startsWith(), endsWith()
package com.bit.day06.pm;

public class Ex15 {

	public static void main(String[] args){
		String st1 = "AaBbCc";
		
		System.out.println(st1.startsWith("Aa"));		//true
		System.out.println(st1.startsWith("Cc"));		//false	
		System.out.println(st1.endsWith("Aa"));			//false	
		System.out.println(st1.endsWith("Cc"));			//true
		
	}
}
  • getchars()
		String st1 = "AaBbCc";

       //인자에서 시작 수는 0부터 끝나는 수는 1부터 센다.
		char[] chs={'!','@','#','$','%'};
		st1.getChars(0, 2, chs, 3);				//0번부터 2번까지, index 3번부터 넣기
		System.out.println(java.util.Arrays.toString(chs));   
  • split()
    :특정 문자열을 기준으로 자른다.
	String st3="java db web framework app";
	String[] arr1=st3.split(" ");
	System.out.println(java.util.Arrays.toString(arr1));
//[java, db, web, framework, app] 출력


	String st2="abcdabcaba";
	String[] arr2=st2.split("b");
	System.out.println(java.util.Arrays.toString(arr2));
//[a, cda, ca, a]출력


		String st4="java   web";					              	//3번 띄어쓰기
		String[] arr3=st4.split(" ");
		System.out.println(arr3.length);				            //4 출력
		System.out.println(java.util.Arrays.toString(arr3));		//[java, , , web] 출력
//주의! 빈 문자열도 문자열로 인식. 띄어쓰기 한칸을 기준으로 잘랐기 때문에 한칸 빼고 두 칸은 출력
  • StringTokenizer()
		String st4="java   web";	
		java.util.StringTokenizer token=new java.util.StringTokenizer(st4);     
		while(token.hasMoreElements()){
       		// 내용이 없는 것은 무시하고 가져온다.(띄어쓰기 무시)
		System.out.println(token.nextElement()); 
        }
  • trim()
	String st1="            ja   va             ";
        //ja   va*** 출력 - 문자열의 앞,뒤 공백을 날려준다.
        System.out.println(st1.trim()+"***");  
  • String.valueOf
    :문자열로 바꿔 출력해준다. static
		int su=1234;
		System.out.println(""+su+1); 	//문자열 12341 출력
		System.out.println(String.valueOf(su)+1);   //문자열로 바뀐 12341 출력
  • Integer.parseInt()
    :문자열을 숫자로 바꿔준다.
	String st2="1234";
		System.out.println(st2+1);                         //12341
		System.out.println(Integer.parseInt(st2)+1);      //1235 출력. 단 St2는 숫자로만 구성되어 있어야한다.
		
  • compareTo()
    :다름의 차이까지 반환해준다.
    문자열 비교 => 길이를 비교한 후, 길이가 같으면
    캐릭터 배열을 뽑아낸 다음 index번호를 돌면서 하나씩 비교
    제일 처음 달라지는 부분에서 얼마만큼 달라지는지 얘기해준다.
    객체가 같으면 0 리턴
    주어진 객체보다 작으면 음수 리턴
    주어진 객체보다 크면 양수 리턴
String st3="abcd";
String st4="abcd";
System.out.println(st3.compareTo(st4));         //0출력 - 일치
		
st4="abc";
System.out.println(st3.compareTo(st4));         //1 출력
		
st3="abca";
st4="abcd";
System.out.println(st3.compareTo(st4));         //-3  (a-d=-3)

st3="abcd";
st4="aBcd";
System.out.println(st4.compareTo(st4));       //32 : b(98)-B(66)의 값

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN