참조

책 p.26 ~ p.35
Operationn_02.java

증감연산자 (++, --)

  • 자신의 타입을 그대로 유지하며 증감한다.
  • 증가연산자 (++) : 피연산자의 값을 1증가시킨다.
  • 감소연산자 (--) : 피연산자의 값을 1감소시킨다.

b1++ vs. b1 = b1+1

//1. b1++
byte b1 =50;
b1++; // 자신의 타입을 그대로 유지하며 1더해짐 = 51

//2. b1 = b1+1
b1 = b1+1;
// 오류: b1+1 => byte + int => int + int
//       => int는 byte에 넣기 위해 캐스팅
b1 = (byte)(b1+1);

//결론. 값은 같지만 b1++;이 더 간단

++A vs. A++

혼자있을 때 c1++ = ++c1

char c1 = 'A'; 
c1++; // 'B' , 같지만 더 복잡한 식 c1 = (char)(c1 + 1);
System.out.println(c1); // 'B'
++c1; // 'C'

//결론. 혼자 있을 때는 둘다 같다

연산식에서 i2++ =/= ++i2

int i1 = 40;
int i2 = 50;

int i3 = i1 + ++i2; 
//51로 먼저 증가 시키고, 대입 후 계산 => 답: 91

int i3= i1 + i2++;
//50을 먼저 대입한 후, 증가됨. => 답: 90

//++이 앞에 오면: 먼저 증가 시키고, 대입 후 계산
//뒤에 ++이 오면: 먼저 대입 시키고, 계산 후 증가

예제 (p.30)

class Qu2_6{
	public static void main(String[] args){
    //1. int형 변수 number를 선언, 30의 값으로 초기화
    int number = 30;
    //2. char형 변수 ch를 선언, 'C'의 값으로 초기화
    char ch = 'C'; //67
    //3. 출력결과
    int result = number++ + 3 + ++ch + ++number;
    //number++   +  3  +  ++ch + ++number;
    //  30       +  3  +  'D'  +    32 (증가 후 대입)
    //number:31           (68)    number:32
     (대입후증가)
    
    System.out.println("number : " + number) // 결과: number : 32
    System.out.println("ch : " + ch); // 결과: ch : D
    System.out.println("result : " + result); // 결과; result : 133

부호연산자 (+, -)

  • 기본 자료형중에 boolean, char를 제외한 나머지 자료형에 사용가능

비트전환 연산자 (~)

  • 비트: 2진수, 컴퓨터는 음수를 모른다.
  • 정수형, char형에만 사용 가능.
  • char형은 오버플로우때문에 사용하는 것. 무슨소리지?
  • 피연산자를 2진수를 표현하였을 때는 0은 1로, 1은 0으로 바꾼다
  • ~(tilde)는 기존 타입을 유지하지 못함 => byte앞에 붙으면 int로 자동변환.
byte b2 = 10;
byte b3 = (byte)~b2; // ~b2가 int로 자동변환되어서 byte로 캐스팅
System.out.println(b3); // -11

//   10  00001010 
//  ~10  11110101 => 1의 보수 -11
//~10+1  11110110 => 2의 보수 -10
// 보수: 각 자리의 숫자의 합이 어느 일정한 수가 되게 하는 수

오픈튜토리얼스 추가설명

  • 비트전환연산자를 이용해 1의 보수로 변환 -> 이 값을 컴퓨터는 2의 보스로 취급하여 문자를 읽게 해줌

보수

  • 보충을 해주는 수 (10진수일때 예: 1에 대한 10의 보수=9, 4에 대한 15의 보수=11, 2에 대한 1의 보수: 1)
  • 1의 보수: 2진수의 각 자릿수가 1이 되기 위해 더해주어야되는 수
    • 1100
    • 0011 // 합하면 1111이 되니까 서로의 1의 보수
  • 2의 보수: 어떠한 수 보다 큰 2의 제곱수에서 뺀 뒤 얻은 수, 1의 보수를 취한 2진수에 추가로 1을 더함
    • 1의 보수+1 => 2의 보수
  • 컴퓨터는 정수를 2진수 32bit 형태로 저장하며 음의 정수를 '2의 보수 표현'방식으로 저장하거나 출력함.
    • 0000 0000 0000 0000 0000 0000 0000 1001 => 9
    • 1111 1111 1111 1111 1111 1111 1111 0110 => -9 (1의 보수) ~9
    • 1111 1111 1111 1111 1111 1111 1111 0111 => -9 (2의 보수) ~9+1
    • 즉 위의 32비트의 2진수를 '1의 보수로 보냐', '2의 보수로 보냐'에 따라서 값이 달라진다.
    • 0000 0000 0000 0000 0000 0000 0000 1010 => 10
    • 1111 1111 1111 1111 1111 1111 1111 0101 => -10 (1의 보수) ~10
    • 1111 1111 1111 1111 1111 1111 1111 0110 => -10 (2의 보수) ~10+1

예시

  • ~n = -n -1 (예: ~9 = -9 -1 = -10)
  • -n = ~n +1 (예: -9 = ~9 +1)

참고

https://www.opentutorials.org/module/3921/23761
와 이해가 절대안되네....

논리부정 연산자 (!)

  • boolean형에만 사용 가능.
  • true -> false, fasle -> true
boolean power = false;
System.out.println(power); // false

//power의 값을 부정하여 다시 power변수에 저장하라.
power = !power
System.out.println(power); // true
profile
갈 길이 멀다

2개의 댓글

comment-user-thumbnail
2022년 6월 11일
int result = number++ + 3 + ++ch + ++number;
//number++   +  3  +  ++ch + ++number;
//  30       +  3  +  'D'  +    32 (증가 후 대입)
//number:31           (68)    number:32
 (대입후증가)

int number = 30; 인데 ++number가 32가되는 부분이 이해가 안됩니다

조금만더 설명해주실수 있나요?

1개의 답글