2023. 9. 28. 18:40ㆍJava언어 공부
자바 원시 타입 특징
자바의 원시 타입은 항상 값 타입 변수로만 처리할 수 있다.
- 보통은 그 컴퓨팅 환경에서 가장 효과적인 크기를 사용해서 원시타입을 나타내는데,자바는 항상 고정된 값을 사용함.
=>자바의 목표가 어떤 환경에서도 똑같은 결과가 나오길 바랬기 때문
- 부호가 있는 정수 타입만 제공함
- 문자형의 기본 코드는 유니코드임 (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로 바뀌는 것을 생각해야 한다.
'Java언어 공부' 카테고리의 다른 글
[Java] 10. 상속과 구체화 (2) (0) | 2023.10.07 |
---|---|
[Java-FX] 2. Java FX와 도형 그리기 (2) (0) | 2023.10.01 |
[Java] 9. 상속과 구체화 (1) (0) | 2023.09.26 |
[Java-FX] 1. Java FX와 도형 그리기 (1) (0) | 2023.09.24 |
[Java] 8. 클래스(2) (0) | 2023.09.22 |