Chapter 20에서 처음으로 알아볼 것은 Wrapper 클래스 이다. 

1. 기능에 포커스를 맞춰봐야 하는데, Boxing 과 Unboxing 이다. 

 

Boxing은 일종에 인스턴스를 생성할때 그리고 값을 변수에 넣을때의 과정이라 이해하면 좋고,

Unboxing은 인스턴스에서 생성한 값을 꺼내오거나 변수에 저장된 값을 다른 변수에 저장하는 과정으로 보면 될것 이다.

 

 

1
2
3
4
Integer iObjj = new Integer(10); //Boxing
int nnum1 = iObjj.intValue(); //Unboxing 
 
//출력값 10 
cs

 

여기서 , AutoBoxing 과 Autounboxing 이라는것 이 있는데

쉽게 얘기해서 인스턴스를 생성하지 않고 변수에 값을 넣듯이 Boxing 과 Unboxing을 진행하는것이다.

1
2
3
4
Integer iObjj = 10;
int nnum1 = iObjj;
 
//출력값 10 
cs
 

2. Wrapper 클래스는 java.lang.Number를 상속한다. 

따라서, Number 에서 가지고 있는 메소드를 자유롭게 사용한다고 생각하면 될듯 하다. 

관련된 메소드는 관련 문서를 찾아보자.

www.geeksforgeeks.org/java-lang-number-class-java/

 

syntax에는 총 5가지가 있는데 다음과 같다.

 

byte byteValue() short shortValue() int intValue() long longValue() float floatValue() double doubleValue() (출처 : https://www.geeksforgeeks.org)

 

Boxing한 값들을 자료형에 맞게 위 syntax를 이용해서 Unboxing 할 수 있다. 

 

(* 클래스 메소드를 통한 인스턴스 생성 방법으로 Integer.valueOf(숫자) 를 통해서 생성할 수 있다는 점도 있으니 참고하면 좋을 듯 하다.)

 

3. BigInteger 클래스 와 BidDecimal 클래스 

제목 그대로 엄청나게 큰 수 를 표현하는데 좋다. 

 

1
2
BidInteger bigg1 = new BigInteger("100000000000000000000000000");
BidInteger bigg2 = new BigInteger("-99999999999999999999999999");
csd

 

일반적인 자료형 으로는 절대로 표현하기 어려운 수인것은 확실하다. 단 문자열로 처리해준다.

 

사칙연산을 도와 주기 위한 메소드 문서를 가지고 왔다.

docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html

 

이와 유사한 클래스로 오차없이 실수를 표현해 주는 BidDecimal 클래스가 있다. 

docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html

 

관련 메소드를 보고 이해해보면 좋을 듯 하다. 

이것도 마찬가지로 문자열로 처리해줘야 오차가 발생하지 않는다. 

이것도 마찬가지로 앞서, 사칙연산을 제공해주는 메소드가 여럿 있는데 문서를 보는것이 좋을 듯 하다. 

1
2
BigDecimal dd1 = new BigDecimal("1.7");
BigDecimal dd2 = new BigDecimal("0.2");
cs

 

4.  난수를 발생해보자.

난수는 random, srand(time(NULL)) 이라든가 C, C++에서 흔히 사용했던것으로 봤는데 자바에서는 클래스로 제공되나 보다.  호엥!

 

이는 Math 클래스에 있다.

docs.oracle.com/javase/8/docs/api/java/lang/Math.html

 

1
2
System.out.println("원주율은? " + Math.PI);
double radian46 = Math.toRadians(46);
cs

 

* 라디안

ko.wikipedia.org/wiki/%EB%9D%BC%EB%94%94%EC%95%88 

 

라디안은 360(도) = 2*pi*쎄타 가 중요한 사실이다.

 

1
Random rand = new Random()
cs


d

난수 클래스를 생성한다. 자료형 별로 난수를 반환하는 메소드가 전부 다 다른데 문서를 참고하면 될 듯 하다.

docs.oracle.com/javase/8/docs/api/java/util/Random.html

 

nextOOO 이 난수를 반환 해주는 것으로 이해하면 될듯 하다.

1
rand.nextInt(2000); //0이상 2000미만 난수 
cs

 

하지만, 난수에 패턴을 줘서 난수를 생성할때마다 값을 다르게 하고 싶다면 이 방법만으로는 충분하지 않다. 따라서, 

1
Random raand = new Random(System.currentTimeMillis());
cs

 

책에 있는 문항중에 관련된 문제를 풀어보았다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package test;
 
import java.util.Random;
import java.util.Scanner;
 
public class p20_1 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //사용자로부터 임의의 정수 A와 Z를 입력받는다. 
        //A와 Z를 포함하여 그 사이에 있는 난수 10개를 생성하여 출력
        Scanner input = new Scanner(System.in);
        int first = input.nextInt();
        int second = input.nextInt();
        
        int min = first < second ? first : second;
        int max = first > second ? first : second;
        
        Random rrand = new Random();
        int rrandd;
        for(int i=0; i<10; i++) {
            rrandd = min;
            //min부터
            rrandd += rrand.nextInt(max-min+1);
            System.out.println(rrandd);
        }
    }
 
}
 
cs

 

그 다음으로 중요하게 볼것이 문자열의 토큰(Token) 구분이다. 

사실, 알고리즘에서도 흔하게 사용하는 클래스 이므로 신중히 볼 필요가 있다. 

 

Token = 구분자 라고 생각하면 된다. 

우리는.대한민국.공대생.이다.

라고할때 . 을 기준으로 구분하면 우리는 대한민국 공대생 이다 라는 것으로 나눠볼 수 있다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package test;
 
import java.util.StringTokenizer;
 
public class TokenizeString {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        StringTokenizer str = new StringTokenizer("우리는.대한민국.공대생.입니다."".");
        
        while(str.hasMoreTokens())
            System.out.println(str.nextToken() + " ");
    
    }
 
}
 
//출력결과
//우리는
//대한민국
//공대생
//
cs

특히, StringTokenizer str = new StringTokenisze("우리는.대한민국.공대생.입니다.", ".", true);

이렇게 되면 . 도 반환한다.

우리는

.

대한민국

.

공대생

.

입니다

.

이런식으로 출력됩니다. 

 

만약에 공백 문자가 포함되어 있으면 공백문자도 구분자에 포함시켜야 한다.

 

5. Arrays 클래스

이 Chapter에서 가장 중요하다고 생각되는 부분이다. 

 

가장 첫번째로 볼것이 배열의 복사이다. 

 

copyOf 메소드를 통해서 복사한다. 

 

docs.oracle.com/javase/7/docs/api/java/util/Arrays.html

 

문서를 보니 첫번째 인자는 배열, 그리고 두번째 인자는 길이 인듯 하다. 

1
2
double [] a = ;
double [] arA = Arrays.copyOf(a, a.length); //a에 존재하는 배열을 arA에  
cs

 

일정 부분을 복사하려면, copyOfRange 를 사용하면된다. 

단, 끝 부분은 index의 마지막 부분으로 이전까지 들어가는것을 알아야 한다. 

1
2
3
double[] a = ;
double[] a2 = Arrays.copyOfRange(a, 1, 3);
//1부터 2까지 들어간다. 
cs

 

 

arraycopy 라는 함수도 있는데 

www.geeksforgeeks.org/system-arraycopy-in-java/

참고하면 좋을듯 하다. 

 

1
System.arraycopy(a, 0, a_copy, 1, 3);
cs

a 배열의 0번째 index 부터 3개를 a_copy 에 1번째 index로 3개를 복사하란 의미가 된다. 

 

6. 배열의 비교 

비교를 할때는 주로 equals 를 사용한다. 하지만, 서로 같은 값이라고 하여도 

인스턴스를 각각 생성하면 다르게 나올 수 밖에 없다.

따라서 ! 오버라이딩 해줘야 한다. 

 

1
2
3
4
5
6
7
public boolean equals(Object objj){
 
    if(this.variable == ((Class이름)objj).variable)
        return true;
    else
        return false;
}
cs

 

보통 인스턴스를 만들어주고 비교할때 objj로 들어올텐데 이때 생성된 인스턴스를 같은 Class의 네임으로 명시적 형변환을 이루어야 

서로 같음을 확인하고 true를 반환할 수 있게 된다. 

 

(*참고로 equals 는 내장된 메소드로 오버라이딩 할때는 class안에 새로 선언해야 한다.)

 

7. 정렬

sort 를 통해서 오름차순 정렬을 할 수가 있다. 

sort를 변경하고 싶으면 interface Comparable에 구현된 int compareTo(Object oo) 메소드를 통해서 순서를 정한다.

인자를 기준으로 생각하건데 

 

작으면 -> +

크면 -> -

같으면 -> 0 

이다. 

(그렇지만, 사실상 비교하는것보다 빼주는것이 가독성을 읽히는데 더 편리할 것으로 생각된다.)

 

1
2
3
4
5
6
7
8
9
10
11
12
public int compareTo(Object b){
    p20_2 p =(p20_2)b;
    if(this.age < b.age)
        return 1;
    else if(this.age > b.age)
        return -1;
    else 
        return 0;
}
//age를 비교해서 내름차순을 만들기 ㅣ한 compareTo 메소드 오버라이드.
 
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
public int compareTo(Object b){
    p20_2 p =(p20_2)b;
    if(this.name.length() > b.name.length())
        return 1;
    else if(this.name.length() < b.name.length())
        return -1;
    else 
        return 0;
}
//name를 비교해서 길이만큼 오름차순을 만들기 위한 compareTo 메소드 오버라이드.
 
 
cs

 

 

8. 탐색

탐색 전에는 반드시 정렬을 해야한다. 

binarySearch 메소드를 통해서 원하는 index에 값을 찾는다. 

docs.oracle.com/javase/7/docs/api/java/util/Arrays.html

 

Arrays.binarySearch(배열이름, 찾고자하는 값의 index) 를 넣어주면 찾을 수 있다. 

이것도 마찬가지로 CompareTo를 통해서 값을 찾는 기준을 만들 수 있다.  다만, 0이 되어야만 "찾았다" 라는것을 확인할 수 있기 때문에 return 시 이 부분을 주의 하면 될듯하다.

 

이 부분에 대한 문제가 있는데 풀다가 디버깅이 안되서.. 

다음 포스팅때 같이 첨부해봐야 겠다.

'Java' 카테고리의 다른 글

Java06 :: [윤열프]실행 흐름의 컨트롤  (0) 2019.03.01
Java05 :: [윤열프] Operators  (0) 2019.02.28
Java04 :: [윤열프]제네릭1-2  (0) 2019.02.28
Java03 :: [윤열프]제네릭1  (0) 2019.02.25
Java01 :: [윤열프]Java Chapter1~3  (0) 2019.02.21