연산자란 특정한 연산을 수행하기 위해 사용하는 기호로 기본적으로 숫자 데이터에서 작동된다. 연산자는 사용 목적에 따라 다양한 종류가 있는데 주로 쓰이는 것은 산술 연산자, 그리고 비교/논리 연산자가 있다. 이와 관련된 것은 자바스크립트를 정리할 때 훑어본 적이 있으니 정리는 넘어가도록 하겠다.

 

   지난 시간에 데이터 타입이 가지고 있는 용량과 사용 목적에 대해 간략히 정리했었는데, 작은 용량에서 큰 용량의 타입으로 넘어가는 것은 문제없이 형변환이 이루어진다고 했다. 이는 연산자를 활용한 변수 대입도 비슷하게 이루어지는데 만약 같은 데이터 타입끼리의 사칙연산의 결과 값을 똑같은 데이터 타입에 담게되는 것은 가능할까? 또, 다른 타입끼리의 사칙연산을 담아낼 데이터 타입은 어떤 것을 써야할까?

데이터 타입 결과 설명
byte + byte = byte
short + short = short
X 작은 범위를 지닌 타입이기 때문에 변수값에 사칙연산이 들어가게 되면 보다 윗 단계 타입에 해당 값을 저장해야 한다 (최소 int 이상)
int + int = int O int부터는 허용할 수 있는 값이 많기 때문에 제약이 없다.
int + long = long O int와 long 중 가장 용량이 큰 데이터 타입을 기준으로 정해주어야 한다. 

 

   위에서 기술하지 않은 연산자 중에 '단항 연산자'가 있다. 단항 연산자는 항이 하나일 때 쓰는 연산자로 기본적으로 단일로 쓰는 경우보다는 조건문이나 반복문 같이 특정한 상황에서만 쓰기 때문에 단독으로 쓰여지는 일은 잘 없지만 이 중에서 우선순위의 개념을 알아볼 수 있었다.

   a의 초기값은 1이다. 출력 이후 후위 증가 연산자를 통해 1의 값을 증가 시켰다. 여기서 증가 연산자가 변수 뒤에 붙었으므로 처리가 맨 마지막에 되어야 하지만 단일로 쓰였기 때문에 실행을 했을 때 눈에 띄는 변화는 없을 것이다. 출력하기 시작하면 얘기가 달라지는데 먼저 ++a로 출력했을 경우, 변수의 값을 먼저 증가시킨 후 출력문이 실행된다. 즉 출력되는 값은 3이 된다. 하지만 a++로 변수 뒤에 증가 연산자를 붙이면 이 또한 출력 값은 3이 된다. 먼저 출력한 이후에 1의 값을 증가시키기 때문이다. 그렇게 마지막에 다시 변수를 출력하면 이후에 증가된 값이 포함되어 4가 나오게 된다.

 

   연산자 중에서도 단연 많이 쓰인다고 할 수 있는 비교 연산자를 알아보자. 비교 연산자는 양변을 비교하여 맞으면 참(True) 틀리면 거짓(False)을 반환해주게 되는데 주로 조건문이나 제어식에서 많이 쓰이니 알아두도록 할 것. 기본적인 사용은 자바스크립트 때 많이 배웠으니 익숙한데 특이한 경우도 있었다.

   int 타입 변수 A에 65라는 정수를 담았고, char 타입 변수 B에는 문자와 함께 연산을 통해 값을 증가시켜주었다. 그렇게 두 변을 비교했더니 변수 A의 값은 B보다 크다 라는 항목에서 아니라는 뜻으로 false가 출력되었다. 문자임에도 알아서 형변환을 통해 두 변의 값을 비교하여 참과 거짓을 가려낸 것이다. B의 항목의 값은 무엇일까, 궁금하여 출력해보면 B에서 1의 값이 증가된 C가 출력되었고, 추가로 B에 산술을 더하자 이 때는 또 68이라는 값이 출력되었다. 알아서 연산자가 들어가면 형변환이 일어나 값을 더하거나 비교할 수 있게 된 것이다. (연산자는 숫자에서만 동작하는 것)

 

   이렇게 두 값을 비교할 수 있는 연산자의 조건을 여러개 할당하고 싶으면 어떻게 해야 할까, 그것을 가능하게 해주는 것이 논리 연산자이다. 논리 연산자는 여러가지 조건을 동시에 검사할 때 사용되며 두 항의 값이 Boolean(true or false)값이 경우에 사용할 수 있다.

   말로 풀어서 설명하면 복잡해 보여도 실제 동작되는 구조를 보면 크게 어렵지 않다. 일단 AND(&&)연산자는 두 항의 조건이 모두 true여야 true를 반환한다. OR(||)연산자는 두 항의 조건 중, 하나의 조건이라도 true가 나오면 true를 반환한다. 이를 곱셈과 덧셈으로 나누어 생각하면 그 원리는 간단하다. 기본적으로 false의 값은 0, true는 1의 값을 가지고 있다. 그렇기 때문에 AND(*)연산자는 하나라도 0이 나오게 되면 이후에 나오는 값에 아무리 1을 곱해주어도 0(false)이 출력될 수 밖에 없다. 반면에 OR(+)는 앞의 조건문에서 계속 0이 나와도 마지막 조건문에서 1이 나온다면 그 조건식은 1(true)가 될 수 있는 것이다.

(물론 순서의 차이도 있다)

 

   그 외에도 기타 연산자에 속하는 삼항 연산자를 살펴보자. 삼항연산자는 항이 세 개인 연산자인데 첫번째 항은 조건식, 그리고 이 조건식이 참과 거짓일 때 각 각 실행해야 하는 구문을 나머지 두 항에 작성하는 연산자를 말한다.

조건문 ? 실행 항목1(조건문이 참일 경우 실행) : 실행 항목2(조건문이 거짓일 경우 실행)

 

   쓰임에 따라 활용할 수 있겠지만 이것은 마치 제어문에서 배우게 될 조건문, if else와 유사한 방식이라 익숙한 느낌이었다. 이 뒤에 배운 대입 연산자 또한 자바스크립트에서의 활용을 마쳤으므로 정리를 생략하도록 하겠다.

 

   이제 위에서도 언급했던 if문을 간략하게 정리하며 후술해보도록 하겠다.

if 문 if(조건식) { 조건식이 참일 경우 실행 }
조건식이 거짓일 경우 무시
true 일 때만 출력
if-else 문 if(조건식) { 조건식이 참일 경우 실행 }
else { 조건식이 거짓일 경우 실행 }
true / false 일 때 둘 중 하나를 출력
if-else if 문 if(조건식1) { 조건식1이 참일 경우 실행 }
else if(조건식2) {
 조건식1이 거짓이며 조건식2는 참일 경우 실행
} else if(...반복){ }
else { 끝내기 }
여러가지의 경우 중
하나를 출력
중첩 if문 if(조건식1){
  if(조건식2){
    조건식1이 참이고 조건식2가 참일 경우 실행
  } else {
    조건식1이 참이나, 조건식2가 거짓일 경우 실행
  }
} else { 조건식1이 거짓일 경우 실행 }
if문의 실행 부분에
다시 if문을 중첩하여 실행 후
조건에 맞는 구문을 출력

 

   기본적으로 자바스크립트와 다른 점이 없어 사용하는데 큰 지장은 없었다.

 

   if문과 비슷하지만 다른 제어문인 switch문도 있다. switch는 if와 다르게 조건문 안에 값이 들어와야 정상적인 사용이 가능하다. 기본적인 흐름이 if-else if와 똑같기 때문에 switch문을 쓰기 보단 if문을 쓰는게 더 편리하다는 게 옥의 티다.

   값의 부분과 일치하는 case를 실행하는 식인데, 여기서 유의할 점은 case가 끝나면 꼭 break를 걸어주어야 한다는 점이다. 위와 같이 break를 쓰지 않게 되면 위의 출력은 case0에서부터 default까지 모든 구문이 출력되게 된다. 꼭 break를 달아주도록 하자. (default : else와 같은 쓰임으로 어느 곳에도 해당하지 않은 값일 경우 출력된다. break문은 쓰지 않아도 된다.)

   JS(자바 스크립트)를 끝내고 Java에 들어갔다. 기초적인 것은 대부분 자바스크립트와 비슷한 양상을 띄는데 한 번 스스로 정리해보는 시간을 가지고 앞으로 다룰 프로그램의 기본적인 생성 방법을 후술하도록 하겠다.


 

   1. 변수                       

   변수란 프로그램 처리 과정에 필요한 데이터를 담아둘 수 있는 저장공간을 말한다. 하나의 값만 저장이 가능하나 언제든 그 값이 변할 수 있다. 변수에 저장된 값은 언제든지 꺼내어 사용이 가능하다. (물론 영역 안에서 선언되어야 한다.)

변경된 값은 덮어쓰기 방식으로 기존의 값이 바뀌는 것이며 기본적으로 누적되는 형식이 아니다.

 

   2. 변수의 선언           

   선언이란 변수를 새로 생성하다, 혹은 정의하다 라는 의미와 똑같다. 말 그대로 변수를 생성해야 데이터를 담을 수 있기 때문에 먼저 선언을 해야한다. 선언을 하는 방법은 데이터를 담을 타입을 정하고 변수명을 입력하면 된다.

 

   3. 변수의 초기화       

   초기화는 선언된 변수에 처음 값을 담을 때를 말한다. 한 번 선언된 변수는 이후에도 값을 바꿀 수 있기 때문에 그런 경우에는 초기화라 하지 않는다. 초기화는 초기 값을 설정할 때만 일컫는 단어이다. 대입연산자(=)를 통해 변수에 값을 담을 수 있다.

 

   4. 변수 이름의 규칙   

   데이터를 담을 변수의 이름은 사용자가 임의로 정할 수 있는데 몇 가지 제약이 있다. 숫자로 시작해서는 안되며, 달러표기($)와 언더바(_)를 제외한 특수문자가 앞에 와서도 안된다. 숫자가 앞에 오면 안되는 이유는 문자열은 따옴표(" ")로 변수와 문자의 구분이 가능하지만 숫자는 별도의 표기가 없기 때문에 혼동될 수 있는 위험이 있기 때문. 그 외에도 변수는 대소문자를 구분하기 때문에 같은 알파벳이라도 대소문자에 따라 전혀 다른 변수가 되니 주의하자.

 

   5. 데이터 타입           

   앞서 변수를 선언하기 위해 데이터 타입을 정해야 한다 했는데, 데이터 타입이란 정수/실수/문자/논리(참과 거짓) 의 종류를 말한다. 이를 담아낼 데이터 타입을 미리 변수 앞에 표시하여 어떤 데이터 유형인지 추측이 가능하게 하는 것이다.

그리고 위의 4개의 타입인 기본 변수 외에도 '참조 변수'가 존재한다. 이는 어떤 객체가 만들어질 때 부여받는 주소를 저장하기 위해 나온 변수로 흔히 문자열을 담을 수 있는 String 또한 참조변수이다.

 

정수형 데이터

byte 1Byte 8 bit -128 ~ 127
short 2Byte 16 bit -32,768 ~ 32,767
int 4Byte 32 bit -2,147,483,648 ~ 2,147,483,647
long 8Byte 64 bit -2⁶³ ~ 2⁶³ -1

 

실수형 데이터

float 4Byte 32 bit 1.4×10⁻  ~ 3.4×10³⁸
double 8Byte 64 bit 4.9×10⁻³²⁴ ~ 1.8×10³⁰⁸

 

문자형 데이터

char 2Byte 16 bit 0 ~ 2¹⁶ -1 (유니코드 ~65535)

 

 

   6. 형변환                    

   생성 때 지정된 데이터 타입을 이후에 바꿀 수도 있는데 이를 형변환이라고 한다. 형변환의 종류에는 자동 형변환과 명시적 형변환이 있는데, 자동 형변환은 일단 기본적으로 변수가 가지고 있는 데이터 값이 변하면 안된다. 그래서 기본적인 제약이 있는데 명시적 형변환은 이를 가능토록 강제로 변환시키는 것을 말한다. 타입을 강제로 바꾸기 때문에 명시적 형변환을 사용하게 되면 변수의 값이 바뀐다는 점이 있다.

 

   데이터 타입이 수용할 수 있는 각 데이터의 크기가 다른데 당연히 데이터 크기가 큰 타입을 보다 작은 타입에 담으려고 하면 에러가 뜬다. 하지만 이럴 때 괄호를 붙여 강제로 데이터 타입을 바꾸면 처리과정을 거쳐 그 데이터 크기에 맞는 값으로 바뀌게 된다. 위와 같이 강제형변환을 한 test_1 변수의 값은 -127로 출력 될 것이다. byte가 담을 수 있는 범위의 한계를 벗어났기 때문에 다시 음수에서부터 시작되어 숫자를 세어가기 때문이다.

   반대로 데이터 타입의 크기가 작은 변수는 보다 큰 타입의 변수에 담는 것이 가능한데, 수용할 수 있는 범위가 넓어 변수에 담긴 값이 변하지 않기 때문이다.

   실수가 담긴 변수를 데이터 타입이 정수인 곳에 담으려 하자 에러가 뜬다. 이는 정수를 표현하는 곳에서 실수(소숫점)를 지원하지 않기 때문인데 이를 강제로 변환하여 출력하게 된다면 소숫점을 없앤 정수만 화면에 출력된다. 하지만 반대로 정수를 실수로 변환하는 것은 가능하다. 숫자 10과 10.0은 같은 수기 때문에 오류없이 잘 작동되는 것을 확인할 수 있다.

   이번에는 문자형에 정수를 담아보았지만 역시 되지 않았다. 하지만 반대로 문자를 정수형에 담아내자 에러 없이 잘 작동되었는데 이는 문자는 애초부터 할당되어 있는 고유의 숫자를 가지고 있기 때문이다.

 


 

+ Recent posts