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