본문 바로가기

2022 여름방학 자바 스터디

[이것이 자바다] Ch11. 기본 API 클래스

11.1. 자바 API 도큐먼트

자바API

- 자바에서 기본적으로 제공하는 라이브러리

- 프로그램 개발에 자주 사용되는 클래스 및 인터페이스의 모음

API도큐먼트

- 쉽게 API를 찾아 이용할 수 있도록 문서화한 것

- HTML 페이지로 작성되어 있어 웹 브라우저로 바로 볼 수 있음

 

Java Platform SE 7

 

docs.oracle.com

11.2. java.lang과 java.util 패키지

11.2.1 java.lang 패키지

- 자바 프로그램의 기본적인 클래스를 담고 있는 패키지

- 포함된 클래스와 인터페이스는 import 없이 사용 가능

 

Object

: 자바 클래스의 최상위 클래스

System

: 표준 입출력 장치, 자바 가상 머신을 종료시킬 때, 쓰레기 수집기를 실행 요청할 때

Class

: 클래스를 메모리로 로딩할 때

String

: 문자열을 저장하고 여러 정보를 얻을 때

Math

: 수학 함수를 이용할 때

Wrapper(Byte, Short, Float, ...)

: 기본 타입의 데이터를 갖는 객체를 만들 때, 입력값 검사할 때, 문자열을 기본 타입으로 변환할 때

11.2.2 java.util 패키지

Arrays

: 배열을 조작할 때 사용

Calendar

: 운영체제의 날짜와 시간을 얻을 때 사용

Date

: 날짜와 시간 정보를 저장하는 클래스

Objects

: 객체 비교, 널 여부 등을 조사할 때 사용

String Tokenizer

: 특정 문자로 구분된 문자열을 뽑아낼 때 사용

Random

: 난수를 얻을 때 사용

11.3. Object 클래스

자바의 최상위 클래스

- 다른 클래스를 상속하지 않으면 암시적으로 java.lang.Object 클래스를 상속함

(extends XXX와 같은 것이 없으면~ 암시적으로 extends Object로 간주)

- Object의 메소드는 모든 클래스에서 사용 가능

11.3.1. 객체 비교 equals()

public boolean equals(Object obj) { ... }
// 현재 객체와 매개값으로 들어오는 객체를 비교해서 T/F return

Object obj1 = new Object();
Object obj1 = new Object();

boolean res = obj1.equals(obj2);
boolean res = (obj1 == obj2);

- 기본적으로 == 연산자와 동일한 결과를 리턴 (번지비교)

- 논리적 동등을 위해 오버라이딩이 필요,,

: 논리적 동등? 같은 객체이건 다른 객체이건 상관없이 객체가 저장하고 있는 데이터가 동일함

- 보통 equals()는 직접 사용되기 보다는 재정의해서 논리적 동등을 비교할 때 사용함

예: String 클래스는 equals()를 재정의해서 String 객체간에 문자열을 비교함

11.3.2. 객체 해시코드 hashCode()

객체의 해시코드란?

- 객체를 식별할 하나의 정수값을 말함

- Object의 hashCode() 메소드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴

: 따라서 개별 객체는 해시코드가 모두 다름

 

논리적 동등 비교시 hashCode() 오버라이딩의 필요성

- 논리적 동등 객체는 hashCode()가 리턴하는 값도 같아야 함

11.3.3. 객체 문자 정보 toString()

객체 문자정보

- 객체의 문자 정보란, 객체를 문자열로 표현한 값을 말함

- 일반적으로 재정의해서 의미있는 문자 정보가 나오도록 함

Object obj = new Object();
System.out.pritnln(obj.toString());

 

11.3.4. 객체 복제 clone()

객체 복제

- 원본 객체의 필드값과 동일한 값을 가지는 새로운 객체를 생성하는 것을 말함

- 복제 종류

: 얕은 복제, 단순히 필드 값만 복제 (참조 타입 필드는 번지 공유)

: 깊은 복제, 참조하고 있는 객체도 복제

- 깊은 복제를 하려면 clone() 메소드를 재정의하고 참조 객체도 복제해야 함

11.3.5. 객체 소멸자 finalize

- GC는 객체를 소멸하기 직전에 마지막으로 객체의 소멸자를 실행시킴

- Object의 finalize()는 기본적으로 실행 내용이 없음

- 객체가 소멸되기 전에 실행할 코드가 있다면 재정의함

- 될 수 있다면 소멸자를 사용하지 않는 것이 좋음

: GC는 메모리의 모든 쓰레기 객체를 소멸하지 않음

: GC의 구동 시점이 일정하지 않음

11.4. Objects 클래스

- java.util 클래스에 포함되어 있음

- 객체 비교, 해시코드 생성, 널 여부, 객체 문자열 리턴 등의 연산을 수행하는 정적 메소드들로 구성된 Object의 유틸리티 클래스

11.4.1. 객체 비교

- a, b 두 객체를 비교자로 비교해서 int 값을 리턴

- Comparator<T> 인터페이스

- compare(T a, T b) 메소드를 재정의해서 비교하는 코드를 작성해야 함

11.4.2. 동등 비교

- 두 객체의 동등을 비교함

- Objects.equals(Object a, Object b)

: 객체 자체의 비교

- deepEquals(Object a, Object b)

: 비교할 객체가 배열일 경우 항목값까지도 비교

11.4.3. 해시코드 생성

Objects.hash(Object .. values)

- 매개값으로 주어진 값들을 이용해서 해시 코드를 생성하는 역할

- 클래스의 hashCode()의 리턴값을 생성할 때 유용하게 사용할 수 있음

Objects.hashCode(Object o)

- o.hashCode() 호출하고 받은 값을 리턴

- 매개값이 null이면 0을 리턴

11.4.4. 널 여부 조사

Objects.isNull(Object obj)

: obj가 null인 경우 true

Objects.nonNull(Object obj)

: obj가 not null인 경우 true

requireNonNull()

11.4.5. 객체 문자 정보

- 객체의 문자 정보를 리턴한다

- toString()

11.5. System 클래스

System 클래스의 용도

: 운영체제의 기능을 일부 이용 가능

- 프로그램 종료, 키보드로부터의 입력, 모니터로 출력, 메모리 정리, 현재 시간 읽기

- 시스템 프로퍼티 읽기, 환경 변수 읽기

 

11.5.1. 프로그램 종료 exit()

: 강제적으로 JVM을 종료

- int 매개값을 지정하도록 되어 있는데, 이 값을 종료 상태값이라고 함

- 정상 종료일 경우 0을 지정하고, 비정상 종료일 경우 0 이외의 다른 값을 줌

- 만약 특정 상태값이 입력되었을 경우에만 종료하고 싶다면 자바의 보안 관리자를 설정하면 됨

11.5.2. 쓰레기 수집기 실행 gc()

: JVM에게 가능한 한 빨리 GC를 실행해 달라고 요청

- gc()가 호출되면 쓰레기 수집기가 바로 실행되는 것은 아니고,  JVM은 빠른 시간내에 실행시키기 위해 노력함

11.5.3. 현재 시각 읽기 currentTimeMillis(), nanoTime()

- 현재 시간을 밀리세컨드와 나노세컨드 단위의 long 값을 리턴

- 주로 프로그램 실행 소요 시간을 구할 때 이용됨

11.5.4. 시스템 프로퍼티 읽기 getProperty()

- 시스템 프로퍼티

: JVM이 시작할 때 자동 설정되는 시스템의 속성값

- 대표적인 키와 값

11.5.5. 환경 변수 읽기 getenv()

- 운영체제가 제공하는 환경 변수의 값을 읽음

String value = System.getenv(String name);

11.6. Class 클래스

- 클래스와 인터페이스의 메타 데이터를 얻을 수 있음 (리플렉션)

: 메타데이터 - 클래스의 이름, 생성자 정보, 필드 정보, 메소드 정보

- 문자열로 된 클래스 명으로부터 동적 객체 생성을 할 수 있음

11.6.1. Class 객체 얻기 getClass(), forName()

- 객체로부터 얻는 방법

Class clazz = obj.getClass();

- 문자열로부터 얻는 방법

11.6.2. 리플렉션

- 클래스의 생성자, 필드, 메소드 정보를 알아내는 것

11.6.3. 동적 객체 생성 newInstance()

- 실행 도중에 클래스 이름이 결정될 경우, 동적으로 객체 생성을 할 수 있음

Class clazz = Class.forName("SendAction" 또는 "ReceiveAction");
Action action = (Action) clazz.newInstance();
action.execute();

11.7. String 클래스

11.7.1. String 생성자

- byte[] 배열을 문자열로 변환하는 생성자

// 1. 바이트 배열을 매개값으로 받은 뒤 스트링 객체로 만드는 방법
String str = new String(byte[] byte);

// 2. 바이트 배열 안에 있는 데이터가 특정한 문자셋으로 인코딩 되어있다면
// 다시 디코딩을 하는 방식
String str = new String(byte[] bytes, String charsetName);

// 3. 바이트 배열, 오프셋, 길이
String str = new String(byte[] bytes, int offset, int length);

// 4.
String str = new String(byte[] byte, int offset, int length, String charsetName);

- 키보드로부터 읽은 바이트 배열을 문자열로 변환

11.7.2. String 메소드

- String은 문자열의 추출, 비교, 찾기, 분리, 변환 등과 같은 다양한 메소드 존재

문자 추출 charAt()

String subject = "자바 프로그래밍";
char charValue = subject.charAt(3);

3인덱스 위치에 있는 문자를 말함.

문자열 비교 equals()

- 기본 타입 변수의 값을 비교할 때는 == 연산자를 사용

- 그러나 문자열을 비교할 때는 새로운 객체가 만들어지기 때문에, 객체의 문자열만 비교하고 싶으면 equals()

- == 는 각 변수에 저장된 번지를 비교

바이트 배열로 변환 getBytes()

- 시스템의 기본 문자셋으로 인코딩 된 바이트 배열을 리턴

byte[] bytes = 문자열.getBytes(); // 인코딩
String str = nwe String(byte[] bytes); // 디코딩

문자열 찾기 indexOf()

- 매개값으로 주어진 문자열이 시작되는 인덱스를 리턴

- 주어진 문자열이 포함되어 있지 않으면 -1을 리턴

String subject = "자바 프로그래밍";
int index = subject.indexOf("프로그래밍");

- 특정 문자열이 포함되어 있는지 여부에 따라 실행 코드를 달리할 때 자주 사용됨

문자열 길이 length()

- 문자열의 길이(문자의 수)를 리턴

문자열 대치 replace()

- 첫번째 매개값인 문자열을 찾아 두번째 매개값인 문자열로 대치한 새로운 문자열을 리턴

String oldstr = "자바 프로그래밍";
String newstr = oldstr.replace("자바", "JAVA");

문자열 잘라내기 substring()

- substring(int beginIndex, int endIndex)

: 주어진 시작과 끝 인덱스 사이의 문자열을 추출

- substring(int beginIndex)

: 주어진 인덱스 이후부터 끝까지 문자열을 추출

알파벳 소/대문자 변경

- toLowerCase() 전부 소문자로- toUpperCase() 전부 대문자로

문자열 앞뒤 공백 잘라내기

- trim()- 앞 뒤의 의미없는 공백을 잘라냄

문자열 변환

- 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)

11.8. StringTokenizer 클래스

11.8.1. split() 메소드

- 정규 표현식을 구분자로해서 부분 문자열을 분리한 후, 배열에 저장하고 리턴

String text = "홍길동&이수홍,박연수,김자바-최명호";
String[] names = text.split("&|,|-");

11.8.2. StringTokenizer 클래스

- 통일된 구분자만 가능

String text = "홍길동/이수홍/박연수";
StringTokenizer st = new StringTokenizer(text, "/");
메소드 설명
int countTokens() 꺼내지 않고 남아있는 토큰의 수
boolean hasMoreTokens() 남아 있는 토큰이 있는지 여부 (t/f)
String nextToken() 토큰을 하나씩 꺼내옴

11.9. StringBuffer, StringBuilder 클래스

- 문자열 결합 연산자

: String은 내부의 문자열을 수정할 수 없음, 새로운 객체가 만들어지는 것

 

- 위 단점을 보완한 StringBuffer, Stringbuilder

- 사용 방법은 동일하나, 스레드 환경의 차이

- 버퍼에 문자열을 저장

- 버퍼 내부에서 추사, 수정, 삭제 작업 가능

- 멀티 스레드 환경: StringBuffer

- 단일 스레드 환경: StringBuilder

StringBuilder

메소드 설명
append 문자열 끝에 주어진 매개값 추가
insert 문자열 중간에 주어진 매개값 추가
delete 문자열 일부 삭제
deleteCharAt 문자열에서 주어진 index의 문자를 삭제
replace 문자열의 일부분을 다른 문자열로 대치
reverse 문자열의 순서를 뒤바꿈
setCharAt 문자열에서 주어진 index의 문자를 다른 문자로 대치

11.10. 정규 표현식과 Pattern 클래스

정규 표현식?

: 정해진 규칙대로 표현되어 있는가?

: 문자열이 정해져 있는 형식으로 구성되어 있는지 검증할 때 사용 (이메일, 전화번호, 비밀번호 등)

: 문자 또는 숫자 기호와 반복 기호가 결합된 문자열

11.10.1. 정규 표현식 작성 방법

- 기본적으로 알아두어야 할 기호

 

!! 02-123-1234 또는 010-1234-5678과 같은 전화번호를 위한 정규식 !!

(02|010)-\d{3,4}-\d{4}

!! 이메일 !!

\w+@\w+\.\w+(\.\w+)?

11.10.2. Pattern 클래스

- 정규 표현식으로 문자열을 검증하는 역할

boolean res = Pattern.matches("정규식", "검증할 문자열");