# JAVA Ch09. java.lang 패키지와 유용한 클래스[2]

uuuu.jini·2022년 3월 7일
0

JAVA -자바의 정석

목록 보기
11/18
post-thumbnail

목차

1.4&5] math클래스 & 래퍼 클래스
2 ] 유용한 클래스

1.4 ] Math클래스

Math클래스는 기본적인 수학계산에 유용한 메서드로 구성되어 있다. ( ex. random(), round() )

Math클래스의 생성자는 private이기 때문에 다른 클래스에서 Math인스턴스를 생성할 수 없도록 되어 있다. --> 클래스내에 인스턴스변수가 하나도 없어서 인스턴스를 생성할 필요가 없기 때문이다. Math클래스의 메서드는 모두 static이며, 2개의 상수만 정의해 놓았다.

public static final double E = 2.718281828... // 자연로그의 밑
public static final double PI = 3.141592.. // 원주율

올림,버림,반올림

소수점 n번째 자리에서 반올림한 값을 얻기 위해서는 round() 를 사용해야 하는데, 이 메서드는 항상 소수점 첫째자리에서 반올림을 해서 정수값(long)을 결과로 돌려준다. 원하는 자리 수에서 반올림된 값을 얻기 위해서는 간단히 10의 n제곱으로 곱한 후, 다시 곱한 수로 나눠주기만 하면 된다.

1. 원래 값에 100을 곱한다.

	90.7552 * 100 = 9075.52

2. 위의 결과에 Math.round()를 사용한다.

	Math.round(9075.52) = 9076

3. 위의 결과를 다시 100.0으로 나눈다.

	9076 / 100.0 = 90.76

정수형 간의 연산에서는 반올림이 이루어지지 않는다.

package ch09;

import static java.lang.Math.*;
import static java.lang.System.*;

public class MathEx1 {
	public static void main(String args[]) {
		double val = 90.7552;
		out.println("round(" + val + ") = " + round(val)); //반올림
		
		val *= 100;
		out.println("round(" + val + ") = " + round(val));
		
		out.println("round(" + val + " ) /100 = " + round(val)/100);
		out.println("round(" + val + " ) /100.0 = " + round(val)/100.0);
		
		out.println();
		
		out.printf("ceil(%3.1f) = %3.1f%n",1.1,ceil(1.1)); // 올림
		out.printf("floor(%3.1f) = %3.1f%n",1.5,floor(1.5)); // 버림
		out.printf("round(%3.1f) = %d%n",1.1,round(1.1));  // 반올림
		out.printf("round(%3.1f) = %d%n",1.5,round(1.5));  // 반올림
		out.printf("rint(%3.1f) = %f%n",1.5,rint(1.5));
		
		out.printf("round(%3.1f) = %d%n",-1.5,round(-1.5)); //반올림
		out.printf("rint(%3.1f) = %f%n",-1.5,rint(-1.5));  //반올림
		out.printf("ceil(%3.1f) = %3.1f%n",-1.5,ceil(-1.5)); // 올림
		out.printf("floor(%3.1f) = %3.1f%n",-1.5,floor(-1.5)); // 버림
		
	
		
	}
}

정적 import문
static import 사용시 클래스의 static메서드(인스턴스 생성없이 사용하는 메서드)를 클래스의 이름없이 사용할 수 있게 해준다.

rint()는 round()와 같이 소수점 첫째 자리에서 반올림하지만 반환값이 double이다.

	out.printf("rint(%3.1f) = %3.1f%n",1.5,rint(1.5));
    // 반환값이 double형 --> 2.0000 이 출력된다.

그리고 rint()는 두 정수의 정가운데 있는 값은 가장 가까운 짝수정수를 반환한다.

		out.printf("round(%3.1f) = %d%n",-1.5,round(-1.5)); //-1을 출력
		out.printf("rint(%3.1f) = %f%n",-1.5,rint(-1.5));  //-2.000을 출력 

예외를 발생시키는 메서드

메서드 이름에 Exact가 포함된 메서드들이 JDK1.8부터 새로 추가되었다. 이들은 정수형간의 연산에서 발생할 수 있는 오버플로우를 감지하기 위한 것이다.

int addExact(int x, int y)
int subtractExact(int x, int y)
...

연산자는 단지 결과를 반환할 뿐, 오버플로우의 발생여부에 대해 알려주지 않는다. 위의 메서드들은 오버플로우가 발생하면, 예외(ArithmeticException)를 발생시킨다.

삼각함수와 지수,로그

	public static void main(String[] args) {
		int x1 = 1,y1 = 1;
		int x2 = 2,y2 = 2;
		
		
		double c = sqrt(pow(x2-x1,2)+pow(y2-y1,2)); // 두 점 사이의 거리 ( (x2-x1)^2 - (y2-y1)^2 )
		double a = c* sin(PI/4);
		double b = c * cos(PI/4);
		
		out.printf("a=%f%n",a);
		out.printf("b=%f%n",b);
		out.printf("c=%f%n",c);
		
		
		out.printf("angle=%f rad%n", atan2(a,b));
		out.printf("angle=%f degree %n%n", atan2(a,b)* 180 / PI);
		
		out.printf("24 * log10(2) = %f%n",24*log10(2));
		out.printf("53 * log10(2) = %f%n%n",53*log10(2));


	}

sqrt() : 제곱근
pow() : 제곱
sin(라디안) : 사인, cos(라디안) : 코사인
atan() : 끼인각

StrictMath 클래스

Math클래스는 최대한의 성능을 얻기 위해 JVM이 설치된 OS의 메서드를 호출해서 사용한다. ( OS에 의존적인 계산) 어떤 OS에서 실행되어도 항상 같은 결과를 얻도록 Math클래스를 새로 작성한 것이 StrictMath클래스이다.

Math클래스의 메서드

메서드설명
abs(매개변수)절대값을 반환
ceil()올림하여 반환
floor()내림하여 반환
max()두 값을 비교하여 큰 쪽을 반환
min()두 값을 비교하여 작은 쪽을 반환
random()0.0~1.0 범위의 임의이 double값 반환
rint()가장 가까운 정수값을 double형으로 반환, 가운데 값->짝수 반환
round()반올림한 정수값(long)을 반환한다.

1.5 ] 래퍼(Wrapper) 클래스

기본형을 객체로 다뤄야 하는 경우 사용하는 것이 Wrapper클래스 이다. 8개의 기본형을 대표하는 8개의 래퍼클래스가 있는데, 이 클래스들을 이용하면 기본형 값을 객체로 다룰 수 있다.

char형과 int형을 제외한 다른 모든 기본형은 첫글자를 대문자로 한것이 래퍼클래스이다. 래퍼클래스의 생성자는 매개변수로 문자열이나 각 자료형의 값들을 인자로 받는다. (문자열 사용시 - 각 자료형에 알맞은 문자열 사용 )

래퍼 클래스들은 객체생성 시에 생성자의 인자로 주어진 각 자료형에 알맞은 값을 내부적으로 저장하고 있으며, 이에 관련된 여러 메서드가 정의되어 있다.

기본형래퍼클래스
booleanBoolean
charCharater
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble

래퍼 클래스들은 모두 equals() 메서드가 오버라이딩 되어 있어서 주소값이 아닌 객체가 가지고 있는 값을 비교한다. Integer객체에는 비교연산을 수행할 수 없다. 대신 compareTo() 를 제공한다. 또한 toString() 도 오버라이딩 되어 있어서 객체가 가지고 있는 값을 문자열로 변환하여 반환한다. (이외에 MAX_VALUE,MIN_VALUE,SIZE,BYTES,TYPE등 가짐 )

Number 클래스

추상클래스로 내부적으로 숫자를 멤버변수로 갖는 래퍼클래스들의 조상이다. 숫자관련된 래퍼클래스들은 모두 Number클래스의 자손이다. BigInteger는 long으로 다룰 수 없는 큰 정수를 BigDecimal은 double로도 다룰 수 없는 큰 부동소수점을 위한 것이다.

문자열을 숫자로 변환하기

int i = new Integer("100").intValue(); // floatValue(),longValue()...
int i2 = Integer.parseInt("100"); // 주로 사용
int i3 = Integer.valueOf("100"); 

타입.parse타입(String s)는 반환값이 기본형이고 타입.valueOf(String s)는 반환값이 래퍼 클래스 타입이다.

오토박싱 & 언박싱 ( autoboxint & unboxing )

JDK1.5이전에는 기본형과 참조형 간의 연산이 불가능 했기 때문에, 래퍼 클래스로 기본형 객체를 만들어서 연산을 해야 했다.

그러나 이제는 기본형과 참조형 간의 덧셈이 가능하다. 컴파일러가 자동으로 변환하는 코드를 넣어주기 때문이다. 이렇게 기본형 값을 래퍼클래스의 객체로 자동 변환해주는 것을 오토박싱이라고 하고, 반대로 변환하는 것을 언박싱이라고 한다.


2. 유용한 클래스

2.1 ] java.util.Objects클래스

모든 메서드가 static이다. 객체의 비교나 널 체크에 유용하다.

isNull() 은 해당 객체가 널인지 확인해서 null이면 true를 아니면 false를 반환한다. nonNull() 은 정반대의 일을 한다.

static boolean isNull(Object obj)
static boolean nonNull(Object obj)

requireNonNull() 은 해당 객체가 널이 아니어야 하는 경우에 사용된다. 만일 객체가 널이면, NullPointerException을 발생시킨다. 두번째 매개변수로 지정한 문자열은 예외의 메시지가 된다.

	static <T> T requrieNonNull(T obj, String message)

compare() 는 두 비교대상이 같으면 0, 크면 양수, 작으면 음수를 반환한다.

equals()deepEquals() : equals는 널 검사를 하지 않아도 되고, deepEquals()는 재귀적 비교 때문에 다차원 배열의 비교가 가능하다.

toString() 도 내부적으로 널 검사를 한다는 것 빼고는 특별한 것이 없다. hashCode() 도 내부적으로 널 검사를 한 후에 Object클래스의 hashCode()를 호출 한다. (널일 경우 0반환)

2.2 ] java.util.Random 클래스

double randNum = Math.random();
double randNum = new Random().nextDouble(); //위의 문장 동일

1~6사이의 난수 얻기

int num = (int)(Math.random()*6) + 1;
int num = new Random().nextInt(6) + 1;

Random()의 큰 차이점은 종자값(seed)를 설정할 수 있다는 것이다. 종값이 같은 Random 인스턴스는 항상 같은 난수를 순서대로 반환한다.

Random클래스의 생성자와 메서드

생성자 Random()은 종자값을 System.currentTimeMillis() 로 하기 때문에 실행시 마다 얻는 난수가 달라진다. (Random(long seed) : seed를 종자값으로하는 Random인스턴스 생성 )

2.3 ] 정규식 ( Regular Expression) - java.util.regex패키지

정규식이란 텍스트 데이터 중에서 원하는 조건과 일치하는 문자열을 찾아내기 위해 사용하는 것으로 미리 정의된 기호와 문자를 이용해서 작성한 문자열을 말한다. 정규식을 이용하면 많은 양의 텍스트 파일 중에서 원하는 데이터를 손쉽게 뽑아낼 수도 있고 입력된 데이터가 형식에 맞는지 체크할 수도 있다.

2.4 ] java.util.Scanner 클래스

Scanner는 화면,파일,문자열과 같은 입력소스로부터 문자데이터를 읽어오는데 도움줄 목적으로 추가되었다.

Scanner(String source)
Scanner(File source)
Scanner(InputStream source)
Scanner(Readable source)
Scanner(ReadableByteChannel source)
Scanner(Path source)

위와 같은 생성자를 지원하기 때문에 다양한 입력소스로부터 데이터를 읽을 수 있다.

정규식 표현을 이용한 라인단위의 검색을 지원하며 구분자에도 정규식 표현을 사용할 수 있어서 복잡한 형태의 구분자도 처리가 가능하다.

Scanner s = new Scanner(System.in);
String input = s.nextLine();

입력받을 값이 숫자라면 nextLine()대신 nextInt() 또는 nextLong()과 같은 메서드를 사용할 수 있다. (nextBoolean(), nextFloat() .. 등)

2.5 ] java.util.StringTokenizer클래스

긴 문자열을 지정된 구분자(delimiter)를 기준으로 토큰이라는 여러개의 문자열로 잘라내는데 사용된다. ( String의 split이나 Scanner의 useDelimiter를 사용할 수 있다. )

2.6 ] java.math.BigInteger클래스

더 큰 범위의 정수형을 표현하기 위한 클래스이다. int배열을 사용해서 값을 다룬다. BigInteger는 불변이며, '2의보수'형태로 표현한다.

2.7 ] java.math.BigDecimal클래스

더 큰범위의 부동 소수점을 표현하기 위한 클래스이다.

profile
멋쟁이 토마토

0개의 댓글