[Java] 13. 자바의 원시 타입 (1)

2023. 9. 28. 18:40Java언어 공부

자바 원시 타입 특징

 

자바의 원시 타입은 항상 값 타입 변수로만 처리할 수 있다.

 

- 보통은 그 컴퓨팅 환경에서 가장 효과적인 크기를 사용해서 원시타입을 나타내는데,자바는 항상 고정된 값을 사용함.

 

=>자바의 목표가 어떤 환경에서도 똑같은 결과가 나오길 바랬기 때문

 

- 부호가 있는 정수 타입만 제공함

 

- 문자형의 기본 코드는 유니코드임 (2byte)

 

- 원시 타입을 객체로 처리할 수 있는 Wrapper 클래스 제공

 

정수 타입

 

byte, short, int , long (순서대로 1,2,4,8byte의 크기를 가짐)

 

- 기본 타입 : int

 

- 부호가 있는 정수 타입만 존재함 => c언어처럼 unsigned는 존재하지 않는다

 

- 정수 상수는 2진수, 8진수, 10진수, 16진수로 표현이 가능하다

2진수, 8진수 16진수는 각 0b, 0, 0x 접두사를 사용하여 표현한다.

 

- char, byte, short를 이용한 계산은 자동으로 int로 변환한 후에 계산이 이루어진다.

- long 타입의 상수는 L 또는 l 접미사를 사용해야 한다.

 

int 타입

- 크기 : 4byte

- 범위 : -2,147,483,648 ~ 2,147,483,647

- 보통 최댓값과 최솟값을 외우지 않고 IntegerMIN_VALUE 혹은 Integer.MAX_VALUE로 나타냄

 

오버플로우

 

주어진 타입에 저장할 수 있는 범위를 벗어난 경우 발생하는 현상

 

byte n = 10;
n = n*n;

위 코드는 오류이다.

n은 byte 타입으로 초기화 되나 연산을 실행할 경우에는, int 타입으로 바뀌기 때문에

byte 타입인 n에 int 타입인 100이 들어갈 수 가 없다.

 

두 수의 합이 오버플로우인지 확인하는 방법

 

a + b > Integer.MAX_VALUE //이미 더하는 과정에서 오버플로우가 나서 오류가 뜰 수 있음
a > Integer.MAX_VALUE - b	//올바른 방법

 

난수 발생

 

java.util 패키지에 있는 Random 클래스, Math.random()

또는 ThreadLocalRandom.current() 이용

 

// 1부터 6사이의 랜덤한 숫자 생성
Random generator = new Random();
int d = 1+ generator.nextInt(6);

int d = 1 + ThreadLocalRandom.current().nextInt(6);

Random generator = new Random();
int d= (int)(1 + 6*genrator.nextDouble());

 

비트 연산

 

종류

 

- 논리곱(&)

- 논리합(|)

- 논리부정(~)

- XOR(^)

boolean isEven(int n)
{
	return n % 2 == 0;
}

//=>n이 음수일 경우 처리를 못함

boolean isEven(int n)
{
	return (n&0x01) == 0;
}

 

 

비트 연산

 

- >>, << : 산술 이동 (부호 유지 x)

- >>> : 논리 이동 (부호 유지)

 

부동 소수 타입

 

float, double (각각 4byte, 8byte)

 

- 기본 타입 : double

 

- 부동소수타입도 범위가 제한되어 있어서 정수 타입과 마찬가지로 오버플로우가 발생할 수 있다.

 

- 부동소수는 정수 타입을 나타낼 수 있지만, 부동소수는 무한 개이고 다 표현하지 못한다.

=> 가장 근접한 값으로 표현하며, 원래 값과의 차이 때문에 발생하는 오류를 반올림 오차 오류라고 한다.

 

- 부동소수는 0을 표시하는 방법이 2가지가 있음. 최상위 비트를 부호 비트로만 사용하기 때문이다.

 

double 타입

- 크기 : 8byte

- 범위 :  +/-1.76769313486231570x10^308 ~ +/-4.94065645841246544x 10^-324

- 정확도 : 15자리 정도의 유효숫자만 표현 가능

- 언더플로우 : 나타낼 수 있는 크기보다 더 작은 값을 나타낼 때를 칭함. 0으로 나타나고, 오류가 아님.

- /0 의 경우 : 0/0 을 제외하고 0으로 나눴을 때 오류가 나지 않고 무한대 값을 가지게 됨. 오류가 아님.

- 오버플로우 :  정수와 다르게 오류가 나지 않고 최댓값이나 최솟값으로 나타나게 된다.

 

float f=25.6;은 오류가 안나나

float f; f=25.6;은 오류가 난다

=> double이 float에 들어가는 것이 오류가 나기 때문에

 

- 나머지 연산이 가능하다.

 

 

BigInteger, BigDemical

 

java.math 패키지에서 제공하며, 원시타입 int와 double과 달리 범위나 정확도에 대한 제한이 없다.

그러나 계산에 소요되는 시간은 int와 double에 비교해서 느리다.

 

- +, -, *, / 연산을 add, substract, multiply, divide 메소드를 이용하여 사칙연산을 수행한다.

 

문자 타입

 

char 타입을 사용한다.

 

- C언어에선 1byte (ASCII코드) vs 자바에선 2byte (유니코드)

자바의 char은 0~65,536까지 있음

 

- 현재 유니코드로는 모든 다중 언어를 2byte로 표현할 수 없음 (ex. 이모지)

 

- 코드값은 각 문자를 나타내는 값을 의미하고, 인코딩은 주어진 코드를 표현하는 방법이다.

 

- 자바 18부터 기본적 인코딩을 UTF 8을 사용한다. 코드로 나타낼시 \u를 사용함.

 

- 문자 상수는 작은 따음표를 사용한다. (ex. 'a')

 

Character 클래스 유용 메소드 (Wrapper 클래스)

 

- char toLowerCase(char ch) : 소문자로

- char toUpperCase(char ch) : 대문자로

- int digit(char ch, int radix) : 문자를 정수로

- boolean isDigit(char ch) : 문자가 숫자인지

- boolean isLetter(char ch) : 문자가 영문자 대소문자인지

- boolean isLetterOrDigit(char ch) : 문자가 숫자나 영문자인지 (ex. 아닐경우 '$')

- boolean isLowerCase(char ch) : 소문자인지

- boolean isUpperCase(char ch) : 대문자인지

 

Boolean 타입 (논리형 타입)

 

- boolean 타입은 true와 false 두 가지 값만 가질 수 있다.

 

- 주로 if, switch, 반복문 등에서 사용됨

 

논리 연산자 

- && (and)

- || (or)

- ^ (xor)

- ! (not)

 

타입 변환

 

- 크기 순서대로 확장 변환은 가능하나 축소 변환은 허용하지 않는다.

(값이 바뀔 수도 있음)

 

-타입 변환

(typename) expression

 

- 실수 -> 정수로 변환 시 반올림을 하고 싶다면, Math.round()를 사용하면 됨.

 

Wrapper 클래스

 

- Byte, Integer, Short, Long, Double, Float, Character, Boolean이 있다.

 

- 기본 생성자를 제공하지 않는다.

 

- 불변 객체이다.

 

추가 개념

 

- a < b < c는 C나 C++에선 문법 오류가 아니지만, 자바에선 문자 오류이다.

- +=과 -=과 같은 복합 대입 연산자는 피연산자가 형식이 달라도 계산 과정에서

int로 바뀌는 것을 생각해야 한다.