Java02 :: [윤열프]자바의 기본 클래스
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 |
댓글
이 글 공유하기
다른 글
-
Java05 :: [윤열프] Operators
Java05 :: [윤열프] Operators
2019.02.28 -
Java04 :: [윤열프]제네릭1-2
Java04 :: [윤열프]제네릭1-2
2019.02.28 -
Java03 :: [윤열프]제네릭1
Java03 :: [윤열프]제네릭1
2019.02.25 -
Java01 :: [윤열프]Java Chapter1~3
Java01 :: [윤열프]Java Chapter1~3
2019.02.21