본문 바로가기
DEV/Java

[자바] 2. 자료형 & 연산자

by 어쩌다개발 2022. 1. 13.
반응형



 

 

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

 

Math (Java SE 11 & JDK 11 )

Returns the fused multiply add of the three arguments; that is, returns the exact product of the first two arguments summed with the third argument and then rounded once to the nearest float. The rounding is done using the round to nearest even rounding mo

docs.oracle.com

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

댓글