7. 삼항 연산자
이는 3개의 항이 있는 연산자로 (조건항 ? 항 1 : 항 2) 로 표현이 되며, 조건항이 true 면 항 1이, false 면 항 2가 실행이 되는 연산자이다. 쉬운 연산자니까 패스.

8. 배정 대입 연산자
이 연산자는 주로 이런 식으로 표현된 연산자이다. =, *=, /=, %=, +=, -=, <<=, >>=, >>>= 등이다.
1//    class Exam05_08{
2//        public static void main(String[] args) {
3//           byte a = 10;
4//           a= a + 1;          // 에러
5//           a += 1;
6//
7//           byte b = 15;
8//           byte c = 58;
9//           b = b + c;         // 에러
10//           b += c;
11//
12//           System.out.println("B = " + b);
13//        }
14//    }
4번째 라인과 9번째 라인은 에러가 발생한다. 4번째 라인과 9번째 라인을 대신해서 작성한 라인이 5번째 라인과 10번째 라인이다.

4번째 라인과 9번째 라인은, 과거 "[JAVA를 "잡아라"] 연산자의 우선 순위(2)" 에서 설명한 것과 같이 int 형보다 작은 byte 형으로 변수를 선언하고, 계산을 시도 하였고, 이를 자바에서는 int 형으로 변환, 저장을 하려고 시도하다, int 형 변수가 없어서, 에러가 발생하는 것이다.

그렇다면, 이 배정 대입 연산자가 어디에 쓰이는지 용도가 바로 나온다. 즉, 이렇게 int 형보다 작은 자료형이라도, 그 작은 자료형으로 연산을 시도, 저장하기 위한 목적으로 사용한다고 할 수 있겠다.


p.s 위의 글들은, 김승현 강사님열혈강의 Java Programming 의 Round 5-5, 동영상 강좌에 기초한 내용입니다.
:
5. 관계 연산자
관계 연산자는 <, >, >=, <=, ==, != 같은 것들이다. 역시 몇가지는 수학공식에서 숱하게 보는 것이니 설명은 생략. 다만, 이 관계 연산자를 통해 갖게 되는 값은 항상 true 나 false 같은, 논리 값들이며, 이러한 값들이 변수에 저장이 된다.
1//    class Exam05_06 {
2//        public static void main(String[] args) {
3//           boolean a = 5 < 3;
4//           boolean b = 10 == 10;
5//
6//           System.out.println("A = " + a);
7//           System.out.println("B = " + b);
8//
9//           boolean c = a!=b;
10//           boolean d = a=!b;
11/
12//           System.out.println("C = " + c);
13//           System.out.println("D = " + d);
14//        }
15//    }
여기서는 몇가지 관계 연산자를 사용하였다.

4번째 라인
: == 이것은, 우리가 흔히 수학에서 사용하는 공식 = 와 같은 개념이다. 하지만, 자바에서의 = 는 수학공식에서의 = 와는 약간은 다른 개념이다. 자바에서의 = 는 대입 연산자로 대입의 의미가 강하며, == 는 관계 연산자로, 두 식이 같다를 의미하고 있다.

9번째 라인 ~ 13번째 라인
: 9번째 라인에서는 a!=b , 10번째 라인에서는 a=!b 가 사용되었는데, 이 둘은 다른 의미를 가지고 있다. 9번째 라인에서 a 라는 변수와 b 라는 변수가 다르다는 것을 나타내 주고 있다. 10번째 라인에서는 b 를 논리 부정 연산자인 ! 를 사용하여 먼저 변수b 를 부정한다음, 이를 a 에 대입하고, 최후로, 변수 d 에 대입하라는 이야기이다.

논리 부정 연산자가 대입 연산자보다 우선순위가 먼저이기 때문에 논리 부정 연산자가 먼저 실행이 되는 것이다. a의 값은 false 가, b의 값은 true 가, c의 값은 true가, d의 값은 false 가 저장, 출력된다.


6. 비트, 논리 연산자
비트 연산자는 비트로 변환시켜 연산하는 연산자로, &, |, ^ 등이 있고, 논리 연산자는 참, 거짓이라는 논리 값으로 연산하는 연산자로, &&, || 등이 있다..
1//    class Exam05_07 {
2//        public static boolean aaa() {               
3//           System.out.println("AAA");
4//           return false;
5//        }
6//  
7//        public static boolean bbb() {
8//           System.out.println("BBB");
8//           return true;
10//        }
11//
12//        public static void main(String[] args) {
13//           int a = 4;
14//           int b = 7;
15//
16//           System.out.println("& = " + (a & b));
17//           System.out.println("| = " + (a | b));
18//           System.out.println("^ = " + (a ^ b));
19//
20//           boolean c = 8 < 5 && 15 > 8;
21//           boolean d = 10 != 28 || 7 <= 5;
22//
23//           System.out.println("C = " + c);
24//           System.out.println("D = " + d);
25//
26//           boolean e = aaa() & bbb();    // 비트 연산자가 논리 연산자처럼 사용
27//           System.out.println("E = " + e);
28//        }
29//    }
위의 소스 코드는, 비트 연산자와 논리 연산자를 함께 설명하고 있다.


13번째 라인 ~ 18번째 라인
: & 연산은 두개의 값을 비트로 변환 시켜서, 비트끼리의 연산을 실행한다. 그래서 만약 두 비트가 모두 참이면 참을 출력한다. 비트안에서의 참은 1이고, 거짓은 0이다.
| 연산은 두개의 값이 모두 거짓이면, 거짓을 출력한다.
^ 연산은, 두 비트가 다르면, 참을 출력하고, 같으면 거짓을 출력한다.

13번째 라인과 14번째 라인에서 사용된 변수를 놓고 보자면, 다음과 같다.
0100          // 4
0111          // 7

& 연산         ☞        0100          // 둘다 참이면 참, 그외는 거짓
| 연산         ☞        0111         // 둘다 거짓이면 거짓, 그외는 참
^ 연산         ☞        0011         // 두 비트가 틀리면 참, 그외는 거짓
출력되는 값은 차례로, 4, 7, 3 이다.

20번째 라인 ~ 24번째 라인
: && 연산은 두개의 식을 비교해서, 두 식이 모두 참이면, 참을 출력한다. 반대로 || 는 두개의 식을 비교해서 두 식이 모두 거짓이면 거짓을 출력한다.

이  둘은 논리 연산자로서, 논리 단위인 true 나 false 값으로 연산한다. 이 연산자에게는 한 가지 특징이 있다. 만약 && 연산을 취한다면, 두개의 식을 비교하고, 첫 식이 거짓이라고 판단되면, 다음 식을 판단 하나, 안하나, 전체의 값은 거짓으로 결과가 나온다. || 연산 역시, 앞의 식이 참이라면, 다음 식을 검사 하나, 안하나, 전체의 식은 참이라는 결과가 나온다. 이러한 특성은, 불필요한 계산을 무시, 프로그램의 속도를 좀더 원활히 해주는 장점이 있다. 하지만 다음과 같은 단점이 생긴다.


2번째 라인 ~ 10번째 라인, 26번째 라인 ~ 27번째 라인
: 만약 26번째 라인에서 & 연산 대신, && 연산을 시켜버리면 어떻게 될까? 2번째 라인 ~ 5번째 라인의 aaa() 라는 메소드의 실행이 먼저 되고, 이 값이 false 를 반환하면서, 26번째 라인은 bbb() 라는 메소드를 무시하고, 바로 false 라는 값이 변수 e에게 저장이 된다.

이런 경우, 가끔가다, 두개의 메소드를 모두 실행시켜주는 경우가 발생한다. 하지만, && 연산이나, || 연산은, 앞의 식만을 판별해서, 뒤의 식을 무시하게 될수도 있다. 이러한 현상을 보완하고자, 앞에서 설명한 비트 연산자가, 논리 연산자처럼 사용되는 경우가 있다.

이렇게 비트 연산자가 논리 연산자처럼 사용되는 경우에는, 두개의 식을, 무조건, 모두 실행 시키고, 값을 출력해 주게 된다. 즉, 위의 경우에서는, aaa() 라는 메소드를 실행 시키고, false 를 반환받고, false 라는 값을 반환 받았음에도 불구하고, 뒤에 bbb() 라는 메소드를 실행시킨 후 true 라는 값을 반환받는다. false 와 true 를 & 으로 연산해서, false 라는 값이 변수 e에 저장이 되고, 27번째 라인에서 출력이 되게 된다.


p.s 위의 글들은, 김승현 강사님열혈강의 Java Programming 의 Round 5-4, 동영상 강좌에 기초한 내용입니다.
:
3. 산술연산자
산술연산자는 말그대로, 산술하는 연산자로, 우리가 수학에서 흔히 쓰는, +, -, /, %, * 등이 이에 해당한다.
1//    class Exam05_04 {
2//        public static void main(String[] args) {
3//           byte a = 10;
4//           byte b = 20;
5//           byte c = a + b;         // 에러
6//           short d = a + b;         // 에러
7//           int e = a + b;
8//
9//           long f = 10L;
10//           int g = 10;
11//           int h = f + g;         // 에러
12//           long i = f + g;
13//
14//           float j = 10.3f;
15//           long k = 10L;
16//           float l = j + k;
17//        }
18//    }
위 의 코드는 몇가지 산술 연산을 적용시킨 코드이다. 뎃셈이나, 뺄셈, 혹은 곱셈, 나눗셈 등의 연산을 모르는 이도, 없고, 나머지 구하는 것도 모르는 이가 없으니, 이에 대한 설명은 넘기고, 그것보다도 자료형이라는 것에서 오는 약간은 헷갈리는 몇가지가 있다.

3번째 라인 ~ 7번째 라인
: 3번째 라인과 4번째 라인은, byte 형으로 변수를 선언, 값을 저장시켰다. 그런데, byte 형으로 저장된 값을, 서로 산술연산을 시키면 어떻게 될까? 그에 대한 해답은, 5번째 라인에서 보듯이 에러가 발생하게 된다.

기본적으로 자바에서는 int 라는 자료형보다 낮은 자료형이 산술 연산을 할때는, 자동적으로 int 형으로 변환되어 연산이 되고, 따라서, 값은, int 형으로 저장이 되어야 한다. short 라는 자료형도, int 형이라는 자료형보다는, 낮은 자료형이기에, 6번째 라인도 에러가 발생하며, 이렇기에, 7번째 라인처럼, int 형의 연산값을 저장할 변수를 선언, 저장해주어야 한다.

9번째 라인 ~ 12번째 라인
: 그렇다면, 이 반대의 상황은 어떨까? int 형보다 큰 자료형과 int 형의 산술 연산은, 당연히, 큰 자료형을 따라가 연산이 되고, 그렇기에, 저장될 변수도, 큰 자료형으로 선언을 해주어야 한다. 11번째 라인은, int 형과 long형의 연산을 int형에다가 저장하려고 하니까 에러가 발생했다. 12번째 라인처럼, long 형으로 변수를 선언, 저장시켜야 한다.

14번째 라인 ~ 16번째 라인
: 실수형과 정수형의 계산도 마찬가지다. 실수형이 무조건, 정수형보다 크기때문에, 실수형과 정수형의 연산에서, 실수형으로 변수를 선언, 저장해주어야 한다. 16번째 라인이, 그렇게 한 경우이다.


4. 쉬프트 연산자
쉬프트 연산자를 비트를 이용한 연산으로, 값을 비트로 변환하여, 계산한후, 다시 값으로 변환시켜주는 과정을 지니고 있다. <<, >>, >>> 등이 있다.

1//    class Exam05_05 {
2//        public static void main(String[] args) {
3//           int i = 1 << 3;
4//           int j = 8 >> 3;
5//
6//           System.out.println("I = " + i);
7//           System.out.println("J = " + j);
8//
9//           int k = -9 >>> 3;
10//           System.out.println("K = " + k);
11//        }
12//    }

위 코드는 쉬프트 연산자를 사용한 코드이다. << 의 의미는 연산할 2진 비트를 왼쪽으로 해당 비트만큼 이동시키라는 이야기다. >> 의 의미는 오른쪽으로 이동시키라는 이야기며, >>> 역시, 오른쪽으로 이동시키라는 의미를 기본적으로 가지고 있다.

3번째 라인
: 1 바이트만으로 놓고 봤을때(실제로 위의 예제는 4바이트), 3번째 라인에서, 1에 해당하는 2진 비트는 다음과 같다.
0000 0001
이 비트를 왼쪽으로 3비트 만큼 이동시키라는 의미가 << 에 들어 있으며, 이렇게 되면 다음과 같이 비트가 변하게 된다.
0000 1XXX
이동한 후에는, 1뒤에 남은 자리가 존재하게 되는데, 이곳에다가는, 0이라는 비트를 채워주게 되고, 이렇게 되면, 다음과 같은 결과가 된다.
0000 1000
이는 결국 8이 되고, 6번째 라인에서의 출력은 8이 된다. 여기에 해당되는 공식은 다음과 같다.
연산할 값 * (2의 이동시킬 비트 수제곱)
3번째 라인을 예로 들면, 1*2의 3제곱 = 1 * 8 = 8 이 된다.

4번째 라인
: 역시 1 바이트만으로 놓고 봤을때, 8에 해당되는 2진 비트는 다음과 같다.
0000 1000
여기서 >> 에 의해, 오른쪽으로 3비트를 이동시키면, 다음과 같다.
XXX0 0001
이동한 후, 여기에서도, 남는 자리가 존재하게 되는데, 이때는 3번째 라인과는 달리, XXX 라는 자리는 원래의 수가 가지는 비트중 최상위 비트에 따라 달라지게 되어있다.
0000 1000   // 최상위 비트가 0   ☞   0000 0001 // 이런식으로 변환

1000 1000   // 최상위 비트가 1   ☞   1111 0001 // 이런식으로 최상위 비트에 따라 달라진다.
여기서 착각하지 말아야 할 부분은, 지금 예로 든 것이 1바이트 안에서 예를 든 것이지, 실제 int 형은 4바이트이므로, 실제 확인을 할때는 이 점을 고려해야 한다. 아무튼 여기서도 공식이 존재한다.
연산할 값 * (1 / 2의 이동 시킬 비트 수제곱)
4번째 라인을 예로 들면, 8 * 1 / 2의 3제곱 = 8 * 1/8 = 1 이 된다.

고로, 7번째 라인은 1이 출력된다.

9번째 라인
: 여기서 사용된 >>> 는 >> 과 마찬가지로 우측으로 비트를 이동하는 것인데, 다만 차이점은, 최상위 비트에 의해 좌우가 되없던 남은 자리의 비트가, 여기서는 그런것에 상관없이 무조건 0으로 집어넣는다.

9번째 라인은, int 형 4바이트의 음수 이므로 다음과 같이 표현이 된다.
1111 1111 1111 1111 1111 1111 1111 0111
여기서 3비트를 >>> 연산 시키면 다음과 같이 바뀌게 된다.
0001 1111 1111 1111 1111 1111 1111 1110
답은,  536870910 (ㅡ.ㅡ)이 된다. >>> 연산은 따로 공식이 존재하지 않으므로, 이런 부분이 나온다면, 계산기를 두들겨야 하...는 건가.. -0-

참고로, 이러한 쉬프트 연산자 역시, 산술 연산자처럼 int 형보다 작은 자료형으로 연산시에는 int 형으로 변환되어 연산이 되어, 저장이 되므로, 저장 역시, int 형 변수로 선언해주어야 한다.


p.s 위의 글들은, 김승현 강사님열혈강의 Java Programming 의 Round 5-3, 동영상 강좌에 기초한 내용입니다.
:
모든 프로그래밍 언어에서는 연산자라는 것이 있다. 그리고 그러한 연산자에는 우선순위로 연산을 하도록 우선순위가 매겨져 있다. 자바도 마찬가지로서, 그러한 연산 우선순위가 있는데, 그 우선순위대로 한번 짚고 넘어가 보자.

1. 최우선 연산자
class Exam05_01{
    public static void main(String[] args) {
       System.out.println("");
    }
}
위의 코드에서는 최우선 연산자 3개가 쓰였다. 두번째 줄에, (). ()안에 든 연산을 먼저 해야 된다는 것은 지나가던 개도 비웃으니, 패스, 다음으로 볼 연산자는 []. 이는 배열 연산자로, 배열 부분에서 건드릴테니, 이것도 패스. 다음은, 3번째 줄에 있는 System.out.println(""); 에서 .(마침표) 처럼 되어 있는 연산자 . 이 바로 3번째 최우선 연산자이다. 이것들은 연산시, 모든 연산자에 앞서, 제일 먼저 실행되는 연산자들이다.

2. 단항 연산자
2-(1) 논리부정연산자 및 비트 부정연산자
1//    class Exam05_02 {
2//        public static void main(String[] args) {
3//           boolean bool = false;
4//           System.out.println("A = " + bool);
5//           System.out.println("B = " + !bool);
6//
7//           boolean bool2 = 5 > 3;          // 이런 방법으로 논리형 값을 저장, 사용할 수 있다.
8//           System.out.println("C = " + bool2);
9//           System.out.println("D = " + !bool2);
10//          //   System.out.println("F = " + !5)      // 에러 부분
11//
12//           System.out.println("F = " + ~(4));
13//           System.out.println("G = " + ~(~(4));
14//        }
15//    }
위 코드에서는 논리 부정연산자(!)비트 부정연산자(~)가 쓰였다.

먼 저 3~10라인까지 살펴보면, 논리형 false 를 bool 이라는 변수에 넣어, 출력하게 만든 것이 4번째 라인이고, 그 bool 이라는 변수에다가 ! 를 넣은 것이 5번째 라인이다. 7번째 라인에서는 5 > 3 이라는 것을 이용하여, true 라는 값을 bool2 의 저장, 이용되어지고 있다.

자바에서의 !는 오직 논리 연산자를 부정하는 경우에 사용할수 있으며 10번째 라인에서 보는 것처럼, 일반 상수나 혹은 기타 다른 변수에 넣어서 사용할 경우에는 에러가 발생하게 된다.

5번째 라인에서 보는 것처럼 논리 부정 연산자는 이후에 나올 산술 연산자보다는 우선 순위가 높아, 우선 연산이 된다. 즉, bool 값을 먼저 부정해주고, 그렇다음, 문자열 "B = " 과 결함되는 것이다.

이렇듯 논리 연산자를 부정하기 때문에, false 로 저장된 것을 true 로 바꿔주거나, true 로 저장되어 있는 것을 false 로 바꿔주는 것이 ! 이다. 고로 A = false, B = true, C = true, D = false 로 출력이 된다.

12번째 라인과 13번째 라인은 비트 부정 연산자 ~ 를 설명하고 있다. 비트 부정 연산자는 연산할 값을 0과 1로 구성된 2진 비트로 바꿔준 다음, 해당 비트를 부정 해주는 것이다.

위의 12번째 라인을 보자면,

4는 1 바이트인 8비트로 표현을 해서,
0000 0100
이라는 2진 비트가 된다. 이러한 2진 비트에서, 비트 부정 연산자 ~ 이 붙게 되면, 각 비트를 부정하게 되어, 결국엔 다음과 같은 2진 비트가 된다.
1111 1011
이는 -5가 되며(최상위 비트는 부호비트) 12번째 라인의 출력은 -5가 된다. 이는 공식으로도 나타낼수가 있는데,
연산할 수 * (-1) -1
위 의 12번째 라인을 대입하면, 4 * (-1) -1 이 되고, 이는 정확히 -5가 된다. 13번째 라인도 똑같은 방식으로 하면 된다. ~를 한번 적용해서 -5가 되고, 여기서 다시한번 ~를 적용하면, (-5) * (-1) -1 이 되어 4라는 연산하기 전의 값이 출력된다. 즉, ~ 두번을 사용하면, 본래의 값으로 되돌아 오게 된다.


2-(2) 부호연산자

다음은 부호 연산자로, 이는 + / - 를 가리킨다. 이는 뒤에 나올 산술 연산자와는 다른데, 이는 단지, 숫자의 음수나 양수를 구분해주는 역할을 해줄뿐이지만, 연산 우선순위에서는 꽤나 높은데 자리하고 있다.


2-(3) 증감 전위 연산자
1//    class Exam05_03{
2//        public static void main(String[] args) {
3//           int x = 100;
4//           int y = ++x;          // 전위형
5//  
6//           System.out.println("X = " + x);
7//           System.out.println("Y = " + y);
8//
9//           int z = x++;          // 후위형
10//           System.out.println("Z = " + z);
11//        }
12//    }

위에 코드에서는 ++ 이라는 형태의 연산자가 사용되었는데, 이는 증감 전위 연산자라는 것이다. 이는 사용된 변수 자신에게 1을 증가하라는 이야기이며, 똑같이, -- 를 사용할수도 있는데, 이 연산자는, 변수 앞에 붙느냐, 뒤에 붙느냐에 따라 결과가 완전 달라진다.

앞에 붙는 경우는 전위형이라고 해서, 자기 자신에게 1을 먼저 증가(-- 일경우 감소)시킨후, 연산을 시도하게 된다. 위에서 3번째 라인과 4번째 라인을 보면, 변수 x는 자기 자신에게 1을 증가시켜 101로 만든후, 변수 y에게 101을 집어 넣게 된다. 전위형은, 대입연산자인 = 보다 우선 연산이 되어, 앞에 설명한 일이 먼저 벌어지고 나서 대입하게 된다. 그래서 6번째 라인과 7번째 라인에서 출력되는 것은 101이 된다.

뒤에 붙는 경우는 후위형이라고 해서, 일단 연산을 시도하고, 자기 자신에게 1을 증가(-- 일경우 감소)시키게 된다. 위의 9번째인에서 변수 x에 들어있는 101을 z에다가 집어넣은후, x는 1 증가하여 102가 된다. 하지만, 10번째 라인의 출력은 101이 된다. 이 후위형은, 대입 연산자인 = 보다 우선순위가 떨어져서, 대입이 먼저되고, 연산이 되는 것이다.

여기서 중요한 점은, 증감 전위 연산자로 아무리 값을 증가시켜도, 처음 초기화시켰던 자료형의 범위를 벗어나지는 않는다. 위의 경우는, int 자료형을 사용하여 총 4바이트 크기의 값을 가지며, 범위 -2,147,483,648 ~ 2,147,483,647 를 넘지 않는다. 만약, 2,147,483,647 에서 1을 더 증가시키게 되면, -2,147,483,648 이 된다. 이에 관련된 설명은, "[JAVA] 기본자료형" 의 설명을 참고한다.


2-(4) 형변환 연산자

이는 지난번 "[JAVA] Promotion 변환과 Casting 변환" 에서 살펴본 것중, Casting 변환에 해당되는 연산자를 뜻한다.


2-(5) 타입 비교 연산자

instanceof 라는 연산자로 차후 설명


p.s 위의 글들은, 김승현 강사님열혈강의 Java Programming 의 Round 5-2, 동영상 강좌에 기초한 내용입니다.
:

BLOG main image
아무거나 공부하자!!! by Young79

공지사항

카테고리

분류 전체보기 (79)
Programing (29)
English (31)
Graphic (4)
Saying on T"We"tter (15)

최근에 올라온 글

최근에 달린 댓글

글 보관함

달력

«   2024/05   »
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 29 30 31
Total :
Today : Yesterday :