12. java.base 모듈
12.6 포장클래스
자바는 기본타입(byte char short int long float double boolean)의 값을 갖는 객체를 생성할수있다.
이런 객체를 포장객체라고 한다. 값을 포장하고 있다고 해서 붙여진 이름이다.
포장객체를 생성하기 위한 클래스는 java.lang 패키지에 포함되어 있다.
char -> Character / int -> Integer 제외하고 기본타입의 첫 문자를 대문자로 바꾼 이름을 가지고 있다.
포장객체는 포장하고 있는 기본타입의 값을 변경할 수 없고 단지 객체로 생성하는데 목적이있다.
이런 객체가 필요한 이유는 컬렉션 객체 때문에다. 15장에서 학습할예정인 컬렉션 객체는 기본타입의 값은 저장할 수없고 객체만 저장가능하다.
12.6.1 박싱과 언박싱
기본타입 값을 포장객체로 만드는 과정을 박싱이라고 하고 반대로 포장객체에서 기본타입의 값을 얻어내는 과정을 언박싱이라고 한다.
Integer obj = 100; // 박싱
int value = obj; // 언박싱
언박싱은 다음과 같이 연산 과정에서도 발생한다. obj는 50과 연산되기 전에 언박싱된다.
int value = obj + 50;
package ch12.sec06;
public class BoxingUnBoxingExample {
public static void main(String[] args) {
//Boxing
Integer obj = 100;
System.out.println("value: " + obj.intValue()); // intValue()메소드는 Integer객체 내부의 int값을 리턴한다.
//Unboxing
int value = obj;
System.out.println("value: " + value);
//연산시 Unboxing
int result = obj + 100;
System.out.println("result: " + result);
}
} 
12.6.2 문자열을 기본타입값으로 변환
포장클래스는 문자열을 기본타입값으로 변환할때도 사용된다.
대부분의 포장 클래스에는 parse+기본타입 명으로 되어있는 정적 메소드가잇다.
이 메소드는 문자열을 해당 기본타입으로 변환한다.(2장10챕터 참조)
포장값비교
포장객체는 내부 값을 비교하기 위해 ==와 !=연산자를 사용할 수 없다. 이 연산은 내부값을 비교하는 것이아니라 포장객체의 번지를 비교하기때문이다.
예외도 있다. 포장객체의 효율적 사용을 위해 다음 범위의 값을 갖는 포장객체는 공유된다. 이 범위의 값을 갖는 포장객체는 ==와 !=연산자로 비교할 수잇지만
내부값을 비교하는 것이 아니라 객체 번지를 비교한다는 것을 알아야하나.
boolean 값의 범위 true false
char 값의범위 \u0000 ~ \u0071
byte short int 값의범위 -128~127
포장객체에 정확히 어떤값이 저장될지 모르는 상황이라면 == 와 !-는 사용하지 않는 것이 좋다.
대신 equals()메소드로 내부값을 비교할 수 있다. 포장클래스의 equals()메소드는 내부 값을 비교하도록 재정의 되어잇다.
package ch12.sec06;
public class ValueCompareExample {
public static void main(String[] args) {
// -128~127초과값일경우
Integer obj1 = 300;
Integer obj2 = 300;
System.out.println("==: " + (obj1 == obj2) );
System.out.println("equals(): " + obj1.equals(obj2));
System.out.println();
// -128~127 범위값일 경우
Integer obj3 = 10;
Integer obj4 = 10;
System.out.println("==: " + (obj3 == obj4) );
System.out.println("equals(): " + obj3.equals(obj4));
}
}
12.7 수학 클래스
수학클래스 Math클래스는 수학계산에 사용할 수 있는 메소드를 제공한다.
Math클래스의 메소드는 모두 정적이므로 Math클래스로 바로 사용이 가능하다.
package ch12.sec07;
public class MathExample {
public static void main(String[] args) {
//큰 점수 또는 작은 점수 얻기
double v1 = Math.ceil(5.3); //올림
double v2 = Math.floor(5.3); //내림
System.out.println("v1= " + v1);
System.out.println("v2= " + v2);
//큰값 또는 작은 값 얻기
long v3 = Math.max(3, 7);
long v4 = Math.min(3, 7);
System.out.println("v3= " + v3);
System.out.println("v4= " + v4);
//소수 이하 두 자리 얻기
double value = 12.3456;
double temp1 = value * 100;
long temp2 = Math.round(temp1); //반올림
double v5 = temp2 / 100.0;
System.out.println("v5= " + v5);
}
}
random() 메소드는 0.0과 1.0사이의 double 타입 나수를 리턴한다.
이 값을 이용해서 start부터 시작하는 n개의정수 start<=...<start+n 중 하나의 정수를 얻기위한 공식을 만들면 다음과같다.
int num = (int) (Math.random * n) + start; 4장2절참조
난수를 얻는 또다른 방법ㅇ,로 java.util.Random 클래스를 이용할 수 있다.
이클래스를 이용하면 boolean int double 난수를 얻을 수 있다.
Random() 현재시간을 이용해서 종자값을 자동설정한다.
Random(long seed) 주어진 종자값을 사용한다.
값을 기준으로해서 난수를 발생 똑같은 난수를 만듬. 값이 똑같으면 똑같은 난수가 나온다.?
난수를 계산할때 알고리즘에서 3을 가지고 계산하겟다?
종자값이란 컴퓨터가 실제로는 랜덤을 뽑을 수 없기때문에 미리 선형함수로 정해놓은 난수값이 정해져있는데 그게 종자값이다.
종자값(seed)란 난수를 만든느 알고리즘에 사용되는 값으로 종자값이 같으면 같은 난수를 얻는다.
Random클래스가 제공하는 메소드
boolean / nextBoolean() / boolean타입의 난수를 리턴
double / nextDouble() / double타입의 난수를 리턴 (0.0<= ~ <1.0)
int / nextInt() / int 타입의 난수를 리턴 -2^32<= ~ <=2^32-1);
int / nextint(int n) / int 타입의 난수를 리턴 (0<= ~ <n);\
package ch12.sec07;
import java.util.Arrays;
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
// 선택번호
int[] selectNumber = new int[6]; // 선택번호 6개가저장될 배열생성
Random random = new Random(3); // 선택번호를 얻기위한 Random 객체 생성
System.out.print("선택번호: ");
for (int i = 0 ; i < 6 ; i++) {
//선택번호 6개를 얻어 배열에 저장
selectNumber[i] = random.nextInt(45)+1;
System.out.print(selectNumber[i]+ " ");
}
System.out.println();
//당첨번호
int[] winningNumber = new int[6]; // 선택번호 6개가저장될 배열생성
random = new Random(5); // 선택번호를 얻기위한 Random 객체 생성
System.out.print("당첨번호: ");
for (int i = 0 ; i < 6 ; i++) {
//선택번호 6개를 얻어 배열에 저장
selectNumber[i] = random.nextInt(45)+1;
System.out.print(selectNumber[i]+ " ");
}
System.out.println();
//당첨여부
Arrays.sort(selectNumber); //비교하기전 배열항목을 정렬
Arrays.sort(winningNumber);
boolean result = Arrays.equals(selectNumber, winningNumber);
System.out.print("당첨여부: ");
if(result) {
System.out.println("1등에 당첨되셨습니다.");
} else {
System.out.println("당첨되지 않았습니다.");
}}}
2022.11.27 리뷰
한 것도 없지만 일요일 휴식
'기초단계 > JAVA' 카테고리의 다른 글
| 2022.11.28-2 JAVA 제네릭 (1) | 2022.11.28 |
|---|---|
| 2022.11.28-1 JAVA java.base 모듈 (1) | 2022.11.28 |
| 2022.11.26-1 JAVA java.base 모듈 (0) | 2022.11.26 |
| 2022.11.25-2 JAVA java.base 모듈 (0) | 2022.11.25 |
| 2022.11.25-1 JAVA 예외 처리 (1) | 2022.11.25 |