ref :
https://www.youtube.com/watch?v=NI6QZy6juc8&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=104
https://www.youtube.com/watch?v=GfYg3imRZsc&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=103
모든 클래스의최고 조상11개의 메서드를 가지고 있음
- clone() :
객체의 복사본을반환/protected라서public 으로 오버라이딩이필수- equals() :
같은 객체인지비교- finalize() : 거의 사용할 일 X
- getClass() :
클래스 정보를 담고있는 class 인스턴스를반환- hashCode() :
객체 자신의 해시코드반환- toString() :
객체 자신의 정보를문자열로반환- notfy() / notifyAll() / wait() :
쓰레드 관련 메서드
- 주 사용
clone()/equals()/hashCode()/toString()을override해서자주 사용함
- 원형
객체 자신(this)과주어진 객체(obj)의주소를비교
-->==를 사용한 비교와결과가 동일같으면 true/다르면 false
- 주 사용
객체의 값을 비교하기 위해override해서 사용 -->논리적 동등을 비교하는 것을목적으로 둠미리 정의된 객체는이미 오버라이딩되어 있으므로논리적 값을 비교할 수 있음직접 만든 객체는직접 오버라이딩을 해줘야 함
(오버라이딩할 때반환값,매개변수는반드시 같아야 함)
객체의 주소를해시코드(hash code)로반환하는 메서드Object 클래스의 hashCode()는객체의 주소를int로 변환해서 반환equals()를오버라이딩하면,hashCode()도반드시 오버라이딩 해야함
-->equals()의 결과가true인 두 객체는해시코드값이 같아야 하기 때문
- 원형
- native method :
C언어로 이미 작성된 함수,java에서는 기능을 사용만 가능public class Object{ ... /* 네이티브 메서드 : C언어로 작성된 OS의 메서드 */ public native int hashCode(); // 32bit JVM에서는 주소가 4byte라서 반환값이 int // 64bit JVM이라서 long이 되지는 않음 --> 이미 널리 사용 // 대신 값의 중복이 발생할 수 있다는 것을 알아두자 }
- 오버라이딩
@Override public int hashCode() { // 매개변수가 가변인자 라서 호출시 다수를 넘길 수 있음 return Objects.hash(kind, number); // king, number은 객체의 iv }
- System.identityHashCode()
객체마다다른 해시코드를반환오버라이딩 하지 않은Object.hashCode()처럼 동작
객체를문자열(String)로변환하기 위한 메서드
- 원형
딱히 유용하게 사용될 수 없는 반환값임 -->오버라이딩 해서 사용해야 함public String toString() { return getClass().getName()+"@" + Integer.toHexString(hashCode()); }
- 오버라이딩
iv(인스턴스 변수)를문자열로 보여주는 방식으로 보통 오버라이딩 수행public String toString() { /* iv(인스턴스 변수)들을 문자열로 표현해주는 방식으로 보통 오버라이딩 함 */ return "kind : " + kind + ", number : " + number; }
- 개념
- 문자열을 다루기 위한 클래스
- 구성
- 데이터(
char[])- 메서드(
문자열 관련)
- 특징
불변(immutable) 객체:내용을 변경할 수 없음,새로운 값을 가진 객체를 반환할 뿐덧셈 연산자(+)를 이용한 문자열 결합성능이 떨어짐
:문자열의 결합이나 변경이 잦으면, 변경이가능한(mutable) StringBuffer 사용권장
- String 사용 2가지 방법
- 문자열 리터럴 사용
String str = "abc"문자열 리터럴을메모리에 할당하고해당 주소값을String이 가리키게 됨같은 문자열 리터럴 값을 가진다면,같은 문자열 리터럴에 대한주소값을 가지고 있는 것- 객체 생성
String str = new String("abc")새로운 인스턴스를생성하고인스턴스의 값을할당값이 같아도실제 인스턴스는다르다
- 동등 연산자를 통한 비교(
==)
- 문자열 리터럴 :
같은 주소값이기 때문에true- 객체 생성 :
주소값은 다르기 때문에false
- 정리
문자열 리터럴은 어차피내용 변경이 불가능
-->굳이 String을 객체로 생성하지 않아도 됨
-->문자열 리터럴 방식으로String 사용해도 충분함어떤 경우의 생성이든,문자열에 대한 값을 비교하려면equals()를 통한 비교필요
""처럼 아무것도 없는 문자열을빈 문자열이라고 한다크기가 0인char형 배열을저장하는문자열로 해석 가능- 초기값
String의 초기 값은기본 값인 null로 하는 것 보다,""로빈 문자열로 하는 것이 좋음char의 초기 값은기본 값인\u0000보다,' '공백으로 하는 것이 좋음
char[]--->String으로변환할 때 사용String--->char[]으로변환할 때에는toCharArray()를 사용하면 됨char[] c = {'H', 'e', 'l', 'l', 'o'}; String str = new String(c); // str = "Hello"
StringBuffer---->String으로변환할 때 사용StringBuffer sb = new StringBuffer("Hello"); String str = new String(sb); // str = "Hello";
String에서index에 해당하는 부분을char로 반환String s = "Hello"; char c = s.charAt(1); // c = 'e';
Comparable의compareTo를오버라이딩한 것문자열을사전 순서로 비교하는 데 사용정렬을 할 때 함께 사용됨- 결과
- 같으면 :
0반환- 이전이면 :
-1반환- 다음이면 :
1반환int i1 = "aaa".compareTo("aaa"); // i1 = 0 int i2 = "aaa".compareTo("bbb"); // i2 = -1 int i3 = "bbb".compareTo("aaa"); // i3 = 1
문자열(str)을뒤에 덧붙이는 기능String s = "Hello"; String str = s.concat(" World"); // str = "Hello World";
지정된 문자열(s)이포함되어있는지 검사charSequence는문자열 관련 인터페이스라서다음 목록들을 받을 수 있음
- charBuffer
- Segment
- String
- StringBuffer
- StringBuilder
- 결과 : true / false
String s = "abcdef"; boolean r = s.contains("bc"); // r = true
지정된 문자열(suffix)로끝나는지 검사String file = "Hello.txt"; boolean r = file.endsWith(txt); // r = true
지정된 문자열(prefix)로시작하는지 검사String file = "Hello.txt"; boolean r = file.startsWith(Hello); // r = true
Object의equals()를오버라이딩한 것인스턴스 자체가 아니라값을 비교하는 기능String s = "Hello"; boolean b = s.equals("Hello"); // b = true boolean b2 = s.equals("hello"); // b2 = false
문자열과String 인스턴스의문자열을 대소문자 구분 없이 비교String s = "Hello"; boolean b = s.equalsIgnoreCase("HELLO"); // b = true boolean b2 = s.equalsIgnoreCase("heLLO"); // b2 = true
- 다양한 매개변수 타입
int indexOf(int ch)int indexOf(int ch, int pos)int indexOf(String str)주어진 문자(ch)가문자열에존재하는지 확인하여위치(index)를 반환없으면 -1을 반환,있으면 인덱스값을 반환두번째 매개변수를 사용해서시작 위치를 지정할 수도 있음문자열(str)을검색할 수도 있음/* 특정 문자(ch)를 탐색해서 인덱스 반환 */ String s = "Hello"; int idx1 = s.indexOf('o'); // idx1 = 4 int idx2 = s.indexOf('k'); // idx2 = -1 /* 두번째 매개변수로 검색 시작 위치를 인덱스로 지정할 수 있음 */ int idx3 = s.indexOf('e', 0); // idx3 = 1 int idx4 = s.indexOf('e', 2) // idx4 = -1 /* 특정 문자열(str)을 탐색해서 인덱스 반환 */ String s2 = "Spring"; int idx5 = s2.indexOf("ing"); // idx5 = 3
- 다양한 매개변수 타입
int lastIndexOf(int ch):ch를뒤에부터 탐색int lastIndexOf(String str):str을뒤에부터 탐색인덱스 번호는앞과 동일하게취급(뒤에서 검색한다고 뒤부터 세지 X)
문자열의 길이반환String s = "java"; int len = s.length(); // len = 4
- 다양한 매개변수 타입
String[] split(String regex)
:지정된 분리자(regex)로나누어 문자열 배열에 담아 반환String[] split(String regex, int limit)
:지정된 분리자(regex)로나누어 문자열 배열에 담아 반환 /전체 길이를limit 로 제한- regex :
정규식(Regular Expression)을 의미String animals = "dog, cat, bear"; String[] arr = animals.split(","); // arr[0] = dog // arr[1] = cat // arr[2] = bear String[] arr2 = animals.split(",", 2); // 2개 배열 요소로 나눔 // arr[0] = dob // arr[1] = cat,bear
- 다양한 매개변수 타입
String substring(int begin)String substring(int begin, int end)
:begin부터end 전까지문자열을 자름String s = "java.lang.Object"; String c = s.substring(10); // c = "Object" String p = s.substring(5, 9) // p = "lang"
String toLowerCase(): 모든 문자열을소문자로 변환Stirng toUpperCase(): 모든 문자열을대문자로 변환String s = "Hello"; String s2 = s.toLowerCase(); // s1 = "hello" String s3 = s.toUpperCase(); // s2 = "HELLO"
문자열의왼쪽 끝과오른쪽 끝에 있는공백을 없앤 결과를 반환
(문자열 중간에 있는 공백은제거되지 않음)String s = " Hello World "; String s1 = s.trim(); // s1 = "Hello World"
매개변수 타입을String으로 바꿔반환- 다양한 매개변수 타입
static String valueOf(boolean b)static String valueOf(char c)static String valueOf(int i)static String valueOf(long l)static String valueOf(float f)static String valueOf(double d)static String valueOf(Object o)
:참조변수의 경우toString() 을 호출한 결과를 반환String b = String.valueOf(true); // "true" String c = String.valueOf('a'); // "a" String i = String.valueOf(100); // "100" String l = String.valueOf(100L); // "100" String f = String.valueOf(10f); // "10.0" String d = String.valueOf(10.0); // "10.0"
특정 delimiter로배열의 문자열을결합하는 기능- 원형
static String join(CharSequence delimiter, CharSequence... elements)String naimals = "dog,cat,bear"; String[] arr = animals.split(","); String str = String.join("-", arr); // arr = "dog-cat-bear"
기본형-->문자열
String.valueOf()로 변환 가능- 문자열 --> 기본형
각 래퍼클래스에parse___() 메서드가기존에 존재했다최근에는valueOf()로모두 통일되었다- 즉,
문자열 <--> 기본형모두 각래퍼클래스.valueOf()로변환 가능
valueOf()는사실 반환형이래퍼 클래스이다
-->오토박싱으로기본형으로 알아서 변환- 오토박싱
래퍼클래스 <---> 기본형간에변환을 알아서 해줌/* 숫자 --> 문자열 성능은 방법 2가 더 빠름!, 그러나 1번이 더 편리함 */ int i = 100; String str1 = i + ""; // 방법 1 String str2 = String.valueOf(i); // 방법 2 /* 문자열 --> 숫자 valueOf()가 더 최신 방법 */ int i = Integer.pareInt("100"); // 방법 1 int i2 = Integer.valueOf("100"); // 방법 2