문자열
클래스영역의 상수영역에 문자열 영역이 포함된다.
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을 비교.
}
}
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
}
}
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
}
}
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바이트를 쓴다.
}
}
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);
}
}
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번 인덱스부터 찾기 시작하여 몇번째 인덱스에 위치해있는지 출력.
}
}
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 출력
System.out.println(st1.contains("Bb")); // true 출력
System.out.println(st1.contains("BB")); // false 출력
String st5="";
System.out.println(st5.length()==0); //값이 있는지 없는지 확인하기 -- true 출력
System.out.println(st5.isEmpty()); //비어있으므로 true.
String st6="abcd";
System.out.println(st6.replace("bc", "BCDEFG")); //aBCDEFGd 출력
System.out.println(st6.replace("bc", "")); //bc 없애기
String st1="AaBbCcDdEeFfGg";
System.out.println(st1.substring(2)); //BbCcDdEeFfGg 출력. 인덱스 2부터 끝까지 (인자가 1개면 끝까지)
System.out.println(st1.substring(0,2)); //Aa 출력. (뽑아서 출력)
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
}
}
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));
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] 출력
//주의! 빈 문자열도 문자열로 인식. 띄어쓰기 한칸을 기준으로 잘랐기 때문에 한칸 빼고 두 칸은 출력
String st4="java web";
java.util.StringTokenizer token=new java.util.StringTokenizer(st4);
while(token.hasMoreElements()){
// 내용이 없는 것은 무시하고 가져온다.(띄어쓰기 무시)
System.out.println(token.nextElement());
}
String st1=" ja va ";
//ja va*** 출력 - 문자열의 앞,뒤 공백을 날려준다.
System.out.println(st1.trim()+"***");
int su=1234;
System.out.println(""+su+1); //문자열 12341 출력
System.out.println(String.valueOf(su)+1); //문자열로 바뀐 12341 출력
String st2="1234";
System.out.println(st2+1); //12341
System.out.println(Integer.parseInt(st2)+1); //1235 출력. 단 St2는 숫자로만 구성되어 있어야한다.
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)의 값