본문 바로가기
JAVA

CH06. java.lang 패키지와 유용한 클래스

by MINNI_ 2021. 5. 10.

[ 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판 (지은이 : 황기태, 김효수)

댓글