✔ Wrapper 클래스
기본 자료형의 값을 감싸는 래퍼 클래스
- 래퍼 클래스는 감싸는 클래스로, 감싸는 대상은 정수, 실수, 문자와 같은 기본 자료형의 값들임
- int형 정수나 double형 실수와 같은 기본 자료형의 값들을 인스턴스로 표현하여 이에 대한 참조 값이 필요한 경우에 사용
Integer iInst = new Integer(3);
- 모든 기본 자료형을 대상으로 래퍼 클래스가 정의되어 있음
- Boolean : public Boolean(boolean value)
- Character : public Character(char value)
- Byte : public Byte(byte value)
- Short : public Short(short value)
- Integer : public Integer(int value)
- Long : public Long(long value)
- Float : public Float(float value), public Float(double value)
- Double : public Double(double value)
래퍼 클래스의 두 가지 기능
- 값을 인스턴스로 감싸는 박싱 기능은 인스턴스의 생성을 통해 이루어짐
- 래퍼 인스턴스들은 담고 있는 값을 수정하지 못함
- 만약 값의 수정이 필요하면 새로운 래퍼 인스턴스를 생성해야 함
Integer iObj = new Integer(10);
iObj = new Integer(iObj.intValue() + 10);
- 인스턴스에서 값을 꺼내는 언박싱 기능은 래퍼 클래스에 정의된 메소드의 호출을 통해 이루어짐
- 각 래퍼 클래스별 언박싱 메소드의 이름이 정의되어 있음
- Boolean : public boolean booleanValue()
- Character : public char charValue()
- Integer : public int intValue()
- Long : public long longValue()
- Double : public double doubleValue()
int num1 = iObj.intValue();
오토 박싱과 오토 언박싱
- 자바 5부터 박싱과 언박싱이 필요한 상황에서 이를 자동으로 처리하기 시작함
- 오토 박싱과 오토 언박싱 덕분에 Integer형 참조변수를 int형 변수처럼 사용할 수 있게 됨
Integer iObj = 10;
int num1 = iObj;
Number 클래스와 래퍼 클래스의 static 메소드
- 모든 래퍼 클래스는 java.lang.Number 클래스를 상속하며 추상 메소드인 intValue(), longValue(), doubleValue()가 존재함
- 따라서 Number 클래스를 상속하는 Integer, Double과 같은 클래스들은 위 메소드를 모두 구현하고 있음
- 그렇기 때문에 어떠한 래퍼 인스턴스를 대상으로도 인스턴스에 저장된 값을 다양한 형태로 반환할 수 있음
Integer num1 = new Integer(29);
System.out.println(num1.intValue());
System.out.println(num1.doubleValue());
- 또한 래퍼 클래스에는 static으로 선언된 다양한 메소드들이 존재하며
해당 클래스의 성격에 필요한 클래스 메소드가 다양하게 정의되어 있음
- 인스턴스 생성 클래스 메소드 : valueOf()
- 대소 비교와 합을 계산하는 클래스 메소드 : max(), min(), sum()
- 정수에 대한 2진, 8진, 16진수 표현 결과를 반환하는 클래스 메소드 : toBinaryString(), toOctalString(), toHexString()
✔ BigInteger 클래스와 BigDecimal 클래스
매우 큰 정수의 표현을 위한 BigInteger 클래스
- int와 같은 정수 자료형은 표현할 수 있는 값의 크기에 한계가 있다는 문제점이 존재
- 정수 자료형 중에서 가장 표현 범위가 넓은 long형으로도 표현 불가능한 수를 표현해야 할 때 사용
- 문자열로 전달하여 BigInteger 인스턴스를 생성함
BigInteger big1 = new BigInteger("100000000000000000000");
- 아무리 큰 수를 표현해도 연산이 불가능하면 활용도가 낮아지므로 사칙연산을 포함하여 다양한 연산을 위한 메소드가 정의됨
- 덧셈 : public BigInteger add(BigInteger val)
- 뺄셈 : public BigInteger subtract(BigInteger val)
- 곱셈 : public BigInteger multiply(BigInteger val)
- 나눗셈의 몫 : public BigInteger divide(BigInteger val)
- 나눗셈의 나머지 : public BigInteger remainder(BigInteger val)
- 이 때 연산으로 인하여 그 값이 int형 또는 long형으로 표현이 가능한 수준에 이르면
인스턴스에 저장된 값을 int형 또는 long형으로 얻을 수 있음
- BigInteger 인스턴스에 저장된 값을 long형 정수로 반환 : public long longValueExact()
- BigInteger 인스턴스에 저장된 값을 int형 정수로 반환 : public int intValueExact()
오차 없는 실수의 표현을 위한 BigDecimal 클래스
- double과 같은 실수 자료형은 오차 없는 값의 표현이 불가능하다는 문제점이 존재
- 실수의 표현에 대해 오차가 존재하지 않도록 할 때 사용
- 문자열로 전달하여 BigDecimal 인스턴스를 생성함
BigDecimal d1 = new BigDecimal("1.6");
- BigInteger 클래스와 마찬가지로 사칙연산을 포함하여 다양한 연산을 위한 메소드가 정의되어 있음
- 덧셈 : public BigDecimal add(BigDecimal val)
- 뺄셈 : public BigDecimal subtract(BigDecimal val)
- 곱셈 : public BigDecimal multiply(BigDecimal val)
- 나눗셈의 몫 : public BigDecimal divide(BigDecimal val)
- 나눗셈의 나머지 : public BigDecimal remainder(BigDecimal val)
✔ Math 클래스와 난수의 생성, 그리고 문자열 토큰의 구분
수학 관련 다양한 연산의 제공을 위한 Math 클래스
- Math 클래스에 정의된 메소드는 인스턴스의 생성이 목적이 아닌, 기능의 제공이 목적이므로 모두 static으로 선언되어 있음
Math.PI
Math.sqrt()
Math.toDegrees()
Math.sin()
Math.cos()
Math.tan()
Math.log()
Math.pow()
난수의 생성
- 난수는 예측 불가능한 수를 의미
- java.util.Random 클래스의 인스턴스를 생성한 후, 목적에 따라서 메소드를 하나 선택하여 호출하면 난수가 반환됨
- boolean형 난수 : public boolean nextBoolean()
- int형 난수 : public int nextInt()
- 0 이상 bound 미만 범위의 int형 난수 : public int nextInt(int bound)
- 0.0 이상 1.0 미만의 float형 난수 : public float nextFloat()
- 0.0 이상 1.0 미만의 double형 난수 : public double nextDouble()
Random rand = new Random();
rand.nextInt();
씨드 기반의 난수 생성
- 컴퓨터는 알고리즘을 기반으로 일을 하므로 난수를 생성하는데에도 숨겨진 패턴이 존재하게 됨
- Random의 생성자에 전달된 씨드 값이 같으면 생성되는 난수의 패턴은 일치되어 몇 번을 실행해도 결과가 동일하게 반환됨
- 그래서 컴퓨터가 생성하는 가짜 난수라고 부름
Random rand = new Random(12);
- 그러므로 씨드 값을 컴퓨터의 현재 시간을 기준으로 사용하게 된다면 예측이 훨씬 어려워진 난수가 만들어지게 됨
- Random 인스턴스 생성 시 씨드 값을 전달하지 않으면 내부적으로 현재 시간을 기준으로 씨드 값을 만들어서,
씨드 값을 인자로 받는 다른 생성자를 호출하게 되어 실행할 때마다 다른 패턴의 난수가 만들어지게 됨
Random rand = new Random(System.currentTiemMillis());
Random rand = new Random();
문자열의 토큰 구분
- 특정 기준을 가지고 문자열을 작게 나누어야 할 때는 StringTokenizer 클래스를 사용
- 구분자를 기준으로 나뉜 문자열 조각을 뜻하는 토큰을 추출하기 위해서는
문자열과 구분자 정보를 전달하여 StringTokenizer 인스턴스를 생성하면 됨
- 만약 구분자가 둘 이상이라면 구분자를 모아서 하나의 문자열로 구성하면 됨
- 공백도 다른 문자와 동일하게 구분자로 둘 수 있음
public StringTokenizer(String str, String delim)
- StringTokenizer 인스턴스를 생성한 후에는 두 메소드의 반복적 호출을 통해서 토큰을 얻을 수 있음
- 반환할 토큰이 남아 있는가? : public boolean hasMoreTokens()
- 다음 토큰을 반환 : public String nextToken()
StringTokenizer st = new StringTokenizer("PM:08:45", ":");
while(st.hasMoreTokens())
System.out.println(st.nextToken() + ' ');
- 만약 구분자도 토큰으로 반환하고 싶다면 마지막 인자에 true를 넣어 StringTokenizer 인스턴스를 생성하면 됨
StringTokenizer st = new StringTokenizer("PM:08:45", ":", true);
✔ Arrays 클래스
배열의 복사
- java.util.Arrays 클래스는 배열 조작에 도움을 줄 수 있는 메소드들로 채워져 있음
- 배열 복사에 사용되는 Arrays 클래스의 메소드인 copyOf()
- 첫 번째 인자로 전달된 배열을 두 번째 인자로 전달된 길이만큼 복사하되 새로운 배열을 생성하여 복사함
그리고 이렇게 생성된 배열의 참조 값을 반환함
- 모든 기본 자료형 배열에 대해 이 메소드가 오버로딩 되어 있음
public static int[] copyOf(int[] original, int newLength)
- 배열의 일부만 복사하려면 Arryas 클래스의 메소드인 copyOfRange()를 사용
- 첫 번째 인자로 전달된 배열을 인덱스 from부터 to 이전 요소까지 복사하되 새로운 배열을 생성하여 복사함
public static int[] copyOf(int[] original, int from, int to)
- 배열을 새로 생성하지 않고 존재하는 배열에 복사를 하려는 경우에는 java.lang.System 클래스의 arraycopy()를 사용
public static void arraycopy(Object src, int srcPos, Object dest, int destPost, int length)
배열의 비교
- 배열의 내용 비교에 사용되는 Arrays 클래스의 메소드인 equals()
- 두 배열에 저장된 데이터의 수, 순서, 그리고 내용이 같을 때 true를 반환
- 모든 기본 자료형 배열에 대해 이 메소드가 오버로딩 되어 있음
- 또한 Object형 배열에 대해서도 오버로딩 되어 있지만 참조 값을 비교하므로
참조하는 인스턴스의 내용을 비교하고 싶다면 목적에 맞게 오버라이딩해야 함
public static boolean equals(int[] a, int[] a2)
public static boolean equals(Object[] a, Object[] a2)
배열의 정렬
- 배열의 정렬에 사용되는 Arrays 클래스의 메소드인 sort()
- 배열에 저장된 데이터를 오름차순으로 정렬함
- 모든 기본 자료형 배열에 대해 이 메소드가 오버로딩 되어 있음
- 또한 Object형 배열에 대해서도 오버로딩 되어 있으며 참조 값을 저장하고 있는 배열에 대한 정렬을 진행하며
인스턴스의 순서를 판단하기 위해서는 Comparable 인터페이스 구현을 기반으로 프로그래머가 클래스 별로 결정하게 됨
public static void sort(int[] a)
public static void sort(Object[] a)
interface Comparable {
int compareTo(Object o);
// 인자로 전달된 o가 작다면 양의 정수 반환
// 인자로 전달된 o가 크다면 음의 정수 반환
// 인자로 전달된 o아 같다면 0을 반환
}
배열의 탐색
- 배열의 탐색에 사용되는 Arrays 클래스의 메소드인 binarySearch()
- 첫 번째 인자로 전달된 배열에서 두 번째 인자로 전달된 원소를 찾아서 있으면 인덱스 값, 없으면 0보다 작은 수를 반환함
- Arrays 클래스의 binarySearch 메소드는 이진 탐색 알고리즘을 기반으로 탐색을 진행하며
이는 정렬된 상태의 데이터를 대상으로 하는 탐색 알고리즘이므로 배열이 정렬된 상태가 아니라면 정렬을 먼저 해야 함
- 모든 기본 자료형 배열에 대해 이 메소드가 오버로딩 되어 있음
- 또한 Object형 배열에 대해서도 오버로딩 되어 있으며 물론 이 때도 배열이 정렬된 상태이어야 하며
Comparable 인터페이스의 compareTo 메소드를 기준으로 0이 반환되면 동일한 인스턴스를 찾았다고 판단하므로
Comparable 인터페이스 구현이 되어야만 함
public static void binarySearch(int[] a, int key)
public static void binarySearch(Object[] a, Obejct key)
interface Comparable {
int compareTo(Object o);
// 인자로 전달된 o가 작다면 양의 정수 반환
// 인자로 전달된 o가 크다면 음의 정수 반환
// 인자로 전달된 o아 같다면 0을 반환
}