[Java] 자바 원시 타입

이현준·2020년 10월 15일
1

Java

목록 보기
12/15

자바에서의 원시타입은 값 타입으로만 접근할 수 있다.(참조나 주소로는 절대 못 접근함)

정수타입 4가지 - byte, short, int, long

기본 타입 = int

부호가 있는 정수타입만 있음
-128부터 127이니깐 혹시 128안 쓰게 조심

자동으로 int로 변환되어 계산

char, byte, short를 이용한 계산은 자동으로 int로 변환되어 계산이
이루어짐

자동으로 int로 변환되는데 왜 byte, short을 쓰냐

우리 프로그램에서 연산할때는 의미가 별로 없다 어차피 CPU로 가면 CPU가 연산하기 좋은 int로 바꿔어서 계산하기 때문에,
단 우리가 데이터 파일을 저장하고 통신 메세지를 전송할때는 의미가 있다. 1byte를 보내는거 하고 4byte를 보내는거 하고 차이가 있기 때문이다.

부동소수 타입 2가지 - float, double

기본타입 = double

문자타입 1가지 - char

기본 코드는 유니코드로서 2바이트임(1바이트 아님-> C언어는 아스키로 1바이트)

논리형 1가지 - boolean


문제는 -일때 처리를 못해준다는 것이다. 그래서 이때 비트연산을 사용하면 (n&1) == 1 이걸로 더 빠르고 음수까지 처리해줄 수 있다.

오버 플로우


여기서 문법 오류나는건 범위를 벗어나서 그런게 아니라 byte끼리 곱하면(사칙연산) int로 변환돼서 하기때문에 우항이 int인것을 좌항 byte에 넣으려고해서 문제이다.

오버플로우 극복 방법


난수발생

종류 3가지

Seed

여기서 만드는 난수는 실제난수가 아니라 난수처럼 보이는 의사난수임 그래서 암호학적으로 이걸 난수를 쓰면 안됨. 파악될 수 있기 때문에
여튼 자바에서는 new Random() 하면 알아서 적절한 시드값을 넣어주기 때문에 new Random(System.currentTimeMillis())이렇게 할 필요 없음.

왜 객체로 모델링했을까?

랜덤 값을 만들때 기존에 만들었던 값을 기준으로 랜덤한 값을 만들기 때문에 객체로 모델링하는게 좋다

비트 연산

  • 짝수, 홀수 판단할 때 비트연산으로하면 속도도 빨라지고 음숙까지도 체크해줄 수 있다.
  • 주어진 정수가 2의 거듭제곱인지 판단하기 위해서 비트연산으로 1인 비트가 딱 하나 있는지만 확인하면 된다
n&(n-1) == 0

부동 소수 타입

반올림 오차

double 타입

정확도 : 15자리 정도의 유효 숫자만
10d로 표현
더블에서는 대칭적임, -0, +0 (부호비트 써서)
Min이 0에 매우 가까운 수이고
MAX는 가장 큰거
undrerflow 0에 가까운것보다 더 가까워지면 underflow=>이때 0으로
+MAX_VALUE 를 넘어가면 POSITIVE_INFINITY
-MAX_VALUE 보다 아래로 가면 NEGATIVE_INFINITY
0/0 는 Nan이다.

float

기본이 double인데 float에 넣어서 에러

BigInteger, BigDecimal

내부적으로 배열같이 만들어서 연산하는듯 그래서 속도가 느려
+, -, *, / 가 아닌 add, subtract, multiply, divide 메소드를 이용하여 사칙연산 수행한다.
new보다는 qhxhd valueof 메소드를 사용해서 만들어준다

문자타입

유니코드 자체를 나타내고 싶으면 (\u)확장 문자를 사용함
ex) char c - '\u99E9';

var x = 'a' + 2; //는 char 는 int형으로 변환돼서 연산되기 때문에 int로 된다.
char y = 'b' +3 // 이것도  int로 변환되지만 상수식이고 int의 값이 char로 나타낼 수 있는 범위이면 알아서 타입을 변환해서 넣어준다.
char z = 'f' + 100000; // 이건 int의 범위가 char로 변환될 수 있는 범위를 넣어서기 때문에 에러가 뜬다.

우리는 char가 문자적인 속성과 integer type 둘 다 가지고 있는 이중적인 타입인것을 알아야된다.
그리고 상수식이 아닌 경우에는 char가 연산했을 때는 무조건 int형으로 바뀌기 때문에 nextChar 메서드와 같이 (char)로 변환을 해주어야 한다.
또한 제일 하단의 상자 2개를 봐도 'a' +'e'는 int이기때문에 위의 foo메소드가 호출된다.

타입변환


오른쪽 방향으로 갈때 확장 변환이라하고 왼쪽 방향으로 가는걸 축소 변환이라고 한다. 자동 축소 변환은 문법 오류임(단, 상수식같은 경우에는 값이 들어갈 수 있는 경우 그냥 들어간다) 그래서 축소 변환을 해줄때는 강제 타입 변환을 해주고(정보 손실이 발생할 수 있음을 생각해야 한다

자동 타입 변환

원시타입 Wrapper 클래스

자바 lang 클래스에 있어서 import 굳이 할 필요 없음
원시타입을 객체로 처리할 수 있는 Wrapper 클래스
자바 5부터는 autoboxing/unboxing 기능으로 자동으로 변환
그리고 wrapper 클래스에는 각 원시 타입과 관련된 상수와 유용한 메소드들이 정의되어 있음

맨 아래줄 대신 n = o 이렇게 해도 상관없다.

표현식의 평가

+ C에서는 a < b < c 문법 오류가 아니지만 자바에서는 문법오류인 이유 C/C++.에서는 비교연산자는 정수로 평가되지만 자바에서는 비교연산자의 결과는 boolean 이기 때문에 boolean과 int 타입을 비교할 수 없어서 문법 오류이다.
(a < b < c가 된다는 얘기는 아니다)

연산자 우선순위

단항

이항(산술(곱셉 계열, 덧셈 계열), 비교, 논리, 대입 순서대로)

아래 식을 보면 순서 왜 위에 처럼되는지 이해할 수 있음

S = a + b > 0 && c > 0

연산자 결합순서

  • 단항 : 오른쪽에서 왼쪽
  • 이항 : 왼쪽에서 오른쪽
    • 대입은 거꾸로
a/b/c  이면 a를 먼저 b로 나누고 그 값을 c로 나눈다.
a = b = c  이면 b = c 을 대입하고 a= b를 대입한다.


n += 2.5는 n = (int)(n + 2.5)로 연산되기때문에 에러 없다.

평가 순서 순위

0개의 댓글