'우선순위'에 해당되는 글 1건

  1. 2007.07.18 연산자의 우선 순위 (1)

모든 프로그래밍 언어에서는 연산자라는 것이 있다. 그리고 그러한 연산자에는 우선순위로 연산을 하도록 우선순위가 매겨져 있다. 자바도 마찬가지로서, 그러한 연산 우선순위가 있는데, 그 우선순위대로 한번 짚고 넘어가 보자.

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 :