현 블로그는 모바일 환경이 아닌 PC환경에 최적화 되어있습니다.

 Mir의 운영환경


2. 연산자(operator)



연산자는 프로그래밍에서 가장 기본적이면서도 중요한 요소이다.
실생활에서도 많이 쓰이기 때문에 자세한 설명보다 중요한 몇가지만 알고 빨리 넘어가자.
연산자나 제어문 같은경우는 문제를 풀면서 하는것이 더 빨리 익힌다.
보통 많이 쓰이는 사칙연산( +, -, /, %)와 비교연산(>, <)이 어디에 쓰이는지도 모른다면
수학공부부터 다시 하고 오길 추천한다.

프로그래밍에서 연산자를 사용하여 계산할때와 실생활에서 계산할때와 그렇게 많은 차이는 없다.
+를 쓰면 값을 더하는것이고 *를 쓰면 값을 곱하는거다. 하지만 완전히 똑같다면 이렇게 공부하지도 않을것이다.
그럼 프로그램에서 사용되는 연산자의 몇가지 특징을 알아보자.

우선은 연산의 우선순위에 대해 알아보자.

3 + 5 * 2

위식을 어디서부터 계산하는지 모르는 사람은 정말 수학이 아니라 산수부터 다시 배워야 할것이다.
일반 산수에서도 연산의 우선순위가 있다. 위식처럼 덧셈과 곱셈이 함께 나올때 곱셈부터 계산한뒤
덧셈을 해주는것이 우선순위에 따른 계산이다. 그 우선순위는 프로그래밍에서도 적용된다.
아래는 프로그래밍에서 사용되는 연산자를 우선순위대로 나열한것이다.


단항 연산자

++ , -- , + , - , ~ , ! , (타입)

산술 연산자

% , /  , *

+, -

<< , >> , >>>

비교 연산자

< , > , <= , >=

== , !=

논리 연산자

&

^

|

&&

||

삼항 연산자

? :

대입 연산자

= ( *= , /= , %= , += , -= , <<=

>>= , >>>= , &= , ^= , |= )


몇몇 처음보는 연산자를 제외하면 그렇게 큰 변화는 없다.
위표는 헷갈리때만 참고 하기로 하고 글로써 하나하나 설명하도록 하겠다.


제일 첫번째 단항 연산자.
단항 연산자에 있는 +와 -는 덧셈, 뺄셈이 아니라 양수, 음수를 나타내는것이다. 헷갈리지말자
(타입)은 형변환을 뜻하는것이다. (int)a + b 라는 식이 있을때 a를 먼저 int형으로
형변환 하고 난뒤 b랑 더하게 되는것이다. 이것은 아래에서 한번더 이야기 하겟다.


단항연산자에서 중요한부분++, -- 이다.

위 연산자는 증감연산자라고 불리며 a + 1을 더욱더 간단하게 하기 위해 a++ 처럼 사용하는것이다.
여기서 중요한부분이 증감연산자는 값의 앞이나 뒤 아무곳이나 붙힐수 있지만
값의 앞에 있느냐 뒤에 있으냐냐에 따라 그 뜻은 조금 달라진다.

a = ++X a = X++

위의 두 공식 모두 X에 1을 더하는것이다.
하지만 a의 값은 틀려진다.

a = ++X는 X에 1을 더하고 난뒤 a라는 이름을 가진 저장장소에 그 값을 저장시킨다는 뜻이지만

a = X++는 X를 a라는 이름을 가진 저장장소에 그 값을 저장시키고 난뒤 X에 1을 더해주어라는 뜻이다.

아래 예제를 잠시 보자. (귀찮아서 생략하고 싶지만;; 예제를 하나 들어야될꺼 같다.;;)

int i = 0; // 변수 i 저장장소에 0 넣어두었다.


i++;   // i = i + 1 이라는 뜻이다.

// i 1 더해 그것을 다시 i라는 저장공간에 넣어라는 명령이다

// 그럼 i + 1에서의 i 0 값을 가지고 있지만 +1 하여 다시 i 값을

// 넣었으니 i 저장장소에는 이제 1 들어가있다.

  

++i;  // 위와 마찬가지로 i +1 되어 이제 i 2 될것이다.

  

// 여기까지는 두식의 다른점을 찾을수가 없다.

 

int j = 0; //이제 j라는 공간을 만들어보자.

  

  j = i;   //j라는 공간안에 i 집어 넣었다.위에서 i 2이기 때문에 j = 2 될것이다.


j = ++i;  j = i++; 


/* 위의 두가지 식을 보자.

언뜻 보면 둘다 j라는 공간에 i 1 더한값을 집어 넣어라는 뜻으로 보인다.

하지만 위에서 말했듯이 증감연산자는 앞에 있느냐 뒤에 있느냐에 따라 달라진다.

빨간색 j i 1 더해서 j라는 저장공간에 값을 저장하기 때문에

j = 3, i = 3 될것이다. (i 2였다는걸 벌써 까먹으면 안된다.)

하지만 초록색 j i 먼저 j 저장하고 난뒤 1 더해주는것이다.



그래서 j = 2, i = 3 으로 저장되는것이다.

아직 헷갈리는 사람이 있으면 Java문제 계시판에서 증감연산자를 5 풀어보아라.

계속 같은문제를 푸는것이 아니라 한번 풀고 난뒤 자신이 한줄을 추가해보고 풀어보고

한줄을 삭제해보고 풀어보고 하다보면 머리속에 들어올것이다. */



증감연산자를 이렇게 길게 설명하는것은 중요하기때문이다. 반복구문에서 빠질수 없는것이 증감연산자이므로
확실하게 개념을 잡고 가지 않으면 나중에 헷갈릴수도 있다.


~는 필자의 생각에는 왜 있는지 모르는 연산자라서 설명에서 빼겟다.
나중에 왜 있는지 알게되면 다시 수정하도록 하겠으며 마지막 ! 연산자를 알아보도록 하자.
!는 부정연산자로 boolean형에게만 쓰인다.
boolean형은 true와 false 두가지 값만 가지고 있는데 boolean형 변수 앞에 !를 붙히면 true는 false로 false는 true로 변경되는것이다.
필자가 알기로는 boolean형은 연산자로 !와 =밖에 안쓰이는걸로 알고있다.
필자도 잘 쓰지 않아서 까먹을뻔 했다. 어찌됫던 이런것이 있다고 알아두기만 하자.


두번째 산술 연산자
산술연산자는 뭐 위에서 말했듯이 사칙연산의 우선순위를 모르는사람은 '산수' 공부부터 다시하고 오기 바란다.
산술연산자에서 짚고 넘어가야 될것은 % 이다.
프로그래밍에서는 나눗셈은 나누고 난뒤에 '몫'만 구할뿐 나머지를 구하지는 않는다.
int a = 5 / 3;
을 실행하면 '몫'인 1을 a에 저장할뿐 나머지인 2는 사라진다.
(int형은 정수만 저장하기때문에 소숫점 이하는 사라지는것이다.
 만약 소숫점까지 구하고 싶으면 float나 double형을 사용하면 될것이다.)
 
여기서 나오는 연산자가 % 이다. 이것은 나머지를 구하는 공식인데
int a = 5 % 3;
을 실행하면 a의 값은 2가 되는것이다.
이것을 이용하여 후에 5의 배수를 구하거나 100의 약수를 구하는 프로그래밍을 짤수 있게 된다.
( ' 5의 배수는 5로 나눌때에 나머지가 0이면 5의 배수이다. ' 즉 ' int X%5 == 0 ' 이면 5의 배수가 되는것이다.)

그리고 <<, >>, >>> 는 2진수를 왼쪽으로 옮기거나 오른쪽으로 옮기거나 하는건데.....
자세한 설명을 원하는사람은 다른곳에서 찾아보기 바란다 ; ㅁ;
혹 자세한 설명이 있는곳이면 필자에게도 알려주길 바란다. (링크라도 시켜놓으려...)
필자는 대략적인 특징만 알뿐 써보지도 못하였고 앞으로도 잘 쓰지 않을것 같다.
(게임 프로그래밍에서 많이 쓰인다고만 들었다.)


세번째순서는 비교 연산자이다.
특별히 길게 설명할것은 없다고 생각하며 단지 ' >= ' , '<=' 가 맞는 표현이며 ' => ', ' =<'
틀린 표현이라는것만 머리속에 집어넣자.
그리고 프로그래밍에서 ' 같다' 는 ' = ' 이 아니라 '==' 이다. =은 대입연산자이다. 이거 자주 헷갈리니 확실히 알아두자!
마지막으로 '다르다'를 표현할때에는 ' != ' 으로 표현한다.
비교연산자의 또다른 특성은 결과값을 boolean값으로 나타낸다는 것이다.
당연한 얘기지만 비교연산자는 true 또는 false로 결과값을 내보내기 때문이다.



네번째 순서는 논리 연산자.
논리연산자는 필자도 아직 많이 써보지는 못하였다.
&&(and) , ||(or)은 문제에서 자주 출제 할것이니 기억해두었으면 한다.
간단히 설명하고 넘어가겠다.
x &&(and) y는 x와 y가 둘다 true여지만 true값을 반환하고
x  ||(or) y 는 둘다 false이여야지만 false를 반환한다.
즉 &&는 둘다 true가 아니면 무조건 false값을 반환하게 되고
 || 은 둘다 false가 아니면 무조건 true값을 반환하게 되는것이다.
아래 예제를 보자.

public class Ex2_1 {


public static void main(String[] args) {


int x = 10;

if((x>=5 && x<=13) || ( x > 10 && x <= 12 )){

System.out.println("참.");

}else{

System.out.println("거짓");

}

}


}

자 위예제의 첫번째 &&을 보도록 하자.
양쪽으로 (x>=5) 와 (x<=3)이라는 조건식이 있다.  x는 10이기때문에 둘다 true가 된다. 
그럼 첫번째 &&(and)식은 true값을 가지게 되는것이다.
하지만 두번째 &&을 보면  (x<=12)는 true가 되지만 (x>10)은 false가 된다.
둘다 true가 아니기때문에 두번째 &&(and)값은 false값을 가지게 된다.

그리고 난뒤 ||(or)을 살펴보면 왼쪽의 &&식은 true. 오른쪽의 &&식은 false를 가지고 있다.
||(or)은 둘중하나만 true라도 true값을 가지게 되기때문에 '참'을 출력하게 되는것이다.

  
나머지 &, |, ^ 는 필자가 써볼기회가 생기면 자세히 설명하겠다.
현재까진 어디에 쓰이는지도 잘 몰라서 필자도 이런것이 있다고만 기억하지 자세한것은 기억하고 있지 않다.
( 이것도 >>, <<, >>>과 마찬가지로 2진수 자체를 바꾸는 것이다.)



다섯번째삼항 연산자
?: 인데 이거 참 설명하기 힘들다;; if구문을 배울때 자세히 설명하도록 하겠다.
솔직히 if 구문만 쓴다고 하는사람은 삼항 연산자를 안써도 되지만 제대로 쓰기만 하면 프로그램이 정말 간단해질때도 있다.
하지만 필자도 헷갈려서 아직까진 마음대로 쓰지는 못한다. 문제로써 개념을 확실하게 익혀지게 해주겠다.
(점점 설명이 짧아지는건 절대로 귀찮아서가 아니다... )



마지막으로 대입연산자 이다.
대입연산자 ' = ' 는 비교연산자 '같다'라는 뜻의 '=='과 헷갈릴때가 많다.
(필자또한 몇번이나 잘못 사용할때가 많으니 꼭 기억해두자!)
대입연산자 =의 뜻은 오른쪽의 값을 왼쪽에 있는 곳으로 저장한다 라는 뜻이다.

앞서 변수를 공부할때 변수에 값을 저장할때
a = X;
라고 표기한것을 기억할것이다. 벌써 까먹으면 안된다!
X를 a라는 이름을 가진 저장공간에 저장시킨다는 뜻이다.
즉 오른쪽에 있는 X를 a로 대입 시키는것이다.

그리고 대입연산자 다른연산자를 결합하여서 +=, -=, *= 등으로 쓰이기도 한다.
' a += 2 ; ' 는 ' a = a + 2 ; ' 라는 뜻이다. 나머지는 한번씩 프로그래밍을 해서 써보도록 하자.
필자가 하나하나 a *= 2 가 a = a*2 라고 적어놓는거 보다 한번씩 써보는게 훨씬더 잘 기억된다.
(절대로 귀찮아서가 아니다)



대충 마무리가 되는거 같다. 언제나 느끼는거지만 금방 끝날꺼 같은 설명이 하다보면 계속 길어져서 필자또한 체력이 점점 떨어진다 ;;


연산자를 우선순위순으로 하나씩 알아보았는데 이제 마지막으로
연산시 자동형변환에 대해 알아보자!
위의 산술연산자에서 말해야 됫었는데 조금은 중요한... 중요하다기보다는 모르면 오류가 나도 왜 오류가 났는지 모르는 그러한 파트라서 따로 빼놓았다.
연산시 자동형변환이란. (그냥 내가 이름을 붙힌것이다. 이름에 너무 연연하지 말자;;)

산술연산자로 연산시 연산되는 값들은 모두 같은 형태(타입)으로 자동 형변환 된다는 것이다.
그리고 자동 형변환이 될때에는 범위가 더 넓은 형태로 자동 형변환이 된다.
즉 long와 int형이 덧셈을 하게 되면 int형은 long형태로 변환이 되어 덧셈이 되어진다는 것이다.
형태(타입)에 따른 범위가 기억이 나지 않으면 1_1. 변수 챕터를 확인해 보도록 하자.
간단히 적어두면

byte, short, char < int < long < float < double 순이다.

여기서 주의할 점 하나! 산술연산자로 연산시 4byte이하의 형태의 값들은 모두 int형으로 변환이 되어 연산이 된다.
즉 byte, short, char 등은 int형으로 자동형변환이 된다는것이다.
(여기서 알수 있는게 byte가 1byte의 크기라서 메모리를 더 적게 쓰지는 않는다는것이다. 어차피 int형으로 변환해서 연산을 해야되기때문에 오히려 int형이 메모리를 더 작게 쓸수도 있다.)

아래 문제를 보자.
----------------------------------------------------------------------------------

public class Test1_3 {

public static void main(String[] args) {


byte a = 1;

byte b = 2;

byte c = a + b;

System.out.println(c);

} }
----------------------------------------------------------------------------------
이제 입이 닳도록 설명을 했기때문에 byte a = 1; 이라는 식이 무엇을 뜻하는지
더이상 적지 않겟다.(필자도 힘들다.)
위 식을 보면 a + b 는 3이 될것이다. 그것을 이제 c의 저장공간에 넣으면 되는데
문제는 위식을 그대로 프로그래밍하면 오류가 일어난다는 것이다.
이유를 한번 생각해보고 스크롤을 내려보자.




위에서 말했듯이 산술 연산시 모든 형태는 int형으로 변환을 한다.
즉 a + b는 현재 int형태로 자동 형변환을 한것이다.
형변환시 ' 범위가 큰 형태의 값을 작은 형태의 값으로 넣을때 값이 소실될수도 있다 ' 라는것을 배웠을것이다.
위식에서 a + b가 int형태로 자동형변환이 되었는데 그것을 범위가 더 작은 byte형으로 저장시킬려고 하니 JVM(자바가상머신)에서 자동으로 막아버리는 것이다.
물론 실제로 집어 넣어진다 해도 오류는 없겠지만 (어차피 3은 byte 범위 안에 들어가니)
혹시나 모를 값 소실을 막기 위해 자동적으로 막는것이다.



이제 연산자에 관한 파트가 끝이 났다. 필자도 복습용으로 만드는 것이지만..
완전한 초보자들도 대략적으로 이해가 가능하게 만들려고 하니 생각보다 시간이 많이 걸린다..;
혹시 보는사람이 있으면 댓글이라도 달아주었으면 하고
그럼 다음번 조건문에서 다시 보도록 하자.





------------------------------------------------------------------------------------
본 블로그의 글을 퍼가실때 꼬릿말, 퍼가시는곳 주소를 꼭 남겨주세요.
출처 꼭 기재해주시고요. 상업적인 용도의 이용은 절대 금합니다.
혹 프린트를 할 경우 블로그주소와 함께 프린트 해주세요.
허락을 맡지 않고 무단도용을 할경우 법적인 제제가 있을수도 있습니다.
(전 분명히 경고했습니다. 합의같은거 안합니다.)
그리고 혹 무단도용한것을 보신분은 신고해주시면 사례금 챙겨 드리겠습니다.
-----------------------------------------------------------------------------------


+ Recent posts