[2017/2/24] Project Java: CH 9. java.lang 패키지와 유용한 클래스

CH 9. java.lang 패키지와 유용한 클래스
1. java.lang 패키지
-자바 프로그래밍의 가장 기본이 되는 클래스들을 포함하고 있다.
-import문 없이도 사용할 수 있게 되어있다.

1.1. Object 클래스
-모든 클래스에서 바로 사용 가능하다.
-멤버 변수 없이 오직 11개의 메서드만 가지고 있다.

● equals(Object obj)
-객체의 참조변수 받아서 비교하여 그 결과를 boolean값으로 알려준다.
-참조변수의 값 비교 –> 서로 다른 두 객체 equals 비교 시 항상 false
-하위 클래스에서 equals 메서드 오버라이딩하여 주소가 아닌 객체 내용 비교하도록 해야 한다.
-String, Date, File, wrapper 클래스에서 오버라이딩되어 있다. 다만 StringBuffer 클래스는 오버라이딩되지 않았다.

● hashCode()
-해싱 기법에 사용되는 해시함수 구현한 것.
-Object 클래스에 정의된 hashCode()는 객체의 주소값을 이용해서 해시코드 만들어 반환. 다른 두 객체는 결코 같은 해시코드 가질 수 없다.
-String 클래스는 hasCode 메서드 오버라이딩 시킴. 내용 같으면 동일한 해시코드 가짐.
-System.identityHashCode(Object x) –> 객체의 주소값으로 해시코드 생성

● toString()
-인스턴스에 대한 정보를 문자열로 제공할 목적으로 정의
-대부분의 경우 인스턴스 변수에 저장된 값들을 문자열로 표현한다는 뜻.
-Object 클래스에 정의된 toString()은 클래스 이름에 16진수 해시코드 합한 값.
I.e. Card@139a55
-String 클래스의 경우 문자열 반환하도록 오버라이딩, Date 클래스의 경우 Date 인스턴스가 가지고 있는 날짜와 시간 문자열로 반환.
-Object 클래스에서 접근 제어자가 public이므로 오버라이딩 할 때 반드시 public으로 (사실 toString, hashCode, equals 다 접근 제어자 public)

● clone()
-자신을 복제하여 새로운 인스턴스를 생성하는 일 한다.
-작업 이전의 값 보존하는 역할
-Object 클래스의 clone()은 인스턴스 변수의 값만을 복사, 완전한 인스턴스 복제가 이뤄지지 않는다.
-배열의 경우 복제된 인스턴스의 작업이 원래의 인스턴스에 영향을 미치게 된다.
-clone() 사용 시 유의 사항
● Cloneable 인터페이스를 구현한 클래스에서만 clone()을 호출할 수 있다.
● clone() 메서드 오버라이딩할 때 접근 제어자를 public으로 한다.
● clone() 메서드는 반드시 예외처리 해줘야 한다.
I.e. try {} catch(CloneNotSupportedException) {}

● 공변 반환타입
-오버라이딩할 때 조상 메서드의 반환 타입을 자손 클래스의 타입으로 변경을 허용하는 것.
-예전에는 오버라이딩할 때 조상에 선언된 메서드의 반환타입을 그대로 사용해야 했다.
-번거로운 형변환이 줄어든다는 장점이 있다.

● 얕은 복사와 깊은 복사
-clone()은 객체가 참조하고 있는 객체까지 복제하지는 않는다.
–> 얕은 복사, 원본을 변경하면 복사본도 영향을 받는다.
-깊은 복사: 원본이 참조하고 있는 객체까지 복제하는 것.

● getClass()
-자신이 속한 클래스의 Class 객체를 반환하는 메서드
-Class 객체란 이름이 Class인 클래스의 객체
-Class 객체에는 클래스의 모든 정보를 담고 있으며, 클래스당 1개만 존재.
-클래스 정보 필요할 때 먼저 Class 객체에 대한 참조를 얻어와야 한다.
● Class cobj = new Card().getClass();
● Class cobj = Card.class; //클래스 리터럴로부터 얻는 방법
● Class cobj = Class.forName(“Card”); //클래스 이름으로부터 얻는 방법
-forName()은 특정 클래스 파일 메모리에 올릴 때 사용.
-멤버 이름, 개수 등 클래스에 대한 모든 정보를 얻을 수 있기 때문에 Class 객체를 통해 객체를 생성하고 메서드를 호출하는 등 보다 동적인 코드를 작성할 수 있다.
● Card c = new Card(); //new 연산자를 이용해서 객체 생성
● Card c = Card.class.newInstance(); //Class 객체를 이용해서 객체 생성

1.2. String 클래스
-자바에서는 문자열을 위한 클래스를 제공한다.

● 변경 불가능한 클래스
-읽어올 수만 있고 변경할 수는 없다.
-‘+’ 연산자 이용한 문자열 결합은 새로운 String 인스턴스 생성하는 것.
–> 가능한 한 결합횟수를 줄이자.
-문자열 간 결합이나 추출 많을 때는 StringBuffer 쓰자.

● 문자열의 비교
-두 가지 방법
● String str1 = “abc”; //문자열 리터럴 “abc”의 주소가 str1에 저장됨
● String str2 = new String(“abc”); //새로운 String 인스턴스 생성
-문자열 리터럴은 이미 존재하는 것 재사용하는 것(문자열 리터럴은 클래스가 메모리에 로드될 때 자동적으로 미리 생성)

● 문자열 리터럴
-모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장된다.
-이때 같은 내용의 문자열 리터럴은 한번만 저장된다. (하나의 인스턴스 공유하면 되기 때문)
-리터럴들이 상수 저장소에 저장된다.

● 빈 문자열
-길이가 0인 배열은 존재한다.
-이 배열을 내부적으로 가지고 있는 문자열이 빈 문자열이다.
● char[] chArr = new char[0]; //길이가 0인 char 배열
● int[] iArr = {}; //길이가 0인 int 배열
● String s = null; //String s = “”;
● char c = ‘\u0000’; //char c = ‘ ’;
● char c = ‘’; // 에러

char[] cArr = new char[0]; //길이가 0인 배열
String s = new String(cArr); //내부적으로 길이가 0인 배열 가지고 있는 문자열

● join()과 StringJoiner
-join()은 여러 문자열 사이에 구분자를 넣어서 결합.
-split()과 반대의 작업
-java.util.StringJoiner 클래스 사용해서 결합할 수도 있다.

StringJoiner sj = new StringJoiner(“/”,“[”,“]”);

● 유니코드의 보충문자
-메서드 중 매개변수의 타입이 int인 것: 확장된 유니코드의 보충문자를 지원하는 것들

● 문자 인코딩 변환
-getBytes(String charsetName) 사용하면 문자열의 문자 인코딩을 다른 인코딩으로 변경할 수 있다.
-한글 윈도우는 CP949 사용

● String.format()
-형식화된 문자열 만들어내는 간단한 방법.
String str = String.format(“%d를 입력하세요”, 3);

● 기본형 값을 String으로 변환
-두가지 방법
int i = 1;
● String str1 = i + “”;
● String str2 = String.valueOf(i);
-성능 향상이 필요한 경우에만 valueOf() 쓰자.

● String을 기본형 값으로 변환
-두가지 방법
● int i = Integer.parseInt(“100”);
● int i2 = Integer.valueOf(“100”);
-valueOf()의 반환형은 Integer이지만 오토박싱에 의해 자동 변환된다.
-parseInt()나 parseFloat()의 경우 공백이 있는 경우 예외 발생하므로 trim() 같이 써주자.
-그러나 부호, 소수점, 자료형 접미사는 허용된다.

int result = Integer.parseInt(“a”, 16); //result = 10;

String fileName = fullName.substring(0, index); //substring()

1.3. StringBuffer 클래스와 StringBuilder 클래스
-StringBuffer 클래스는 문자열 변경이 가능하다.
-내부적으로 문자열 편집을 위한 버퍼를 가지고 있으며, 크기 지정 가능.
-버퍼의 길이는 충분히 잡아주는 것이 작업효율에 좋다.
-String클래스와 유사한 메서드 + 추가, 변경, 삭제와 같이 저장된 내용 변경 위한 메서드

● StringBuffer의 생성자
-인스턴스 생성될 때 적절한 길이의 char 배열이 생성되고, 이 배열이 문자열을 저장하고 편집하기 위한 공간으로 사용된다.
-버퍼의 크기 지정해주지 않으면 16개 문자 저장할 수 있는 크기의 버퍼 생성.
-버퍼의 크기 작을 때는 내부적으로 버퍼의 크기를 증가시키는 작업이 수행된다.

● StringBuffer의 변경
-append()의 반환 타입은 자신의 주소.
-연속적으로 append() 호출하는 것이 가능

● StringBuffer의 비교
-StringBuffer 클래스는 equals 메서드를 오버라이딩하지 않았다.
-toString()은 오버라이딩되어있음, 반환형은 String

● StringBuilder란?
-StringBuffer에서 쓰레드의 동기화 뺀 기능.
-성능향상이 반드시 필요한 경우가 아니라면 굳이 바꿀 필요는 없다.
1.4. Math 클래스
-Math 클래스 생성자의 접근제어자가 private()이므로 다른 클래스에서 Math인스턴스 생성 불가.
-메서드는 모두 static이며, 자연로구의 밑과 원주율만 상수로 정의해 놓음.
-메서드 이름에 Exact 있으면 오버플로우 발생 시 예외 발생한다.
-StrictMath클래스는 어떤 OS에서 실행되어도 같은 결과를 얻도록 작성한 것.

● 올림, 버림, 반올림
-소수점 두 자리까지 값 얻을 때
1. 원래 값에 100을 곱한다.
2. 위의 결과에 Math.round() 사용
3. 위의 결과를 다시 100.0으로 나눈다.
-rint()는 반환값이 double이며, 매개변수의 값이 음수일 때 소수점 자리가 5 미만일 때 반올림한다.

1.5. 래퍼 클래스
-객체지향 개념에서는 모든 것이 객체로 다뤄져야 하나 8개의 기본형은 객체로 다뤄지지 않는다. –> 래퍼 클래스를 통해 기본형 역시 객체로 다룰 수 있다.
-매개변수로 문자열이나 각 자료형의 값들을 인자로 받는다.
-문자열 제공 시 각 자료형에 알맞은 문자열 사용해야 한다.
I.e. new Integer(“1.0”); // 예외 발생
-char –> Character, int –> Integer
-equals() 오버라이딩되어 있지만 비교연산자는 사용할 수 없고, 대신 compareTo() 사용
-toString() 오버라이딩 됨.
-static 상수 공통적으로 가지고 있음

● Number 클래스
-숫자와 관련된 래퍼 클래스들의 조상.
-이외에도 BigInteger, BigDecimal 등을 가지고 있음.

● 문자열을 숫자로 변환하기
-기본형으로 변환하는 방법에서 하나 추가
● int i1 = new Integer(“100”).intValue();
● int i2 = Integer.parseInt(“100”);
● Integer i3 = Integer.valueOf(“100”);
-오토박싱을 통해 반환값이 기본형일 때와 래퍼 클래스일 때의 차이가 없어졌다.
-다른 진법일 때도 사용 가능. (진법 생략 시 10진법 간주)

● 오토박싱 & 언박싱
-예전에는 기본형과 참조형 간의 연산이 불가능했으나, 요즘은 컴파일러가 자동으로 변환하는 코드를 넣어준다.
-기본형 –> 래퍼 클래스 객체 : 오토박싱
-반대로 변환하는 것: 언박싱

int i1 = 10;
Integer i2 = (Integer)i1; //형변환 생략 가능, 원래는 Integer i2 = Integer.valueOf(i1);

-오토박싱 통해 기본형과 참조형 간 형변환, 참조형 간의 연산도 가능하다.

2. 유용한 클래스
2.1. java.util.Objects 클래스
-Object 클래스의 보조 클래스, 모든 메서드가 static
-객체 비교나 널 체크에 유용하다.
-isNull(), requireNonNull()
-대소 비교를 위한 compare() 추가. lryetkd이 크면 양수, 작으면 음수, 같으면 0 반환
-equals()의 경우 null 검사를 내부에서 해준다. (둘 다 null일 경우 참을 반환)
-deepEquals()의 경우 다차원 배열의 비교도 가능.
-toString() 역시 null 검사한다는 것 외에는 차이가 없으나 매개변수가 null일 경우 대신 사용할 값 등록 가능하다.

2.2. java.util.Random 클래스
-Random() 클래스 이용해서도 난수 생성 가능.
double randomNum = new Random().nextDouble();
double randomNum = Math.random();

double randomNum2 = (int)(Math.random() * 6) + 1;
double randomNum2 = new Random().nextInt(6) + 1; //nextInt(6)은 0과 6 사이의 정수

-Random은 종자값을 설정할 수 있다.
-종자값이 같은 Random 인스턴스는 항상 같은 난수를 같은 순서대로 반환한다.
-생성자 Random()은 종자값을 System.currentTimeMills()로 하기 때문에 실행할 때마다 난수가 달라진다.

2.3. 정규식 – java.util.regex 패키지
-정규식: 텍스트 데이터 중에서 원하는 조건과 일치하는 문자열을 찾아내기 위해 사용하는 것.

String[] data = {“bat, ”baby“};
Pattern p = Pattern.compile(“c[a-z]*”);

for(int i = 0; i < data.length; i++){
Matcher m = p.matcher(data[i]);
if(m.matches()){
System.out.print(data[i] +“, ”);
}
}

-Pattern: 정규식 정의하는데 사용
-Matcher: 정규식을 데이터와 비교하는 역할
-순서
1. 정규식을 매개변수로 Pattern 클래스의 static 메서드인 Pattern compile(String regex)을 호출하여 Pattern 인스턴스를 얻는다.
2. 정규식과 비교할 대상을 매개변수로 Pattern 클래스의 matcher 호출해서 Matcher 인스턴스 얻는다.
3. Matcher 인스턴스에 matches() 호출해서 정규식에 부합하는지 확인한다.
-정규식의 일부를 괄호로 묶어서 그룹화할 수 있다.
-find()는 패턴과 일치하는 부분을 찾아내면 true 반환

2.4. java.util.Scanner 클래스
-화면, 파일, 문자열과 같은 입력소스로부터 문자데이터를 읽어오는데 도움을 줄 목적으로 추가.

Scanner s = new Scanner(System.in);
String input = s.nextLine();

-nextInt(), nextDouble() 등 입력값에 따라 메서드 달리 사용 가능.

2.5. java.util.StringTokenizer 클래스
-긴 문자열을 지정된 구분자(delimiter)를 기준으로 토큰이라는 여러 개의 문자열로 잘라내는 데 사용.
-문자열 잘라내는 세 가지 방법
● String[] result = “100,200,300”.split(“,”);
● Scanner sc2 = new Scanner(“100,200,300”).userDellimiter(“,”);
● StringTokernizer st = new StringTokernizer(“100,200,300”, “,”);
-위 두 가지 방법은 정규식 표현 써야한다.
-StringTokernizer의 경우 구분자로 단 하나의 문자밖에 사용할 수 없음
-split()의 경우 빈 문자열도 토큰으로 인식한다. 성능이 떨어진다.

2.6. java.util.BigInteger 클래스
-정수형으로 표현할 수 있는 값에는 한계가 있다.
-더 큰 값 표현하기 위해 BigInteger 사용
-부호와 int 배열 이용한 값으로 구성.
-2의 보수 형태로 표현한다.
-문자열로 숫자를 표현하는 것이 일반적
BigInteger val = new BigInteger(“123456778968567456”);
-모든 연산자와 쉽게 해주는 메서드들이 정의되어 있다.
-비트 단위 연산 메서드도 있음.

2.7. java.util.BigDecimal 클래스
-실수를 정수와 10의 제곱의 곱으로 표현한다.
-정수(BigInteger 사용), 지수, 정밀도(정수의 자릿수)로 표현
-문자열로 숫자를 표현하는 것이 일반적.

댓글 남기기