🏃♂️ 들어가기 앞서..
본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 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로 모두 래퍼클래스가 존재한다.
기본형 | 래퍼 클래스 | 생성자 |
---|---|---|
boolean | Boolean | Boolean(boolean value) Boolean(String s) |
char | Character | Character(char value) |
byte | Byte | Byte(byte value) Byte(String s) |
short | Short | Short(short value) Short(String s) |
int | Integer | Integer(int value) Integer(String s) |
long | Long | Long(long value) Long(String s) |
float | Float | Float(double value) Float(float value) Float(String s) |
double | Double | Double(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) ;