관리 메뉴

너와 나의 스토리

[Java 기초부터 다시] 2. 변수 / 연산자와 연산식 본문

Programming Language/Java

[Java 기초부터 다시] 2. 변수 / 연산자와 연산식

노는게제일좋아! 2021. 3. 24. 17:38
반응형

변수란?

  • 변수는 하나의 값을 저장할 수 있는 메모리 공간의 의미한다.

 

변수값 저장

  • 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을 추가로 더하게 된다.
      • 그러므로 먼저 처리해야 할 연산식이 있다면 괄호()로 묶어 처리해주자.

 

반전 연산자

  • 부호 연산자(+, -)
    • 양수, 음수 반대로 변환
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과 다르다고 나온다.
  • 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 타입이 된다.

 

 

출처:

- [이것이 자바다]

반응형
Comments