열세번째날[기본API 클래스(2) - Objects 클래스 / System 클래스/ Class 클래스 / String 클래스 / StringTokenizer 클래스 / StringBuffer /StringBuilder 클래스 / 정규 표현식 / Pattern 클래스 / Arrays 클래스]
목차
1. Objects 클래스
2. System 클래스
3. Class 클래스
4. String 클래스
5. StringTokenizer 클래스
6. StringBuffer, StringBuilder 클래스
7. 정규 표현식과 Pattern 클래스
8. Arrays 클래스
Objects 클래스
* java.util 패키지 안에 들어있음
* object의 유틸리티 클래스 : 객체를 가지고 작업할 수 있다
* 객체 생성X. 바로 메소드로 사용 가능 (ex. Objects.compare(...) )
리턴 타입 | 메소드(매개 변수) | 설명 |
int | compare(T a, T b, Comparator<T> c) | 두 객체 a와 b를 비교 기준c로 비교 |
boolean | deepEquals(Object a, Object b) | 두 객체의 깊은 비교 : 배열의 값까지 비교 |
boolean | equals(Object a, Object b) | 두 객체의 얕은 비교 : 주소값만 비교 |
int | hash(Object... values) | 매개값이 저장된 배열의 해시코드 생성 |
int | hashCode(Object o) | 객체의 해시코드 생성 |
boolean | isNull(Object obj) | 객체가 null인지 조사 |
boolean | nonNull(Object obj) | 객체가 null이 아닌지 조사 |
T | requireNonNull(T obj) | 객체가 null인 경우 예외 발생 |
T | requireNonNull(T obj, String message) | 객체가 null인 경우 예외 발생 : message 출력 |
T | requireNonNull(T obj, Supplier<String> messageSupplier) | 객체가 null인 경우 예외 발생 : 람다식이 만든 message 출력 |
String | toString(Object o) | 객체의 toString() 리턴값 리턴 |
String | toString(Object o, String nullDefault) | 객체의 toString() 리턴값 리턴 : 첫 번째 매개값이 null인 경우 두번째 매개값 리턴 |
객체 비교 : Objects.compare(T a, T b, Comparator<T> c)
* a, b 두 객체를 비교자(c)로 비교해 int 값 리턴
* 비교 기준이 c가 됨
* java.util.Comparator<T>는 제네릭 인터페이스 타입 : 두 객체를 비교하는 compare(T a, T b) 메소드가 정의되어 있음
* 음수 리턴 : a가 b보다 작으면
* 0 리턴 : a가 b와 같으면
* 양수 리턴 : a가 b보다 크면
//Comparator라는 인터페이스 구현해야 객체비교 사용 가능
Class StudentComparator implements Comparator<Student>
동등비교 : equals()와 deepEquals()
* 두 객체의 동등 비교
* Objects.equals(Object a, Object b)
a | b | Objects.equals(a,b) |
not null | not null | a.equals(b) |
not null | null | false |
null | not null | false |
null | null | true |
- a.equals(b)는 두 값이 같다면 true, 다르다면 false
* deepEquals(Object a, Object b)
a | b | Objects.deepEquals(a, b) |
not null (not array) | not null (not array) | a.equals(b) |
not null (array) | not null (array) | Arrays.deepEquals(a,b) |
not null | null | false |
null | not null | false |
null | null | true |
- 비교할 객체가 배열일 경우 항목 값까지도 비교함
해시코드 생성 : hash()와 hashCode()
* Objects.hash(Object ... values)
- 매개값으로 주어진 값들 이용해 해시 코드 생성하는 역할
- Arrays.hashCode(Object[]) 호출해 해시코드 얻어 리턴
- 클래스의 hashCode()를 재정의할 때 리턴값 생성할 때 유용하게 사용
- 여러 가지 필드를 가질 때, 필드들로부터 해시코드를 생성하게 되면 동일한 필드값을 가지는 객체는 동일한 해시코드를 가질 수 있음
@Override
public int hashCode(){
return Objects.hash(field1, field2, field3);
}
* Objects.hashCode(Object o)
- o.hashCode() 호출하고 받은 리턴값과 동일
- 매개값이 null 이면 0 리턴
- id 필드값이 같은 경우, 같은 해시코드를 리턴하도록 만들 수 있음 : String의 hashCode() 메소드의 리턴값을 활용함
- equals()로 필드값이 같은 경우, true를 리턴하도록 만들 수 있음
@Override
public int hashcode(){
return id.hashCode();
}
@Override
public boolean equals(Object obj){
if(obj instanceof Key){
Key compareKey = (Key) obj;
if(this.number == compareKey.number){
return true;
}
}
return false;
널 여부 조사 : isNull(), nonNull(), requireNonNull()
* Objects.isNull(Object obj)
- 매개값이 null인 경우 : true
* Objects.nonNull(Object obj)
- 매개값이 not null인 경우 : true
* Objects.requireNonNull(Object obj)
리턴 타입 | 메소드(매개변수) | 설명 |
T | requireNonNull(T obj) | not null ➡️ obj null ➡️ NullPointerException |
T | requireNonNull(T obj, String message) | not null ➡️ obj null ➡️ NullPointerException(message) |
T | requireNonNull(T obj, Supplier<String>msgSupplier) | not null ➡️ obj null ➡️ NullPointerException(msgSupplier.get()) 람다식 |
- 매개값이 not null이면 첫 번째 매개값을 리턴하고, null이면 모두 예외 발생 시킴
- 두번째 매개값은 예외 메시지를 제공함
- 람다식 : ()-> "___"
객체 문자 정보 : toString()
* 객체의 문자 정보를 리턴
리턴 타입 | 메소드(매개 변수) | 설명 |
String | toString(Object o) | not null ➡️ o.toString() null ➡️ "null" |
String | toString(Object o, String nullDefault) | not null ➡️ o.toString() null ➡️ nullDefault |
- 첫 번째 매개값이 not null이면 toString()으로 얻은 값을 리턴
- null 이면 "null" 또는 두 번째 매개값인 nullDefault 리턴
System 클래스
* System 클래스 용도 : 운영 체제의 기능 일부 이용 가능
- 프로그램 종료, 키보드로부터 입력, 모니터 출력, 메모리 정리, 현재 시간 읽기
- 시스템 프로퍼티(property) 읽기, 환경 변수 읽기
* 모든 필드, 메소드는 static으로 구성되어 있음
프로그램 종료 : exit() - 여기부터
* 강제적으로 JVM 종료시킬때 사용
* exit()메소드는 현재 실행하고 있는 프로세스 강제 종료시키는 역할
System.exit(0);
* int 매개값을 지정하도록 : 종료상태 값
- 정상 종료일 경우 0
- 비정상 종료일 경우 0 이외 다른 값
- 어떤 값 주더라도 종료
* 만약 특정 상태 값이 입력되었을 경우에만 종료 하고 싶다면, 자바의 보안관리자 설정
System.setSecurityManager(new SecurityManager(){ });
쓰레기 수집기 실행 : gc()
System.gc();
* 개발자가 메모리를 직접 코드로 관리X, JVM이 알아서 자동으로 관리
* JVM은 메모리가 부족할 때, CPU가 한가할 때 쓰레기 수집기를 실행시켜 사용하지 않는 객체 자동 제거
* gc() 메소드는 메모리가 열악하지 않은 환경이라면 거의 사용할 일이 없음
현재 시각 읽기 : currentTimeMillis(), nanoTime()
long time = System.currentTimeMillis();
long time = System.nanoTime();
* 자바 시간 : 1970년 1월 1일 0시 0분 0초
* currentTimeMillis() 밀리세컨드 : 1 / 1000초
* nanoTime() 나노세컨드 : 1/ 10^9초
* long 값을 리턴
* 리턴값은 프로그램의 실행 소요 시간 측정에 사용함 : 프로그램 끝난 시간 - 프로그램 시작 시간 = 프로그램 실행 소요 시간
시스템 프로퍼티 읽기 : getProperty()
* 프로퍼티 : 속성
* 시스템 프로퍼티 : JVM이 시작할 때 자동으로 설정되는 시스템의 속성값
ex) JVM 버전, 운영체제에서 사용되는 파일 경로 구분자 등..
* 대표적인 키와 값
키(key) | 값(value) | 설명 |
java.version | 1.7.0_25 | 자바의 버전 |
java.home | <jdk 설치경로> ₩jre | 사용하는 JRE의 파일 경로 |
os.name | Windows 7 | Operating system name : OS 이름 |
file.separator | ₩ | File separator : 파일 구분짓는 것 |
user.name | 사용자계정 | 사용자의 이름 |
user.home | C:₩Users₩사용자계정 | 사용자의 홈 디렉토리 |
user.dir | 다양 | 사용자가 현재 작업 중인 디렉토리 경로 |
환경 변수 읽기 : getenv()
String value = System.getenv(String name);
* 운영체제가 제공하는 환경 변수 값(문자열)을 읽음
Class 클래스
* 클래스와 인터페이스의 메타데이터 관리
- 메타데이터 : 클래스의 이름, 생성자 정보, 필드 정보, 메소드 정보
Class 객체 얻기 : getClass(), forName()
* getClass() : 객체로부터 얻는 방법
- 해당 클래스로 객체를 생성했을 때만 사용할 수 있음
Class clazz = obj.getClass();
* forName() : 문자열로부터 얻는 방법
- 객체를 생성하기 전에 직접 Class 객체를 얻는 방법
- Class는 생성자를 감추고 있기 때문에 new 연산자로 객체를 만들 수 없음
- static 메소드인 forName() 사용 : 클래스 전체 이름(패키지가 포함된 이름)을 매개값으로 받고 Class 객체를 리턴함
- 매개값으로 주어진 클래스를 찾지 못하면 ClassNotFoundException 예외 발생, 예외 처리가 필요함
try{
Class clazz = Class.forName(String className);
} catch (ClassNotFoundException e){
}
리플렉션 : getDeclaredConstructors(), getDeclaredFields(), getDeclaredMethods()
* 클래스의 생성자, 필드, 메소드 정보를 알아냄
Constructor[] constructors = clazz.getDeclaredConstructors();
Field[] fields = clazz.getDeclaredFields();
Method[] methods = clazz.getDeclareMethods();
동적 객체 생성 : newInstance()
try{
Class clazz = Class.forName("런타임 시 결정되는 클래스 이름");
Object obj = clazz.newInstance();
} catch(ClassNotFoundException e) {
} catch(InstantiationException e) {
} catch(IllegalAccessException e) {
}
* Class 객체를 이용하여 new 연산자를 사용하지 않고 동적으로 객체 생성
* 코드 작성 시에 클래스 이름을 결정할 수 없고, 런타임 시에 클래스 이름이 결정되는 경우에 유용
* newInstance() 메소드는 기본 생성자를 호출해서 객체를 생성하기 때문에 반드시 클래스에 기본 생성자가 존재해야 함
* InstantiationException 예외 : 해당 클래스가 추상 클래스이거나 인터페이스일 경우 발생
* IllegalAccessException예외 : 클래스나 생성자가 접근 제한자로 인해 접근할 수 없을 경우 발생
* 메소드의 리턴 타입이 Object이므로 원래 클래스 타입으로 변환해야 메소드를 사용할 수 있음 : 강제 타입 변환 필요 ➡️ 인터페이스 사용
String 클래스
String s = "Hello";
.....
s = "Java";
//Hello가 만들어진 힙 메모리에 Java를 넣지 않고
//새로운 객체를 만들어 java를 넣는다.
//여러 번 string을 번복해서 만들다보면 안쓰는 메모리가 많아질 수 있다.
생성자
* byte[] 배열을 문자열로 변환하는 생성자
//배열 전체를 String 객체로 생성
String str = new String(byte[] bytes);
//지정한 문자셋으로 디코딩
String str = new String(byte[] bytes, String charsetName);
//배열의 offset 인덱스 위치부터 length개 만큼 String 객체 생성
String str = new String(byte[] bytes, int offset, int length);
//지정한 문자셋으로 디코딩
String str = new String(byte[] bytes, int offset, int length, String charsetName)
* 키보드로 읽은 바이트 배열을 문자열로 변환할 수 있음
//키보드에서 입력한 내용을 매개값으로 주어진 바이트 배열에 저장하고 읽은 바이트 수를 리턴
System.in.read() 메소드
- 한글과 기타 다른 나라 언어 : 2바이트로 표현 : length 매개값으로 배열 길이에서 2를 빼줘야 함 : 엔터키가 2byte
String 메소드
사용 빈도수가 높은 메소드
리턴 타입 | 메소드명(매개 변수) | 설명 |
char | charAt(int index) | 특정 위치의 문자 리턴 |
boolean | equals(Object anObject) | 두 문자열 비교 |
byte[] | getBytes() | byte[]로 리턴: byte 배열 |
byte[] | getBytes(Charset charset) | 주어진 문자셋으로 인코딩한 byte[]로 리턴 |
int | indexOf(String str) | 문자열 내에서 주어진 문자열의 위치를 리턴 |
int | length() | 총 문자 수를 리턴 |
String | replace(CharSequence target, CharSequence replacement) |
target 부분을 replacement로 대치한 새로운 문자열을 리턴 |
String | substring(int beginIndex) | beginIndex위치에서 끝까지 잘라낸 새로운 문자열 리턴 |
String | substring(int beginIndex, int endIndex) |
beginIndex 위치에서 endIndex 전까지 잘라낸 새로운 문자열 리턴 |
String | toLowerCase() | 알파벳 소문자로 변환한 새로운 문자열 리턴 |
String | toUpperCase() | 알파벳 대문자로 변환한 새로운 문자열 리턴 |
String | trim() | 앞뒤 공백을 제거한 새로운 문자열 리턴 |
String | valueOf(int i) valueOf(double d) |
기본 타입값을 문자열로 리턴 |
문자 추출: charAt()
* 매개값으로 주어진 인덱스의 문자를 리턴
* 인덱스는 0 ~ '문자열길이 -1'까지를 말함
String subject = "자바 프로그래밍";
char charValue = subject.charAt(3);
</>
'프'
바이트 배열로 변환: getBytes()
* 시스템의 기본 문자셋으로 인코딩된 바이트 배열 리턴
byte[] bytes = "문자열".getBytes();
* 특정 문자셋으로 인코딩된 바이트 배열 리턴
byte[] bytes = "문자열".getBytes(Charset charset);
try{
byte[] bytes = "문자열".getBytes("EUC-KR");
byte[] bytes = "문자열".getBytes("UTF-8");
} catch (UnsupportedEncodingException e){
}
* UnsupportedEncodingException 예외
getBytes( ) 사이에 잘못된 문자셋을 매개값으로 줄 경우 예외가 발생함
* 바이트 배열을 다시 문자로 변환(디코딩)할 때 기본 문자셋 이용
String str = new String(bytes1);
* 바이트 배열을 다시 문자로 변환(디코딩)할 때 다른 문자셋 이용 : charset에는 사용한 문자셋 넣으면 된다.
String str = new String(bytes2, String charsetName);
문자열 찾기 : indexOf()
* 매개값으로 주어진 문자열이 시작되는 인덱스 리턴
String subject = "자바 프로그래밍";
int index = subject.indexOf("프로그래밍");
</>
3
* 특정 문자열이 포함되어 있는지 여부에 따라 실행코드를 달리 할 때 자주 사용
if(문자열.indexOf("찾는문자열") != -1) {
포함될 경우 실행문
} else {
포함되지 않을 경우 실행문
}
문자열 길이: length()
* 문자열의 길이(문자의 수)를 리턴함
- 공백도 문자에 포함
String subject = "자바 프로그래밍";
int length = subject.length;
</>
8
문자열 대치 : replace()
* 첫 번째 매개값인 문자열을 찾아 두 번째 매개값인 문자열로 대치한 새로운 문자열을 생성하고 리턴
- 원래 문자열의 수정본 XXX
- 새로운 객체로 생성된 문자열!
String oldStr = "자바 프로그래밍";
String newStr = oldStr.replace("자바", "JAVA");
</>
JAVA 프로그래밍
문자열 잘라내기 : substring()
*주어진 인덱스에서 문자열 추출
- substring(int beginindex, int endIndex ) : 시작과 끝 인덱스 사이의 문자열 추출 (끝 인덱스 -1임. 0부터 시작함)
- substring(int beginindex) :주어진 인덱스 이후부터 끝까지 문자열 추출
String ssn = "123456 - 7890123"
String firstNum = ssn.substring(0, 6);
String secondNum = ssn.substring(7);
</>
firstNum = 123456
secondNum = 7890123
알파벳 소문자 변경 : toLowerCase()
* 문자열을 모두 소문자로 바꾼 새로운 문자열을 생성 후 리턴
알파벳 대문자 변경 : toUpperCase()
* 문자열을 모두 대문자로 바꾼 새로운 문자열을 생성 후 리턴
String original = "Java Programming";
String lowerCase = original.toLowerCase();
String upperCase = original.toUpperCase();
</>
lowerCase = "java programming"
upperCase = "JAVA PROGRAMMING"
문자열 앞뒤 공백 잘라내기 : trim()
* 문자열의 앞뒤 공백을 제거한 새로운 문자열을 생성하고 리턴
- 앞뒤의 공백만 제거할 뿐 문자열 사이의 공백은 제거하지 않는다
String oldStr = " 자바 프로그래밍 ";
String newStr = oldStr.trim();
</>
newStr = 자바 프로그래밍
문자열 변환 : valueOf()
- 기본 타입의 값을 문자열로 변환
static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(int i)
static String valueOf(long l)
static String valueOf(double d)
static String valueOf(float f)
StringTokenizer 클래스
* 문자열을 토큰으로 나눈다고 하여 '스트링토크나이저'라고 부름
* 문자열이 특정 구분자로 연결되어 있을 경우, 구분자를 기준으로 부분적으로 문자열을 분리할 수 있다
* split() 메소드를 이용하거나 StringTokenizer 클래스를 이용하면 된다
* split() 메소드는 정규 표현식으로 구분
* StringTokenizer는 문자로 구분
split() 메소드
* String의 split() 메소드는 정규 표현식을 구분자로 하여, 문자열을 분리, 배열에 저장, 리턴
* 정규표현식을 넣고 ( | )'또는' 에 사용하는 기호로 연결하여 매개값으로 제공하면 됨
String[] result = "문자열".split("정규표현식");
//예시
String text = "홍길동&이수홍,박연수,김자바-최명호";
String[] results = text.split("& | , | -");
for(String result : results){
System.out.println(result);
}
</>
홍길동
이수홍
박연수
김자바
최명호
StringTokenizer 클래스
* 문자열이 한 종류의 구분자로 연결되어 있을 경우, StringTokenizer 클래스로 쉽게 분리할 수 있음
* 첫 번째 매개값으로 전체 문자열을 주고, 두 번째 매개값으로 구분자를 주면 됨
StringTokenizer st = new StringTokenizer("문자열", "구분자");
//예시
String test = "홍길동/이수홍/박연수";
StringTokenizer st = new StringTokenizer(test, "/");
</>
홍길동
이수홍
박연수
StringBuffer, StringBuilder 클래스
* String은 내부의 문자열 수정 불가 ➡️ 대치된 새로운 문자열 리턴 ➡️ 사용하지 않는 객체가 늘어남
- 문자열 결합 연산자 + 를 많이 사용하면 할수록 프로그램 성능이 느려진다
- ABC라는 객체와 ABCDEF라는 두개의 객체가 생겨나게 됨
String data ="ABC";
data += "DEF";
*StringBuffer, StringBuilder 사용 : 문자열을 변경하는 작업이 많을 경우 사용
- 버퍼에 문자열 저장하고 버퍼 내부에서 추가, 수정, 삭제 작업 가능
- String처럼 새로운 객체를 만들지 않고도 문자열 조작 가능
- buffer : 데이터를 임시로 저장하는 메모리
* 멀티 스레드환경 : StringBuffer 사용
* 단일 스레드환경 : StringBuilder 사용
* StringBuilder()
- 16개의 문자들을 저장할 수 있는 초기 버퍼를 만듦
- 버퍼가 부족할 경우 자동으로 버퍼 크기를 늘리기 때문에 초기 버퍼의 크기는 중요하지 않음
- StringBuilder(String str) 생성자는 str로 주어진 매개값을 계속해서 바꿈
StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder(16);
StringBuilder sb = new StringBuilder("Java");
</>
sb = "Java"
* StringBuilder()의 문자 추가, 삽입, 삭제 등의 메소드
정규 표현식과 Pattern 클래스
정규 표현식 작성 방법
* 기본적인 기호들
기호 | 설명 | ||
[] | 한 개의 문자 | [abc] | a,b,c 중 하나의 문자 |
[^abc] | a,b,c 이외의 하나의 문자 | ||
[a-zA-Z] | a~z, A~Z 중 하나의 문자 | ||
\d | 한개의 숫자, [0-9]와 동일 | ||
\s | 공백 | ||
\w | 한 개의 알파벳 또는 한 개의 숫자, [a-zA-Z_0-9]와 동일 | ||
? | 없음 또는 한 개 | ||
* | 없음 또는 한 개 이상 | ||
+ | 한 개 이상 | ||
{n} | 정확히 n개 | ||
{n.} | 최소한 n개 | ||
{n,m} | n개에서부터 m개까지 | ||
() | 그룹핑 |
* 전화번호를 위한 정규 표현식
* 이메일을 위한 정규 표현식
※ 주의할 점 : \. 과 . 은 다름
\. 은 문자열로서의 점(.)을 말하지만
. 은 모든 문자 중에서 한 개의 문자를 뜻함
Pattern 클래스
* matches() 메소드
- 문자열을 정규 표현식으로 검증하는 기능을 제공하는 메소드
- 첫 번째 매개값은 정규 표현식, 두 번째 매개값은 검증할 문자열
- 검증 후 결과가 boolean 타입으로 리턴
boolean result = Pattern.matches("정규식", "검증할 문자열");
Arrays 클래스
* 배열 조작 기능 : 배열의 복사, 항목 정렬, 항목 검색과 같은 기능
- 단순한 배열 복사는 System.arraycopy() 메소드를 사용해도 됨
- Arrays 클래스는 추가적으로 항목 정렬, 항목 검색, 항목 비교와 같은 기능을 제공해 줌
* Arrays의 메소드 : static 이므로 Arrays 클래스로 바로 이용 가능
배열 복사 : copyOf(), copyOfRange()
* copyOf(원본배열, 복사할길이)
- 원본 배열의 0번 인덱스에서 복사할 길이만큼 복사한 타겟 배열을 리턴
- 복사할 길이는 원본 배열의 길이보다 커도 되며, 타겟 배열의 길이가 됨
char[] arr1 = {'J', 'A', 'V', 'A'};
char[] arr2 = Arrays.copyOf(arr1, arr.length);
* copyOfRange(원본배열, 시작인덱스, 끝인덱스)
- 원본 배열의 시작 인덱스에서 끝 인덱스까지 복사한 배열을 리턴
- 시작 인덱스는 포함되지만 끝 인덱스는 포함되지 않음
char[] arr1 = {'J', 'A', 'V', 'A'};
char[] arr2 = Arrays.copyOfRange(arr1, 1, 3); //1,2만 복사됨
</>
[A, V]
* System.arraycopy(원본배열, 원본시작인덱스, 타겟배열, 타겟시작인덱스, 복사개수)
- 단순 배열 복사라면 System.arraycopy() 메소드 사용해도 됨
- 원본시작인덱스 : 원본 배열에서 복사할 항목의 시작 위치
- 타겟시작인덱스 : 타겟 배열에서 복사 시작 위치
- 복사개수 : 원본 시작 인덱스에서부터 몇 개의 항목을 복사할 것인지
배열 항목 비교 : equals(), deepEquals()
* Arrays.equals() : 1차 항목의 값만 비교
* Arrays.deepequals() : 중첩된 배열의 항목까지 비교
public class EqualsExample{
public static void main(String[] args){
int[][] original = { {1,2} , {3,4} };
//얕은 복사 후 비교
System.out.println("[얕은 복제후 비교]");
int[][] cloned1 = Arrays.copyOf(original, original.length);
System.out.println("배열 번지 비교: " + original.equals(cloned1));
System.out.println("1차 배열 항목값 비교: " + Arrays.equals(original, cloned1));
System.out.println("중첩 배열 항목값 비교: " + Arrays.deepequals(original, cloned1));
//깊은 복사 후 비교
System.out.println("\n[깊은 복제후 비교]");
int[][] cloned2 = Arrays.copyOf(original, original.length);
cloned2[0] = Arrays.copyOf(original[0], original[0].length);
cloned2[1] = Arrays.copyOf(original[1], original[1].length);
System.out.println("배열 번지 비교: " + original.equals(cloned2));
System.out.println("1차 배열 항목값 비교: " + Arrays.equals(original, cloned2));
System.out.println("중첩 배열 항목값 비교: " + Arrays.deepequals(original, cloned2));
}
}
</>
[얕은 복제후 비교]
배열 번지 비교: false
1차 배열 항목값 비교: true
중첩 배열 항목값 비교: true
[깊은 복제후 비교]
배열 번지 비교: false
1차 배열 항목값 비교: false
중첩 배열 항목값 비교: true
배열 항목 정렬 : sort()
* sort() 메소드 : 기본 타입 또는 String 배열은 자동으로 오름차순 정렬이 됨
* 사용자 정의 클래스 타입일 경우 : 클래스가 Comparable 인터페이스를 구현해야 정렬이 됨
int[] scores = {99, 97, 98};
Arrays.sort(scores);
public class Member implements Comparable<Member>{
//필드
String name;
//생성자
Member(String name){
this.name = name;
}
@Override
public int compareTo(Member o) {
return name.compareTo(o.name);
}
}
/**
Comparable<Member>는 Member 타입만 비교하기 위해 <> 사용
compareTo()는 비교값을 리턴하도록 오버라이딩함
compareTo() 리턴값
- 오름차순 : 매개값보다 낮으면 음수, 같으면 0, 높으면 양수
- 내림차순 : 매개값보다 높으면 음수, 같으면 0, 낮으면 양수
**/
Comparable<Member>는 Member 타입만 비교하기 위해 <> 사용
compareTo()는 비교값을 리턴하도록 오버라이딩함
compareTo() 리턴값
- 오름차순 : 매개값보다 낮으면 음수, 같으면 0, 높으면 양수
- 내림차순 : 매개값보다 높으면 음수, 같으면 0, 낮으면 양수
배열 항목 검색 : binarySearch()
* 배열 항목에서 특정 값이 위치한 인덱스를 얻는 것
*Arrays.sort() 메소드로 항목들을 오름차순으로 정렬 ➡️ Arrays.binarySearch() 메소드로 항목 찾기
String[] names = { "홍길동", "박동수", "김민수" };
Arrays.sort(names);
index = Arrays.binarySearch(names, "홍길동")
</>
index = 2