Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- vfr video
- JanusGateway
- k8s #kubernetes #쿠버네티스
- 자원부족
- PytestPluginManager
- 오블완
- VARCHAR (1)
- JanusWebRTC
- Spring Batch
- JanusWebRTCGateway
- 깡돼후
- taint
- terminal
- JanusWebRTCServer
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- tolerated
- kotlin
- 개성국밥
- 코루틴 컨텍스트
- 달인막창
- pytest
- 겨울 부산
- table not found
- preemption #
- python
- PersistenceContext
- 코루틴 빌더
- mp4fpsmod
- Value too long for column
- 티스토리챌린지
Archives
너와 나의 스토리
[Java 기초부터 다시] 2. 변수 / 연산자와 연산식 본문
반응형
변수란?
- 변수는 하나의 값을 저장할 수 있는 메모리 공간의 의미한다.
변수값 저장
- int score = 90;
- 위의 예시처럼 변수를 선언함과 동시에 초기값을 줄 수 있다. 이런 식으로 소스 코드 내에서 직접 입력된 값을 '리터럴(literal)'이라고 부른다.
정수 리터럴
- 10진수: 소수점이 없는 정수 리터럴
- 8진수: 0으로 시작하는 리터럴 ex) 02, -04
- 16진수: 0x또는 0X로 시작하고 숫자와 A, B, C, D, E, F(대소문자 상관 x)로 구성됨 ex) 0x5, 0x4A
실수 리터럴
- 알파벳 E(e)가 있는 리터럴은 10진수 지수와 가수로 간주한다.
- 예: 5E7 -> 5 x $10^7$
- 예: 0.12E-5 -> 0.12 x ${10}^{-5}$
데이터 타입
- Primitive Type
값의 종류 | 기본 타입 | 메모리 사용 크기 | 저장되는 값의 범위 |
정수 | byte | 1 byte | -$2^7$~($2^7$-1) |
char | 2 byte | 0~($2^16$-1) | |
short | 2 byte | -$2^15$~($2^15$-1) | |
int | 4 byte | -$2^31$~($2^31$-1) | |
long | 8 byte | -$2^63$~($2^63$-1) | |
실수 | float | 4 byte | ±(1.4E-45)~±(3.4028235E38) |
double | 8 byte | ±(4.9E-324)~±(1.7976931348623157E308) | |
논리 | boolean | 1 byte | true, false |
타입 변환
- 자동 타입 변환: 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 '자동 타입 변환'이 발생한다.
- (강제)명시적 타입 변환
- 타입의 크기 비교:
- byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)
연산자와 연산식
- 연산자는 필요로 하는 피연산자의 수에 따라 단항, 이항, 삼항 연산자로 구분된다.
- 단항 연산자: ++x;
- 이항 연산자: x+y;
- 상항 연산자: (sum>80) ? "A" : "B";
- 연산의 방향과 우선순위
- 예: x > 0 && y <0
- &&보다는 >, <가 우선순위가 높기 때문에 양 옆의 비교 연산이 처리된 후, && 연산을 하게 된다.
- 우선순위가 같은 연산자들끼리는 왼쪽에서 오른쪽으로 연산이 진행된다.
- 대입 연산자(=, +=, ...)의 경우에는 오른쪽에서 왼쪽으로 연산이 진행된다.
- 예: a=b=c=5
- c=5 , b=c, a=b 순으로 연산이 진행된다.
- 예: int result = var1 + var2 + var3;
- 이 경우, var2+var3 연산이 진행된 후, var1을 추가로 더하게 된다.
- 그러므로 먼저 처리해야 할 연산식이 있다면 괄호()로 묶어 처리해주자.
- 예: x > 0 && y <0
반전 연산자
- 부호 연산자(+, -)
- 양수, 음수 반대로 변환
int x = -100;
int result1 = +x;
int result2 = -x;
System.out.println(result1);
// output: -100
System.out.println(result1);
// output: 100
- 논리 부정 연산자(!)
- true, false 반대로 변환
boolean play = true;
play = !play;
System.out.printLn(play);
// output: false
- 비트 반전 연산자(~)
- 2진수로 표현했을 때 비트 값 0, 1을 반대로 변환
- 예: 10(00...01010) -> ~ -> -11(11...10101)
- Note! 비트 반전 연산자 산출 타입은 int 타입이 된다.
- Note! 비트 반전 연산자의 산출 값에 1을 더하면 부호가 반대인 정수를 얻을 수 있다.
byte v1 = 10;
int v2 = -v1; // byte 타입의 변수로 받으면 컴파일 에러 발생
byte v1 = 10;
int v2 = -v1 +1;
System.out.println(v2);
// output: -10
- Integer.toBinaryString(10);
- 정수 값을 32비트의 이진 문자열로 바꿔주는 메서드
- 앞의 비트가 0이면 0은 생략되고 나머지 문자열만 리턴한다.
NaN과 Infinity 연산
int a = x/y;
int b = x%y;
- 두 경우 모두 y가 0일 경우 ArithmeticException 예외가 발생한다
- ArithmeticException이 발생해도 프로그램이 종료되지 않도록 하려면 다음과 같이 예외 처리를 해줄 수 있다.
try {
int a = x/y;
int b = x%y;
} catch(ArithmeticException e){
System.out.println("0으로 나누면 안됨");
}
- 실수 타입인 0.0 또는 0.0f로 나누면 ArithmeticException이 발생하지 않는다.
- 대신 무한대 or NaN(Not a Number) 값을 가지게 된다.
- 이 값들도 정상적인 연산이 안되기 때문에, 제대로 처리해 줘야 한다.
- 참고: Double.valueOf("NaN")하면 NaN이 됨.
5 / 0.0 -> Infinity
5 % 0.0 -> NaN
- 입력값의 NaN 검사
if(Double.isNaN(val)){
System.out.println("NaN이 입력되어 처리할 수 없음");
}
비교 연산자
- 비교 연산자에서 연산을 수행하기 전에 타입 변환을 통해 피연산자의 타입을 일치시킨다.
- char 타입
- 유니코드의 값으로 비교 연산
- 예:
- 'A' < 'B' → 65 < 66
- 'A' == 65 → true
- int, double 타입
- 둘 중 큰 타입인 double 타입으로 변환한 다음 비교한다.
- 예:
- 3 == 3.0 → true
- 0.1 == 0.1f → false
- 예:
- 부동소수점 타입은 0.1을 정확히 표현할 수가 없어서 0.1f는 0.1의 근사값으로 표현되어 0.1과 다르다고 나온다.
- 둘 중 큰 타입인 double 타입으로 변환한 다음 비교한다.
- String 타입
- String 타입의 문자열은 대소 연산자(<, >, <=, >=)를 이용해 비교할 수 없다.
- 동등 비교 연산자(==, !=)는 사용할 수 있으나 문자열이 같은지, 다른지를 비교하는 용도로는 사용되지 않는다.
- 기본 타입(byte, char, short, int, long, float, double, boolean)인 변수의 값을 비교할 때에는 == 연산자를 사용하지만 참조 타입인 String 변수를 비교할 때 == 연산자를 사용하면 잘못된 결과가 나올 수 있다.
- String 선언[String strVar1 = "신용권"]한 경우, 신용권이라는 값을 가지는 객체는 heap 영역에 저장되고, stack 영역에서 이 힙 영역에 있는 객체를 참조하는 번지 값을 가진다.
- 자바는 문자열 리터럴이 동일하다면 동일한 String 객체를 참조하도록 되어 있다.
- 하지만, new로 생성한 새로운 String 객체는 다른 번지값을 가지게 된다.
- 동일한 String 객체이건 다른 String 객체이건 상관없이 String 객체의 문자열만을 비교하고 싶다면
- equals() 메서드를 사용해야 한다.
- == 연산자는 변수에 저장된 값만 비교하기 때문에 문제가 생길 수 있기 때문이다.
- 변수에 저장된 값: 힙(heap)에 저장된 객체의 번지값
- 예:
String strVar1 = "신용권";
String strVar2 = "신용권";
String strVar3 = new String("신용권");
strVar1 == strVar2 // true
strVar2 == strVar3 // false
strVar1.equals(strVar2) // true
strVar2.equals(strVar3) // true
비트 논리 연산자
- 비트 논리 연산
- &: AND
- |: OR
- ^: XOR
- ~: NOT
- 비트 논리 연산면 그 결과는 int 타입이 된다.
출처:
- [이것이 자바다]
반응형
'Programming Language > Java' 카테고리의 다른 글
[Java] 싱글톤(Singleton)을 만들자! (0) | 2021.04.07 |
---|---|
[Java] Static field의 복잡한 초기화 작업을 위한 정적 블록(Static block) (0) | 2021.04.07 |
[Java 기초부터 다시] 4. 데이터 - 참조 타입/JVM/Enum (0) | 2021.04.07 |
[Java 기초부터 다시] 3. 조건문과 반복문 (0) | 2021.04.04 |
[Java 기초부터 다시] 1. 자바 소개 - 자바 설명 / 특징 / JVM (1) | 2021.03.24 |
Comments