Language/JAVA

열세번째날[기본API 클래스(2) - Objects 클래스 / System 클래스/ Class 클래스 / String 클래스 / StringTokenizer 클래스 / StringBuffer /StringBuilder 클래스 / 정규 표현식 / Pattern 클래스 / Arrays 클래스]

구일일구 2022. 8. 9. 23:56
반응형

목차

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()의 문자 추가, 삽입, 삭제 등의 메소드

insert : 옆 공간을 밀고 새롭게 들어감 /&nbsp;setCharAt : 있는 문자를 다른 문자로 대치

 


정규 표현식과 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
반응형