[JAVA] java.lang 패키지 [ + util classes ] (4) : 수학 관련

DongGyu Jung·2022년 2월 10일
0

자바(JAVA)

목록 보기
27/60
post-thumbnail

🏃‍♂️ 들어가기 앞서..

본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕

*해당 교재의 목차 순서와 구성을 참고하여 작성하며
각 내용마다 부족할 수 있는 내용이나 개인적으로 궁금한 점은
추가적인 검색을 통해 채워나갈 예정입니다.



📊 Math 클래스

Math클래스의 생성자는
private이고
클래스 내에 인스턴스 변수가 하나도 없기 때문에
" 다른 클래스에서 Math인스턴스를 생성하는 것이 불가능하다. "
'자연로그의 밑''원주율'상수로 정의해놓음.

메서드

모두 static 메서드

※ 소숫점 아래의 값을 구하고 싶으면 꼭 실수로 나눠야함.

메서드 / 설명예시결과
static double abs(double d)
static float abs(float f)
static int abs(int i)
static long abs(long l)
" 절댓값 " 반환
int i = Math.abs(-10) ;
double d = Math.abs(-10.0) ;
i = 10
d = 10.0
static double ceil(double d)
" 올림값 " 반환
double d1 = Math.ceil(10.1) ;
double d2 = Math.ceil(-10.1) ;
double d3 = Math.ceil(10.000015) ;
d1 = 11.0
d2 = -10.0
d3 = 11.0
static double floor(double d)
" 버림값 " 반환
double d1 = Math.floor(10.5) ;
double d2 = Math.floor(-10.5) ;
d1 = 10.0
d2 = -11.0
static double max(double a, double b)
static float max(float a, float b)
static int max(int a, int b)
static long max(long a, long b)
비교해서 " 큰 값 " 반환
double d = Math.max(9.5, 9.500001) ;
int i = Math.max(0, -1) ;
d = 9.500001
i = 0
static double min(double a, double b)
static float min(float a, float b)
static int min(int a, int b)
static long min(long a, long b)
비교해서 " 작은 값 " 반환
double d = Math.min(9.5, 9.500001) ;
int i = Math.min(0, -1) ;
d = 9.5
i = -1
static double random()
0.0 이상 ~ 1.0 미만 】범위의 " 임의의 double값 " 반환
double d = Math.randon() ;
int i = (int)(Math.random()*10)+1 ;
0.0 <= d < 1.0
1 <= i < 11
static double rint(double d)
주어진 double값과
" 가장 가까운 정수값 "을 double형으로 반환
( 짝수 반올림 : 정가운데있는 값인 경우, 정수부분이 홀수일 경우, 가장 가까운 짝수로 반환 )
double d1 = Math.rint(1.2) ;
double d2 = Math.rint(2.6) ;
double d3 = Math.rint(3.5) ;
double d4 = Math.rint(4.5) ;
double d5 = Math.rint(0.5) ;
d1 = 1.0
d2 = 3.0
d3 = 4.0
d4 = 4.0
d5 = 0.0
static long round(double d)
static long round(float f)
소숫점 첫째자리에서 " 반올림한 정수값(long) " 반환
( 두 정수 사이의 정가운데있는 겂은 항상 큰 정수 반환 )
long l1 = Math.round(1.2);
long l2 = Math.round(2.6);
long l3 = Math.round(3.5);
long l4 = Math.round(4.5);
double d1 = 90.7552 ;
double d2 = Math.round(d1*100) / 100.0 ;
l1 = 1
l2 = 3
l3 = 4
l4 = 5
d1 = 90.7552
d2 = 90.76

앞서 말했듯이 소숫점 아래 값을 필요로 하는지 여부에 따라
연산을 잘 사용해야하는데

"round() 메서드"와 "rint()메서드 사용 시에도 주의해야한다.
위에 보다시피
둘다 반올림 하는 메서드인데

round()
반환타입long으로 " 정수형이기 때문에

소숫점 아래 값을 구하고자 할 때,
자릿수 조정을 위한 추가연산이 필요하다.

중간값인 .5 단위의 값들이 꽤 골치아픈 친구들인데
0.5 단위를 가진 값들의 합을 round()를 통해 구해보면
.5 단위는 무조건 올려서 연산되기 떄문에
실제 값들과 오차가 상당히 발생한다.

그런 경우에 rint() 메서드를 사용하면
공평하게 한번은 올리고 한번은 내려서 연산하게 되어
실제 값에 더 가까운 결과를 얻을 수 있다.


🧬 Number 클래스

모든 숫자 래퍼(wrapper) 클래스조상

/* 
실제 Number 클래스 소스 
객체 값을 숫자와 관련된 기본형으로 변환해서 반환하는 메서드들 정의되어 있음.
*/
public abstract class Number implements java.io.Serializable { // abstract 추상 클래스
	//추상메서드 (래퍼 객체 -> 기본형)
	public abstract int intValue() ;
    public abstract long longValue() ;
    public abstract float floatValue() ;
    public abstract double doubleValue() ;
   
    public byte byteValue() {
    	return (byte)intValue() ;
    }
    public short shortValue() {
    	return (short)intValue() ;
    }
}

우리가 이전부터 봐왔던
Byte / Short / Integer / Long / Float / Double 등은 익숙하지만
이 외에도

BigInteger클래스 와 BigDecimal클래스도 있다.

BigInteger클래스는
" long으로도 다룰 수 없는 큰 범위정수 "를 다룰 때 사용하고

BigDecimal클래스는
" double으로도 다룰 수 없는 큰 범위부동 소수점 수 "를 다룰 때 사용


🎁 래퍼(wrapper) 클래스

기본형 값을 " 감싸는 " 클래스 ▶ " 기본형을 '객체'로 다뤄야할 때 " 사용

8개의 기본형에
1 대 1로 모두 래퍼클래스가 존재한다.

기본형래퍼 클래스생성자
booleanBooleanBoolean(boolean value)
Boolean(String s)
charCharacterCharacter(char value)
byteByteByte(byte value)
Byte(String s)
shortShortShort(short value)
Short(String s)
intIntegerInteger(int value)
Integer(String s)
longLongLong(long value)
Long(String s)
floatFloatFloat(double value)
Float(float value)
Float(String s)
doubleDoubleDouble(double value)
Double(String s)

단, 여기서 주의해야할 점
생성자 매개변수로 String(문자열)을 투입할 때,
" 각 자료형에 맞는 문자열을 사용해야 한다는 점 "이다.

모든 래퍼 클래스들은
모두 equals()toString()dl 오버라이딩 되어 있어서
객체가 가진 값을 비교하게 되고
가진 값을 문자열로 반환할 수 있다.
( 오토박싱이 되더라도 비교연산자는 사용 불가)

equals()toString() 등과 같은 메서드 외에도
래퍼 클래스들은 MAX_VALUE / MIN_VALUE / SIZE / BYTES, TYPE
자료형 관련 static 상수를 가지고 있다.
※ 자료형의 최대, 최소값 같은 내용은 《 [JAVA] 변수(Variable) 정리 》글의 정수형 오버플로우 부분 참고



💨 문자열 ▶ 숫자 변환

※ 문자열과 기본형간 변환과 유사한 맥락 《 [JAVA] String 클래스 _ "생성자" + "메서드" 》글 참고

// 래퍼 클래스 생성자 이용 ▶ 객체 생성 & intValue(),floatValue(), ...
int i = new Integer("100").intValue() ;

// .parse 메서드 사용 - 가장 많이 사용됨,
int i2 = Integer.parseInt("100") ;

// .valueOf 메서드 사용
Integer i3 = Integer.valueOf("100") ; // int i3 도 가능 (오토박싱)

* 반대로 문자열로 변환할 땐 toString() 사용하면 된다.



※ " 오토박싱 " & " 언박싱 "

【 기본형 값 → 래퍼클래스 객체 】 자동변환 : " 오토박싱(autoboxing) "
【 래퍼클래스 객체 → 기본형 값 】 자동변환 : " 언박싱(unboxing) "

상자로 감싸는 객체가 되는 것이니까 자동 boxing 이라고 생각하고
상자(객체) 속 값 자체가 되는 것이니까 unboxing 이라고 생각하면 쉽다.

과거 JDK1.5 이전에는 [기본형 - 참조형] 간의 연산이 불가능했었다.

/* JDK 1.5 이전 */
int i = 5 ;
Integer iObj = new Integer(7) ;
// int sum = i + iObj ;  불가능
int sum = i + iObj.intValue();

/* JDK 1.5 이상 */
int sum = i + iObj ; //가능 - 자동으로 위 .intValue() 와 같은 변환 코드를 넣어줌

단독 객체 대상 뿐만 아니라

내부적으로 객체 배열을 갖고 잇는
" Vector클래스 "나 " ArrayList클래스 "에서

" 기본형 값을 저장할 때 " 나
" 형변환이 필요할 때 "도
AutoBoxing과 UnBoxing이 필요한데

이 과정 또한
지금은 컴파일러가 자동으로 변환해주는 코드를 추가해준다.

ArrayList<Integer> list = new ArrayList<Integer>() ; // <Integer> 지네릭스(generics)는 향후 더 자세히
// int 기본형 값을 "객체배열"에 추가하는 경우
list.add(10) ; // 오토박싱 _ 10 → new Integer(10)

// 객체 배열 내 객체를 int 기본형 값으로 가져오는 경우
// (객체배열).get([index값])
int value = list.get(0) ; // 언박싱 _ new Integer(10) → 10

형변환에 대해 조금 더 풀어보자면

/* 컴파일 전 _ 작성한 코드*/
int i = 100 ;
Integer iObj = (Integer)i ;
Object obj = (Object)i ;
Long lObj = 100L ;

/* 컴파일러의 자동 형변환 */
Integer iObj = (Integer)i.valueOf(i) ;
Object obj = (Object)i.valueOf(i) ;
Long lObj = new Long(100L) ;

0개의 댓글