[ CH06-1. java.lang 패키지 ]
0. 주요 패키지
- java.lang : 스트링, 수학 함수, 입출력 등 자바 프로그래밍에 필요한 기본적인 클래스와 인터페이스
- java.util : 날짜, 시간, 벡터, 해시맵 등과 같은 다양한 유틸리티 클래스와 인터페이스
- java.io : 키보드, 모니터, 프린터, 디스크 등에 입출력을 할 수 있는 클래스와 인터페이스
- java.awt : 자바 GUI 프로그래밍을 위한 클래스와 인터페이스
- javax.swing : 자바 GUI 프로그래밍을 위한 스윙 패키지
1. Object 클래스
1.1 Object클래스의 메서드
- 모든 클래스의 최고 조상이며, 오직 11개의 메서드를 가짐
- notify(), wait()등은 쓰레드 관련 메서드
- equals(), hashCode(), toString()은 적절한 오버라이딩 필요
1.2 equals(Object obj)
- 객체 자신과 주어진 객체(obj) 내용 비교 ( 같으면 true, 다르면 false )
- 오버라이딩해서 인스턴스 변수의 값을 비교하도록 변경 가능
- boolean equals(Object obj) VS == 연산자
- equals() : 객체 내용이 같은지 비교
- == 연산자 : 주소 값 비교
1.3 hashCode()
- 객체의 해시 코드(int 타입의 정수)를 반환(해시함수)
- 다량의 데이터를 저장하고 검색하는 해싱 기법에 사용
- 객체의 내부 주소 반환
- 실제 주소 값 X -> JVM이 해시함수를 통해 고유번호로 반환 - equals()를 오버 라이딩하면, hashCode()도 같이 오버 라이딩해야 함
- equals()가 true -> hash code값은 같아야 함
- System.identityHashCode(Object obj)는 Object클래스의 hashCode()와 동일한 결과 반환
1.4 toString()
- 객체의 정보를 문자열로 제공
1.5 clone()
- 객체 자신을 복제해서 새로운 객체를 생성
- Cloneable인터페이스를 구현한 클래스의 인스턴스만 복제
- Object클래스에 정의된 clone()은 인스턴스 변수의 값만을 복제(얕은 복사)
- 인스턴스 변수가 참조형일 때, 참조하는 객체도 복제되게 오버라이딩해야 함(깊은 복사)
import java.util.*;
class Circle implements Cloneable {
Point2 p; // 원점
double r; // 반지름
Circle(Point2 p, double r) {
this.p = p;
this.r = r;
}
public Circle shallowCopy() { // 얕은 복사
Object obj = null;
try {
obj = super.clone();
} catch (CloneNotSupportedException e) {}
return (Circle)obj;
}
public Circle deepCopy() { // 깊은 복사
Object obj = null;
try {
obj = super.clone();
} catch (CloneNotSupportedException e) {}
Circle c = (Circle)obj;
c.p = new Point2(this.p.x, this.p.y);
return c;
}
public String toString() {
return "[p=" + p + ", r="+ r +"]";
}
}
class Point2 {
int x;
int y;
Point2(int x, int y) {
this.x = x;
this.y = y;
}
public String toString() {
return "("+x +", "+y+")";
}
}
class ShallowCopy {
public static void main(String[] args) {
Circle c1 = new Circle(new Point2(1, 1), 2.0);
Circle c2 = c1.shallowCopy();
Circle c3 = c1.deepCopy();
System.out.println("c1="+c1);
System.out.println("c2="+c2);
System.out.println("c3="+c3);
c1.p.x = 9;
c1.p.y = 9;
System.out.println("= c1의 변경 후 =");
System.out.println("c1="+c1);
System.out.println("c2="+c2);
System.out.println("c3="+c3);
}
}
1.6 getClass()
- 자신이 속한 클래스의 Class객체 반환
- 클래스당 1개만 존재하며, 클래스 파일(*. class)이 메모리에 로드될 때 생성
- Class 객체를 얻는 방법
// 1
Card c = new Card();
Class cObj = c.getClass();
// 2
Class cObj = Card.class;
String className = cObj.getName();
// 3
Class cObj = Class.forName(“Card”);
// 4
Card c2 = new Card();
Card c2 = (Card)cObj.newInstance();
// 5
String className = Card.class.getName();
2. String 클래스
2.1 String 클래스의 객체 생성
- 리터럴로 생성
- JVM이 리터럴 관리, 응용프로그램 내에서 공유 - String 객체로 생성
- 힙 메모리에 String 객체 생성
// 스트링 리터럴로 스트링 객체 생성
String str1 = "abcd";
// String 클래스의 생성자를 이용하여 스트링 생성
char data[] = {'a', 'b', 'c', 'd'};
String str2 = new String(data); // "abcd"
String str3 = new String("abcd"); // str2와 str3은 모두 "abcd" 스트링
2.2 String 클래스의 특징
- 문자형 배열(char [])과 관련된 메서드들 정의
- String 인스턴스의 내용 변경 X
- 기존의 것에 추가되는 것이 아니라, 새로운 것으로 대입
- String str = "abc"; VS String str = new String("abc");
- 문자열은 이미 상수 풀에 존재하면 기존의 것을 가져다 쓰므로, str1와 str2는 같은 주소 값을 가짐
- new String()을 통해 문자열을 생성할 때는, 서로 다른 객체이므로 str3과 str4는 다른 주소 값을 가짐
2.3 문자열 비교
- int compareTo(String anotherString)
- 같으면 0, anotherString 보다 사전에 먼저 나오면 음수, anotherString 보다 사전에 나중에 나오면 양수 리턴 - == 는 문자열 비교에 사용 X
String java= "Java";
String cpp = "C++";
int res = java.compareTo(cpp);
if(res == 0) System.out.println("the same");
else if(res <0) System.out.println(java + " < " + cpp);
else System.out.println(java + " > " + cpp);
// [ 출력 ] Java > C++
2.4 문자열 연결
- +연산자로 문자열 연결
- 피연산자에 문자열이나 객체 포함
⇒ 객체는 객체.toString() 호출하여 문자열로 변환하여 연결, 기본타입 값은 문자열로 변환
System.out.print("abcd" + 1 + true + 3.13e-2 + 'E'+ "fgh" );
// abcd1true0.0313Efgh 출력
- String concat(String str)를 통한 문자열 연결
- 기존 String 객체에 연결 X → 새로운 스트링 객체 리턴
2.5 빈 문자열("", empty string)
- 내용이 없는 문자열, 크기가 0인 char형 배열을 저장하는 문자열
- String str=""; 은 가능해도, char c = '';는 불가능
- String은 참조형의 기본값인 null 말고 빈 문자열로 초기화
char은 기본값인 '\u0000'보다 공백으로 초기화
2.6 String 클래스의 생성자와 메서드
- join()과 StringJoiner
- join() : 여러 문자열 사이에 구분자를 넣어 결합 ↔ split()
- java.util.StringJoiner 클래스 : 문자열 결합
// join()
String animals = "dog.cat.bear";
String[] arr = animals.split(","); // 문자열을 ','를 구분자로 나눠 배열에 저장
String str = String.join("-", str); // 배열의 문자열을 '-'로 구분하여 결합
System.out.println(str); // dog-cat-bear
// StringJoiner 클래스
StringJoiner sj = new StringJoiner(",", "[", "]");
String[] strArr = {"aaa", "bbb", "ccc"};
for(String s : strArr)
sj.add(s.toUpperCase());
System.out.println(sj.toString()); // [AAA, BBB, CCC]
- 문자 인코딩 변환
- getBytes : 문자열의 문자 인코딩을 다른 인코딩으로 변경(자바는 기본적으로 UTF-16)
- 한글 윈도우즈 문자 인코딩 : CP949
byte[] utf8_str = "가".getBytes("UTF-8"); // 문자열을 UTF-8로 변환 // EA:B0:80
String str = new String(utf8_str, "UTF-8"); // byte배열을 문자열로 변환 // 가
- String.format()
- format() : 형식화된 문자열을 만들어내는 방법, printf() 문과 사용법 같음
String str = String.format("%d 더하기 %d는 %d입니다.", 3, 5, 3+5);
System.out.println(str); // 3 더하기 5는 8입니다.
2.4 문자열과 기본형 간의 변환
- 기본형 값을 문자열로 바꾸는 방법 (기본형 값 -> 문자열)
// 100을 "100"으로 변환
int i = 100;
String str1 = i + ""; // 방법 1
String str2 = String.valueOf(i); // 방법 2
- 문자열을 기본형 값으로 변환하는 방법 (문자열 -> 기본형 값)
// "100"을 100으로 변환하는 방법
int i = Integer.parseInt("100"); // 방법 1
int i2 = Integer.valueOf("100"); // 방법 2
// 문자열 "A"를 문자 'A'로 변환하는 방법
char c = "A".charAt(0);
- 정리
3. StringBuffer 클래스와 StringBuilder 클래스
3.1 StringBuffer 클래스의 특징
- String 클래스처럼 문자열 배열(char [])을 내부적으로 가짐
public final class StringBuffer implements java.io.Serializable {
private char[] value;
...
}
- String 클래스와 달리 내용 변경 O
- append()는 새로운 문자열이 추가한 후 자신의 주소를 반환
StringBuffer sb = new StringBuffer("abc");
ab.append("123");
- StringBuffer 객체의 크기는 스트링 길이에 따라 가변적
- 인스턴스 생성 시, 버퍼(배열)의 크기 지정 가능 ⇒ StringBuffer(int length) 사용
- 충분히 여유 있는 크기로 지정
- 버퍼가 작으면 성능 저하 -> 작업 중 더 큰 배열 생성 필요
- 크기 지정 x ⇒ 16개 문자 저장 크기 버퍼 생성
public StringBuffer(int length){
value = new char[length];
shared = false;
}
public StringBuffer(String str){
this(str.length() + 16);
append(str);
}
- String 클래스와 달리 equals()를 오버라이딩 X
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb == sb2); // false
System.out.println(sb.equals(sb2)); // false
// StringBuffer 내용을 String으로 변환
String s = sb.toString();
String s2 = sb2.toString();
System.out.println(s.equals(s2)); // true
3.2 StringBuffer 클래스의 생성자와 메서드
3.3 StringBuilder
- StringBuffer에서 쓰레드의 동기화만 뺀 것, 성능 향상
( ↔ StringBuffer : 멀티쓰레드에 안전하도록 동기화, 성능 저하 )
// StringBuilder 객체 선언, 문자열 추가
StringBuilder sb = new StringBuilder();
sb.append("abc");
4. Math & wrapper 클래스
4.1 Math 클래스
- 수학 계산에 유용
- 모두 static 메서드
4.2 wrapper 클래스
- 기본형을 객체로 만드는 클래스
- 기본형 값을 객체로 다뤄야 할 때 있음
- 매개변수로 객체 요구, 객체로 저장 요구. 객체 간의 비교
- 내부적으로 기본형(primitive type) 변수를 가지고 있음
public final class Integer extends Number implements Comparable {
...
private int value;
}
- 값을 비교하도록 equals() 오버라이딩 되어 있음
Integer i = new Integer(100);
Integer i2 = new Integer(100);
System.out.println(i==i2); // false
System.out.println(i.equals(i2)); // true
4.3 Number 클래스
- 개념
- 숫자를 멤버 변수로 갖는 클래스의 조상 (추상 클래스)
- BigInteger : long으로 다룰 수 없는 큰 범위의 정수 처리
BigDecimal : double로 다룰 수 없는 큰 범위의 부동 소수점 수 처리
- 문자열 → 숫자 변환
문자열 → 기본형 | 문자열 → Wrapper 클래스 |
byte b = Byte.parseByte("100"); | Byte b = Byte.valueOf("100"); |
short s = Short.parseShort("100"); | Short s = Short.valueOf("100"); |
int i = Integer.parseInt("100"); | Integer i = Integer.valueOf("100"); |
long l = Long.parseLong("100"); | Long l = Long.valueOf("100"); |
float f = Float.parseFloat("3.14"); | Float f = Float.valueOf("3.14"); |
double b = Double.parseDouble("3.14"); | Double d = Double.valueOf("3.14"); |
- 진법 변환
- Integer.parseInt(문자열, 진법) : 해당 문자열을 해당 진법의 정수로 변환 - 오토 박싱 & 언박싱(autoboxing & unboxing)
⇒ 기본형과 참조형 간의 자동 형 변환
- 오토 박싱 : 컴파일러가 자동으로 기본형 값 → Wrapper 클래스의 객체로 자동 변환
- 언박싱 : Wrapper 클래스의 객체 → 기본형 값 변환
// 컴파일 전 : 기본형 → 참조형 형변환(형변환 생략가능)
Integer intg = (Integer)i;
Object obj = (Object)i ;
Long lng = 100L;
// 컴파일 후(오토박싱)
Integer intg = Integer.valueOf(i);
Object obj = (Object)Integer.valueOf(i);
Long lng = new Long(100L);
[ CH06-2. 유용한 클래스 ]
2.1 java.util.Objects 클래스
- 개념
- Object 클래스의 보조 클래스, 모든 메서드가 static - 메서드 종류
메소드 | 설명 |
isNull(Object obj) | 객체가 널인지 확인(true/false) ↔ nonNull() |
requireNonNull(Object obj, (String message)) | 해당 객체가 널이 아니어야 하는 경우 사용 널 인경우 두번째 매개변수의 해당 메시지의 오류발생 |
compare(Object obj1, Object obj2) | 대소비교 (같으면 0, 크면 양수, 작으면 음수) |
Objects.equals(Object a, Object b) | 두 객체 비교, null 검사 필요 없음, 둘다 널이면 true |
Objects.deepEquals(Object a, Object b) | 다차원 배열 비교 |
toString(Object obj, (String nullDefault)) | object클래스의 toString()에 null 검사 추가 널 일때 두번째 매개변수로 대신 사용할 값 지정 |
hashCode(Object obj) | 내부적으로 널 검사 후, Object 클래스의 hashCode() 호출, 널 일때 0 반환 |
2.2 java.util.Random 클래스
- 난수를 얻는 클래스
- Math.random()과 차이점
- 종자값(seed) 설정 : 같은 종자값 넣으면 같은 난수, 종자값 없을때는 현재시간을 종자값으로 이용 - Random 클래스의 생성자와 메서드
import java.util.Random;
public class RandomClass {
public static void main(String[] args) {
Random r1 = new Random();
Random r2 = new Random(10);
for (int i = 0; i < 5; i++) {
System.out.println("r1: " + r1.nextInt() + ", r2: " + r2.nextInt());
}
}
}
// [ 출력 ] => r1은 계속 변함, r2는 실행마다 같은 값 도출
r1: 1924105415, r2: -1157793070
r1: 988662568, r2: 1913984760
r1: 545247781, r2: 1107254586
r1: -2104875019, r2: 1773446580
r1: -572751766, r2: 254270492
2.3 StringTokenizer 클래스
- 개념
- String 객체의 문자열을 특정한 구분 문자로 여러 개의 토큰 문자열로 나눠줌
- 구분 문자 : 특수문자, 공백(space), 한 문자, 여러 문자의 문자열
- 나눠진 문자열은 열거형태 - 생성자 및 메서드
- 예제
import java.util.StringTokenizer;
public class StringTokenizerClass {
public static void main(String[] args) {
String str = "java,c,c++,c#,scala,xml,javascript";
StringTokenizer st = new StringTokenizer(str, ",");
while (st.hasMoreTokens()) {
String lang = st.nextToken();
System.out.println(lang);
}
}
}
// [ 출력 ]
java
c
c++
c#
scala
xml
javascript
2.4 Calendar 클래스
- 특징
- 시간과 날짜 정보 저장 관리
- 년, 월, 일, 요일, 시간, 분, 초, 밀리초, 오전, 오후 등
- Calendar 객체 생성
- Calendar now = Calendar.getInstance();
- Calendar은 추상 클래스 → new Calendar() 하지 않음(new로 객체 생성 X)
- now 객체 → 현재 날짜와 시간 정보로 생성 - 날짜와 시간 알아내기
int year = now.get(Calendar.YEAR); // now에 저장된 년도
int month = now.get(Calendar.MONTH); // now에 저장된 달
- 날짜와 시간 설정
- Calendar 객체에 저장
Calendar date = Calendar.getInstance();
date.clear(); // 현재 날짜와 시간 정보를 모두 지우기
date.set(2016, 11, 25); // 2016년 12월 25일 // 12월은 11
date.set(Calendar.HOUR OF DAY, 20); // 저녁 8시로 설정
date.set(Calendar.MINUTE, 30); // 30분으로 설정
- 예제
import java.util.Calendar;
public class CalendarEx {
public static void printCalendar(String msg, Calendar cal) {
int year = cal.get(Calendar.YEAR);
// get()은 0~30까지의 정수 리턴.
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
int hour = cal.get(Calendar.HOUR);
int hourOfDay = cal.get(Calendar.HOUR_OF_DAY);
int ampm = cal.get(Calendar.AM_PM);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
int millisecond = cal.get(Calendar.MILLISECOND);
System.out.print(msg + year + "/" + month + "/" + day + "/");
switch(dayOfWeek) {
case Calendar.SUNDAY : System.out.print("일요일"); break;
case Calendar.MONDAY : System.out.print("월요일"); break;
case Calendar.TUESDAY : System.out.print("화요일"); break;
case Calendar.WEDNESDAY : System.out.print("수요일"); break;
case Calendar.THURSDAY : System.out.print("목요일"); break;
case Calendar.FRIDAY: System.out.print("금요일"); break;
case Calendar.SATURDAY : System.out.print("토요일"); break;
}
System.out.print("(" + hourOfDay + "시)");
if(ampm == Calendar.AM) System.out.print("오전");
else System.out.print("오후");
System.out.println(hour + "시 " + minute + "분 " + second + "초 "
+ millisecond +"밀리초");
}
public static void main(String[] args) {
Calendar now = Calendar.getInstance();
printCalendar("현재 ", now);
Calendar firstDate = Calendar.getInstance();
firstDate.clear();
// 2016년 12월 25일. 12월을 표현하기 위해 month에 11로 설정
firstDate.set(2016, 11, 25);
firstDate.set(Calendar.HOUR_OF_DAY, 20); // 저녁 8시
firstDate.set(Calendar.MINUTE, 30); // 30분
printCalendar("처음 데이트한 날은 ", firstDate);
}
}
// [ 출력 ]
현재 2021/5/17/월요일(23시)오후11시 46분 28초 473밀리초
처음 데이트한 날은 2016/12/25/일요일(20시)오후8시 30분 0초 0밀리초
2.5 java.util.regex 클래스
[ 참조 ]
1. Java의 정석 3판 (지은이 : 남궁성)
2. 명품 JAVA Programming 개정 3판 (지은이 : 황기태, 김효수)
'JAVA' 카테고리의 다른 글
Optional 클래스 (0) | 2021.08.04 |
---|---|
CH07. 제네릭, 열거형, 컬렉션 (0) | 2021.08.04 |
[Tip] static 메서드의 오버라이딩 불가 (0) | 2021.05.07 |
CH05. 상속, 오버라이딩, package, 제어자, 다형성, 추상클래스, 인터페이스 (0) | 2021.05.03 |
CH04. 객체지향, 클래스와 객체, 변수와 메서드, 오버로딩, 생성자, this레퍼런스, 변수 초기화 (0) | 2021.04.29 |
댓글