1. 기본 자료형과 참조 자료형
1.1. 기본 자료형
기본 자료형은 사용하는 메모리가 정해져있는 자료형이다.
- 컴퓨터에서는 모든 문자에 번호를 할당하고 문자를 정수로 바꿔서 저장한다.
- 문자에 어떤 번호를 할당하는지는 다양한 방법이 있는데, 자바는 유니코드라는 세계 표준 규격을 따른다.
- 유니코드의 경우 국제적으로 사용되는 모든 문자를 0 ~ 65,535 범위(2 바이트)의 정수에 할당한다.
1) 실수형
- 실수형의 유효 자리는 소수점 아래의 숫자를 의미
- float, double 을 사용하다보면 연산이 부정확한 경우가 종종 있는데 유효자리수를 넘어가는 경우이다.
* 만약 금융 계산을 할 때, 정확한 부동소수점을 표시하고 연산해야 된다면 BigDecimal, BigInteger 클래스를 활용한다.
2) 디폴트값
- 정수형에서 디폴트 값은 int / 실수형에서의 디폴트 값은 double이다.
- 소수점이 없는 숫자는 int형으로, 소수점이 있는 숫자는 double형으로 간주 한다.
* 범위를 벗어난 값을 대입하면 에러
3) 형변환(캐스팅)
- 8개의 기본형 중에서 boolean을 제외한 나머지 7개의 기본형 간에는 서로 형변환이 가능하다.
- 자동형변환(묵시적형변환) : 작은 범위의 데이터를 큰 범위의 데이터에 할당하는 경우 JVM이 자동적으로 형변환을 수행한다.
- 강제형변환(casting) : 큰 범위의 데이터를 작은 범위의 데이터로 강제로 할당, 강제로 변환하는 경우 값 손실이 일어날 수 있어서 JVM이 자동으로 형변환하지 않고 프로그래머가 직접 하도록 한다.
* int(4byte)/long(8byte) > float(4byte)/double(8byte)로 형변환이 가능한 이유?
실수형과 정수형은 값을 표현하는 방식이 다르기 때문에 실수형이 정수형보다 큰 표현값을 갖기 때문에 같은 크기를 가져도 정수형보다 실수형이 오른쪽에 위치한다.
1.2. 참조자료형
참조 자료형은 클래스를 타입으로 변수를 선언하는 자료형이다.
- JAVA에서 기본형(Primitive type)을 제외한 타입들이 모두 참조형(Reference type) 이다.
- 참조 자료형은 new로 인해 stack에 데이터가 할당되는게 아닌 Heap에 참조할 데이터를 넣고, stack에는 참조할 주소값이 들어간다.
- 클래스에 따라 할당되는 메모리가 다르다.
- 대표적으로 String, Date 등이 존재하고 임의로 내가 원하는 클래스를 만들어 참조 자료형으로 사용할 수 있다.
- 참조형(Reference type)은 JAVA에서 최상인 java.lang.Object클래스를 상속하는 모든 클래스들을 말한다.
- 대표적으로 클래스 타입(class type), 인터페이스 타입(interface type), 배열 타입(array type), 열거 타입(enum type) 등이 있다.
1.3 상수와 리터럴(constant & literal)
상수(constatn)는 변수와 마찬가지로 '값을 저장할 수 있는 공간' 이지만, 한 번 값을 저장하면 다른 값으로 변경할 수 없다.
선언 방법은 변수와 동일하며, 단지 변수의 타입 앞에 키워드 'final'을 붙여주면 된다.
final int MAX_VALUE = 100; //상수 MAX_VAlUE를 선언 후 초기화
리터럴은 값 자체를 의미한다.
원래 100, 10, 3.14, 'A' 와 같은 값 자체가 '상수'인데, 프로그래밍에서는 상수를 '값을 한 번 저장하면 변경 할 수 없는 저장공간' 으로 정의해버려서 정작 상수를 다른 이름으로 불러야만 했다.
그래서 상수 대신 리터럴이라는 용어를 사용한다.
변수(variable) : 하나의 값을 저장하기 위한 공간
상수(constant) : 값을 한번만 저장할 수 있는 공간
리터럴(literal) : 값 자체를 의미
2. 연산자
2.1. 할당 연산자
int num = 0;
1) '=' 는 할당 연산자이다. 결합 방향이 오른쪽이므로 0을 num에 할당한다.
int num = 1;
num += 2; //num = num + 2와 같다.
2) '+=' 는 복합 할당 연산자이다. 연산자의 왼쪽과 오른쪽을 결합한 후 결과를 왼쪽에 할당한다.
복합 할당 연산자를 쓰는 이유?
i = i + 3 : i 와 3을 더한다. > 더한 값을 임시 저장소에 넣는다. > 임시 저장소값을 다시 i에 저장한다.
i += 3 : i + 3을 더한 후 i에 대입한다.
3. 수학 메서드
제곱수 | Math.pow(x, y) |
제곱근 | Math.sqrt(x) |
두 값의 최솟값 | Math.min |
두 값의 최댓값 | Math.max |
이 외에도 Math 클래스에는 삼각 함수와 로그 함수를 위한 메서드도 있고, Math.PI, Math.E 같은 상수도 정의되어 있다.
참고 : https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Math.html
3.1. 숫자타입변환
int num = 10000000;
System.out.println(num * 10000000);
결과값이 100000000000000이 나오는게 아니라, 276447232이 나온다.
int의 최댓값이 2억을 겨우 넘기 때문이다. 반면에 Math.multiplyExact(a, b)를 호출하면 예외가 일어난다.
이 메세드를 사용하면 틀린 결과 대신 예외를 잡아내거나 프로그램이 종료되게 할 수 있다.(자바8부터 제공)
이 외에도 addExact, subtractExact, incrementExact, decrementExact, negateExact등이 있으며 모두 int와 long 파라미터버전을 제공한다.
int num = (int)30000000000L;
System.out.println(num);
결과값으로 -64771072이 반환된다.
타입 변환이 숫자의 중요 부분을 소리 없이 날려버릴 수 있다는 점이 불안하다면, 타입 변환 대신 Math.toIntExact 메서드를 사용하여 long을 int로 변환할 수 없을 때 예외를 일으킬 수 있다.(자바8부터 제공)
3.2. 큰 숫자
기본 정수 타입이나 부동소수점 타입의 정밀도로 충분하지 않을 대는 java.math 패키지의 BigInteger와 BigDecimal 클래스로 전환하면 된다.
1)BigInteger : 임의의 정밀도 정수 연산을 구현
BigInteger n = BigInteger.valueof(976543210123456789L);
System.out.println(n);
결과 : 976543210123456789
정적 메서드 valueOf는 long 타입 값을 BigInteger로 변환한다.
2)BigDecimal : 부동소수점 수에 같은 동작을 구현
BigInteger k = new BigInteger("9876543210123456789");
System.out.println(k);
결과 : 9876543210123456789
숫자로 구성된 문자열로부터 BigInteger를 생성할 수도 있다.
3) 자바는 객체에 연산자를 사용할 수 없다. 따라서 큰 숫자를 다룰 때는 반드시 메서드를 호출해야 한다.
BigInteger n = BigInteger.valueOf(876543210123456789);
BigInteger k = new BigInteger("9876543210123456789");
BigInteger r = BigInteger.valueOf(5).multiply(n.add(k)); // r = 5 * (n + k)
결과 : 53765432101234567890
multiply | 곱하기 |
add | 더하기 |
subtract | 빼기 |
divide | 나누기 |
참고:
카이호스트만의 코어자바8
Java의 정석
'DEV > Java' 카테고리의 다른 글
[자바] 사용자 정의 예외 만들기 (2) | 2023.02.01 |
---|---|
[자바] default method 와 static method (2) | 2023.02.01 |
[자바] 4. 배열 리스트 (0) | 2022.01.15 |
[자바] 3. 문자열 (1) | 2022.01.13 |
[자바] 1. 기본 프로그래밍 구조 (0) | 2022.01.11 |
댓글