#string 클래스 내 메소드 사용법
class StringMethod { public static void main(String[] args) { String str1="Smart"; String str2=" and "; String str3="Simple"; String str4=str1.concat(str2).concat(str3); // concat String의 주소값이 반환시키므로 .으로 연결해준것 System.out.println(str4); System.out.println("문자열 길이: "+str4.length()); if(str1.compareTo(str3)<0) System.out.println("str1이 앞선다"); else System.out.println("str3이 앞선다"); } }
String name = "홍길동“;
- “”만으로 객체를 만들 수 있다(스트링을 많이 사용하기 때문에 편리하게 사용할 수 있도록 되어 있는 것)
# 도큐먼트 보는 법
자바 사이트 → Java APIs - Java SE Documentation → JDK8 → Java SE API Documentation →
java.util → Scanner → 아래에서 클래스 찾기
import java.util.Scanner; class SCTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.nextLine(); //Hello World System.out.println(str); } } /* 결과 : Hello World 치니까 Hello World */
- .nextLine 엔터를 칠 때까지 자기의 입력값으로 받아들임
import java.util.Scanner; class SCTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); //Hello World System.out.println(str); } } /* 결과 : Hello World 치니까 Hello */
.next(); 엔터키값 또는 공백까지를 키 값으로 받아들임
import java.util.Scanner; class SCTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); //Hello World System.out.println(str.length()); } } /* 결과 : Hello치니까 5 */
- length() : 이 문자열의 길이를 반환한다. (반환값의 자료형은 int)
Q. 임의의 문자열 두개를 입력받아 두 문자열 합치기, 대문자로 변환, 소문자로 변환시키기
A.
import java.util.Scanner; class SCTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str1 = null, str2 = null; str1 = sc.nextLine(); str2 = sc.nextLine(); System.out.println(str1.concat(str2)); // 문자열 합치기 System.out.println(str1+str2); System.out.println(str.toUpperCase()); // 대문자 System.out.println(str.toLowerCase()); // 소문자 } }
- compareTo : 두 문자열을 비교하는 메소드
- c에서는 아스키코드로 char 1바이트로 표현함
A B C / a b c d
65 66 67 / 97 98 99 100
ex)
String str1="AAA"; String str2="AAA"; int r=srt1.compareTo(srt2); // 결과 : r = 0 String str1="AAA"; String str2="BBB"; int r=srt1.compareTo(srt2); // 결과 : r = -1 String str1="AAA"; String str2="CCC"; int r=srt1.compareTo(srt2); // 결과 : r = -2 String str1="CCC"; String str2="AAA"; int r=srt1.compareTo(srt2); // 결과 : r = 2 String str1="AAA"; String str2="AAC"; // 처음으로 다른 부분에서 연산이 일어남(같은 부분은 연산 안함) int r=srt1.compareTo(srt2); // 결과 : r = -2
Q. 알파벳순으로 정렬하시오.
A.
String tmp=null; String str1"Bill", str2"David", str3"Alice", str4"Candy"; if(str1.compareTo(str2)>0) { tmp=str1; str1=str2; str2=tmp; } if(str1.compareTo(str3)>0) { tmp=str1; str1=str3; str3=tmp; } if(str1.compareTo(str4)>0) { tmp=str1; str1=str4; str4=tmp; } if(str2.compareTo(str3)>0) { tmp=str2; str2=str3; str3=tmp; } if(str2.compareTo(str4)>0) { tmp=str2; str2=str4; str4=tmp; } if(str3.compareTo(str4)>0) { tmp=str3; str3=str4; str4=tmp; } System.out.println(str1+" "+str2+" "+str3+" "+str4);
- 한글도 이 방법 가능하다 ex) 주소록
# 메소드 체이닝(Method Chaining - 체인처럼 연결되었다 의미)
ex)
class Number { int num public Number add(int num) { this.num+=num; return this; } public void printNum() { System.out.println(num); } }
class NumberMain { public static void main(String[] args) { Number n1 = new Number(); n1.add(3). add(5). add(2). printNum(); // 문법적으로 이상없음 // 1000번지라는 주소값에 리턴 add 3+5+2 ∴10이라고 출력함 n1.add(3). add(5). printNum(). add(2). printNum(); /* 에러발생 무조건.으로 연결할 수 있는 것이 아님 .앞에 주소가 있어야 하는데 printNum()은 void를 리턴해 주소가 없으므로 불가 사용을 원하는 경우 public void printNum()에서 void를 Number로 바꾸고 return this; 추가해주는 경우 에러나지 않고 가능하다*/ } }
ex)
(new Number()).add(5);
- 객체를 생성하고 해당 주소 생기므로 에러 발생하지 않음
단, 주소를 가지고 있는 것이 없기 때문에 주소에 접근할 수 없어 가비지 컬렉터에 언젠가 메모리 지워짐
- String의 특징 : 문자열은 변경이 되지 않는다
ex)
String str1="홍길동"; str1="임꺽정"; System.out.println(str1); // 결과 : 임꺽정
기존의 똑같은 문자열이 있으면 기존의 문자열을 가리키게 된다(메모리 과부하 방지 위함)
ex)
String str1="홍길동"; String str2="홍길동"; str1="임꺽정";
- String str2=new String(str1); 기존에 똑같은 문자열이 있더라도 새로운 인스턴스를 만듬
- “ ”와 생성자는 작동원리가 다르다
명시적으로 복사가 필요하는 상황이 아니라면 이 생성자는 필요없다고 도큐먼트에 설명되어 있음
import java.lang.*; - 자바가 자동으로 삽입시켜주기 때문에 스트링을 자동으로 사용할 수 있는 것임
ex) 공백을 포함한 문자열의 길이를 구하는 것임
class StringInstance { public static void main(String[] args) { java.lang.String str="My name is Sunny"; int strLen1=str.length(); System.out.println("길이 1: "+strLen1); int strLen2="한글의 길이는 어떻게?".length(); System.out.println("길이 2: "+strLen2); } }
- “ ”하면 스트링 객체 생성 -> length로 객체 주소 반환 -> 문자열의 길이 리턴
ex)
class ImmutableString { public static void main(String[] args) { String str1="My String"; String str2="My String"; String str3="Your String"; if(str1==str2) System.out.println("동일 인스턴스 참조"); // 결과 : 동일 인스턴스 참조 else System.out.println("다른 인스턴스 참조"); if(str2==str3) System.out.println("동일 인스턴스 참조"); else System.out.println("다른 인스턴스 참조"); // 결과 : 다른 인스턴스 참조 } }
ㄴ 자바는 주소값을 찍어볼 순 없지만 비교할 순 있음
class StringMethod { public static void main(String[] args) { String str1="Smart"; String str2=" and "; String str3="Simple"; String str4=str1.concat(str2).concat(str3); // concat String의 주소값이 반환시키므로 .으로 연결해준것 System.out.println(str4); System.out.println("문자열 길이: "+str4.length()); if(str1.compareTo(str3)<0) System.out.println("str1이 앞선다"); else System.out.println("str3이 앞선다"); } }
class StringCopy { public static void main(String[] args) { String str1="Lemon"; String str2="Lemon"; String str3=new String(str2); if(str1==str2) System.out.println("str1과 str2는 동일 인스턴스 참조"); else System.out.println("str1과 str2는 다른 인스턴스 참조"); if(str2==str3) System.out.println("str2와 str3는 동일 인스턴스 참조"); else System.out.println("str2와 str3는 다른 인스턴스 참조"); } }
ex)
class StringAdd { public static void main(String[] args) { String str1="Lemon"+"ade"; // “Lemon".concat("ade") String str2="Lemon"+'A'; // “Lemon".concat(String.valueOf('A')); String str3="Lemon"+3; // “Lemon".concat(String.valueOf(3)); String str4=1+"Lemon"+2; // new StringBuilder().append(1).append("Lemon").append(2).toString() str4+='!'; // ㄴ 내부적 연산 System.out.println(str1); System.out.println(str2); System.out.println(str3); System.out.println(str4); } }
- static valueOf : char, int를 string으로 형변환 해주는 것
ex)
class BuilderString { public static void main(String[] args) { StringBuilder strBuf=new StringBuilder("AB"); strBuf.append(25); //AB25 strBuf.append('Y').append(true); //AB25Ytrue System.out.println(strBuf); //AB25Ytrue strBuf.insert(2, false); //ABfalse25Ytrue strBuf.insert(strBuf.length(), 'Z'); //ABfalse25YtrueZ System.out.println(strBuf); //ABfalse25YtrueZ } }
- StringBuilder(클래스종류)는 생성자 중에 문자열을 받음
16바이트의 버퍼(메모리)를 가지고 있다
16을 넘어서면 자동으로 늘어남(부하를 일으킴)
처음부터 적절한 길이를 주고서 생성해주는 것이 좋다
- toString() : StringBuilder에서 string으로 형변환해줌
class SimpleAdder { private int num; public SimpleAdder(){num=0;} public SimpleAdder add(int num) { this.num+=num; return this; } public void showResult() { System.out.println("add result: "+num); } } class SelfReference { public static void main(String[] args) { SimpleAdder adder=new SimpleAdder(); adder.add(1).add(3).add(5).showResult(); }
Q. 문제 [StringBuilder의 API 문서 참조]
String str1 = "ABCDEFGHIJKLMN"; 역순으로 출력
String str2 = "990208-1012752" 이 문자열을 활용하여 중간에 삽입된 -를 삭제한 String 인스턴스를 생성.
A.
class StringTest2 { public static void main(String[] args) { String str1 = "ABCDEFGHIJKLMN"; String str2 = "990208-1012752"; int idx=0; StringBuilder sb1 = new StringBuilder(str1); StringBuilder sb2 = new StringBuilder(str2); System.out.println(sb1.reverse().toString()); idx = sb2.indexOf("-"); if(idx != -1) System.out.println(sb2.deleteCharAt(idx).toString()); } }