String String 인스턴스 안에는 char 배열이 존재하는것이다. String은 toString를 오버라이딩 하여 안에 내용이 출력된다. toString를 오버라이딩 하여 인스턴스에 대한 정보를 확인할 수 있게 만드는 것은 좋은 습관이다. 디버깅할때 편하다는 장점이 있다.
equals 결과를 예측해보자 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 public class EqualsTest { public static void main (String[] args) { Point point1 = new Point (10 , 20 ); Point point2 = new Point (10 , 20 ); Point point3 = point2; System.out.println( point1 == point2 ); System.out.println( point2 == point3 ); System.out.println( point1.equals(point2) ); System.out.println( point2.equals(point3) ); System.out.println("================" ); String s1 = new String ( "hello" ); String s2 = new String ( "hello" ); String s3 = s2; System.out.println( s1 == s2 ); System.out.println( s2 == s3 ); System.out.println( s1.equals(s2) ); System.out.println( s2.equals(s3) ); }
equals를 오버라이딩 해보자 hashCode()메소드도 오버라이딩이 필요하다. 자바에서는 hashCode() equal() 메소드를 동시에 오버라이드 해야한다. equals 조건을 제곱으로 한다면 hashCode도 제곱으로 변경해주어야 한다. 그렇지 않으면 해쉬맵 해쉬 셋을 쓸 때 어려워진다.
Point.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 public class Point { private int x; private int y; .. @Override public int hashCode () { final int prime = 31 ; int result = 1 ; result = prime * result + x; result = prime * result + y; return result; } @Override public boolean equals (Object obj) { if (this == obj) return true ; if (obj == null ) return false ; if (getClass() != obj.getClass()) return false ; Point other = (Point) obj; if (x != other.x) return false ; if (y != other.y) return false ; return true ; }
결과를 예측해보자 1 2 3 4 5 6 7 8 9 10 String str1 = "hello" ;String str2 = "hello" ;String str3 = str2;System.out.println( str1 == str2 ); System.out.println( str2 == str3 );
new String(“문자열”) “문자열”의 차이는? 위의 결과를 보고 잘 생각해 보자 문자열은 변경되지 않는다는점을 잘 생각하자. 변한다면 참고하고 있는 다른 참조변수들이 피해를 본다..
잘생각해보자 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public static void main (String[] args) { String str1 = "abc" ; String str2 = "cde" ; String str3 = str2; str2 = str3.toUpperCase(); System.out.println(str1); System.out.println(str2); System.out.println(str3); String str4 = str2.concat("??" ); System.out.println(str2); System.out.println(str4); String str5 = "!" .concat(str2); System.out.println(str5); }
String 메소드의 사용법 및 활용 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 public class StringTest03 { public static void main (String[] args) { String s= "abcAbcabcABC" ; char c = s.charAt( 2 ); System.out.println( c ); System.out.println( s.indexOf( "Abc" ) ); System.out.println( s.indexOf("ab" ) ); System.out.println( s.lastIndexOf("ab" ) ); System.out.println( s.indexOf( "XYZ" )); System.out.println( s.replace("bc" , "12" ) ); System.out.println( s.replaceAll("bc" , "12" ) ); System.out.println( s.substring( 3 , 7 ) ); System.out.println( s.toLowerCase() ); System.out.println( s.toUpperCase() ); String str1 = " ab cd " ; String str2 = ",efg" ; str1 = str1.concat(str2); System.out.println( "---" + str1 + "---" ); System.out.println( "---" + str1.trim() + "---" ); String[] tokens = str1.split("," ); for ( String token : tokens) { System.out.println( token ); } tokens = "abcdefg" .split( "," ); for ( String token : tokens) { System.out.println( token ); } tokens = "" .split( "," ); System.out.println( tokens.length ); } }
StringBuffer StringBuffer는 가변크기의 버퍼를 가짐. “abc” + “cde” (String) 보다는 StringBuffer를 쓰는게 낫다. 전자의 경우 런타임 때 “abc”를 스트링 버퍼로 만들고 append(“cde”)후 toString()를 통해 값을 반환한다. String를 사용해도 되지만 append의 작업이 많을 경우 StringBuffer사용하는것이 빠르다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 public static void main (String[] args) {StringBuffer sb = new StringBuffer ( "this" );System.out.println(sb.length() + ":" + sb.capacity()); sb.append(" is pencil" ); System.out.println( sb ); sb.insert(7 , " my" ); System.out.println( sb ); sb.replace( 8 , 10 , "your" ); System.out.println( sb ); sb.setLength( 3 ); System.out.println( sb ); String s1 = "Hello" + " World" + 10 +true ;System.out.println(s1); String s2 = new StringBuffer ( "Hello" ).append( " World" ).append( 10 ).append( true ).toString();System.out.println(s1); System.out.println(s2); }
Wrapper 클래스 기본형 보다는 Wrapper 클래스를 쓰고자하는 움직임이 많이 발생하고 있다.
WrapperClassTest.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class WrapperClassTest { public static void main (String[] args) { Integer i = new Integer (10 ); Character c = new Character ( 'c' ); Float f = new Float ( 3.14 ); Boolean b = new Boolean ( true ); Integer j = 10 ; int k = 20 + j; } public static void swap ( Integer a, Integer b ) { } }
정규식을활용하여 정수인지 확인 WrapperClassTest2.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class WrapperClassTest2 { public static void main (String[] args) { System.out.println( Character.toLowerCase( 'a' )); System.out.println( Character.isDigit( '1' )); System.out.println( Character.isDigit( '@' )); String s = "1234" ; if (s.matches("-?\\d+" ) == false ) { System.out.println("숫자가 아닙니다" ); } else { int i = Integer.parseInt(s); } } }