1. 형 변환(形变换)
형 변환(Type Conversion)이란, 문자 그대로 데이터의 타입을 변경하는 것이다. 가령 int타입의 정수를 long타입의 수로 바꾸어주는 것들을 의미한다.
앞선 장에서, 변수를 선언하거나 데이터를 사용하려면, 그 데이터의 타입에 알맞게 선언하고 사용하고 연산하여야 한다고 내용을 정리하였다.
이 때, 특정한 이유로서 데이터의 타입을 변경해야하는 경우가 발생할 수 있는데 그것을 형 변환 이라고 한다. 자바에서는 이러한 형 변환을 자동으로 처리해주는 기능이 있는데 이것을 자동(암시적)형 변환(Implicit Conversion) 이라고 일컫는다.
1-1) 자동 형 변환
double a = 3.0F;
이전 장에서 학습한 내용만으로 상기 예제의 컴파일 여부를 묻는다면 당연히 오류가 난다고 답할 것이다. 그러나 결과는 의외로 오류가 나지 않는다. - 변수의 double타입과 상수의 float 타입이 다르지만 - 어째서 오류가 발생하지 않는 것인가?
float 형 타입보다 double 형 타입이 표현 가능한 수의 범위가 넓은 것은 이미 알고있는 사실이다. 바로 그 점 때문에 오류가 발생하지 않은것이다. 자바에서 컴파일을 할때, 컴파일러는 변수 a의 타입이 상수의 타입보다 더 큰 수를 표현할 수 있다면, 그에 맞추어 자동으로 형 변환(암시적 형변환)을 실행하기 때문에 오류가 발생하지 않는 것이다.
즉 , 코드를 구성하는 자가 의도적으로 3.0을 float타입으로 double 타입인 a에 할당하였어도, type missmatch(형 불일치) 오류를 피하기 위하여 자동적으로 자료형을 변환하여 할당한다는 의미이다.
그렇다면 반대의 경우는 어떠할까?
float a = 3.0;
상기와 같이 상수에 어떠한 표시도 하지 않으면 기본 타입(Default Type)인 double인 채로 컴파일이 진행된다. 그렇게 된다면 우리가 기존에 알고 있던 바와 같이 오류가 발생하게 되는 것이다.
그 이유는 double은 float의 범위를 포함하고 있지만 float은 double보다 표현가능한 범위가 좁기 때문에 포함할수 없어 형 변환을 할 수 없고 여기에서 오류가 발생하기 때문이다.
즉, 자동 형 변환의 원칙은 표현범위가 좁은 데이터 타입에서 넓은 데이터 타입으로의 변환만 허용된다는 것이다. 데이터의 포함도는 다음과 같다.
byte -> short -> int -> long -> float -> double
char
이러한 내용을 적용하여 다른 형식의 데이터들을 연산할 수 있다.
int a = 3;
float b = 1.0F;
double c = a + b // 4.0
int 3은 float이 될수 있으므로 float 3.0과 float 1.0이 합쳐지게 된다. 그 후 더 많은 데이터를 포함할 수 있는 double형 타입인 c변수에 그 둘을 합산한 뒤 할당하면 c에는 double 4.0 이 할당되게 되는 것이다. 본 예제에는 형 변환을 명시적으로 하지 않았기 때문에 암시적으로 형 변환이 이루어져 합산이 이루어졌다.
1-2) 명시적 형 변환
그렇다면 double에서 float으로, float에서 int와 같은 형 변환은 아예 불가능한 것일까, 프로그램을 구성하다보면 이러한 상황은 분명 발생할 수 있다. 이때 명시적 형 변환을 해주면 충분히 형 변환을 할 수 있다. 해당 타입의 변수에 값을 변환해서 할당하는 식인데 다음과 같다.
float a = 100.0; // 상수는 double 이고 변수는 float이기 때문에 오류가 발생한다
int b = 100.0F; // 상수는 float이고 변수는 int이기 때문에 오류가 발생한다.
float a = (float)100.0; // 상수의 데이터 형식을 명시적으로 float으로 선언하였기 때문에 오류가 발생하지 않는다.
int b = (int)100.0F; // 상수의 데이터 형식을 명시적으로 int로 선언하였기 때문에 오류가 발생하지 않는다.
상기와 같이 변수와 상수의 형을 다르게 할당하고 싶다면, 하기와 같이 명시적으로 할당하고자 하는 값의 형을 선언하면 문제를 해결할 수 있게 된다.
(데이터 타입) 데이터 값
그러나 이렇게 명시적으로 형변환을 할 경우에는 주의해야할 점이 있다. 만일 100.124241 와 같이 소수점 이하에 어떠한 데이터가 존재할 경우, 명시적으로 int로 형 변환을 한다면, 정수 이하의 부분(소수점 이하의 값)은 소실되게 된다. 따라서 명시적으로 형 변환을 할 경우에는 이러한 점을 유념하고 실행해야 할 것이다.
2. 연산자
연산자(Operator)란 특정한 작업을 하기 위하여 사용하는 기호를 의미한다. 행하고자 하는 작업에 따라 대입연산자, 산술연산자, 비교연산자, 논리연산자 등이 존재한다. 본 장에서는 해당 내용에 대한 학습을 진행하였다.
1-1) 산술 연산자
컴퓨터는 본래 계산을 목적으로 제작이 된 것이다. 따라서 산술과 관련된 연산자는 모든 언어에 공통적으로 존재한다. 하기의 내용은 자바에서의 기본적 사칙연산의 산술연산자(Arifhmetic)에 대한 내용이다.
+ | 더하기 |
- | 빼기 |
* | 곱하기 |
/ | 나누기 |
% | 나머지 |
산술 연산자는 숫자자료형에 대한 연산을 할 때 사용할 수 있지만, 문자열에도 부분적으로 사용 할 수 있다. 더하기 연산자가 그에 해당하는데, 문자열과 문자열을 더하는것이 가능한 것이다.
class main {
public static void main(String[] args){
String StringOne = "이것은";
String StringTwo = " 문자열의 합입니다.";
String result = StringOne + StringTwo;
System.out.println(result); // 이것은 문자열의 합입니다.
}
}
상기의 코드와 같이, 문자열과 문자열을 합치면 두개의 문자열이 하나의 변수에 합쳐질 수 있는 것을 확인할 수 있다. 그렇다면 서로 다른 자료형의 대한 연산은 어떤식으로 처리되는가?
가령 10을 3으로 나눈다면, 몫이 3.3333.. 으로 실수가 나오게 된다. 그렇다면 정수형 변수에 정수 10과 정수 3을 나눈다면 어떠한 값이 할당되고, 실수 10.0과 정수 3을 나눈다면 어떠한 값이 나오게 되는가에 대한 답은 무엇인가
int a = 10;
int b = 3;
float c = 10.0F;
float d = 3.0F;
System.out.println(a/b); // 3
System.out.println(c/d); // 3.333..
System.out.println(a/d); // 3.333...
상기의 코드블럭과 같은 결과를 갖게 된다. 정수형 변수끼리 나눗셈을 하여 실수형 값이 답으로 나온다 하더라도, 나눗셈을 한 두 수 모두 정수형 데이터기 때문에, 소수점 이하의 부분은 소실되게 된다. 그러나 두 수 모두 실수형으로 계산하거나 둘 중 한 수라도 실수형 데이터로 계산하게 된다면, 데이터의 소실 없이 더 많은 데이터를 표현할 수 있는 형식으로 암시적 변환이 일어나 계산되어 값이 나오는 구조로 구성되어있다.
1-2) 단항 연산자
여태까지 학습한 연산자는 이항연산자(二顶演算子, infix operator)이다. 이항연산자는 항이 두개인 것을 연산할 때 사용하는 연산자 이기 때문에 이항연산자 라고 부르는 것이다. 1 + 3은 1과 3 두개의 수를 연산하기 때문에 이항연산자가 되는 것이다.
그에 반해 단항연산자(单顶演算子)는 연산하고자 하는 항이 한개인 연산자를 의미한다. -1과 +3과 같이 음수와 양수를 표현하거나 하는 것을 단항연산자라고 일컫는데, 자바에서의 단항연산자는 다음과 같은 것들이 있다.
+ | 양수 표현 |
- | 음수 표현 |
++ | 증가 연산자, 값을 1씩 증가시킨다 |
-- | 감소 연산자, 값을 1씩 감소시킨다. |
int i = 3;
i++;
System.out.println(i); // 4
++i; // 증가연산자
System.out.println(i); // 5
System.out.println(++i); // 6
System.out.println(i++); // 6
System.out.println(i); // 7
상기 코드블럭과 같이 i에 3을 할당하고 증가연산자를 사용한뒤 그 값을 출력한다면 i는 4가 되어있을 것이다. 증가연산자는 1을 더한 후 다시 그 변수에 값을 할당한다. 단항연산자는 연산자를 값에 전/후 어디에나 표기해도 같은 값을 할당한다.
3. 비교와 Boolean
1-1) Boolean
불린(Boolean)은 참(True)과 거짓(False)를 의미하는 데이터 타입(Data Type)이다. Bool이라고 불리기도 한다. 불린은 정수나 문자 같이 하나의 데이터 타입인데 0과 1로 대체되어 사용될 수 있는 언어도 존재한다.
1-2) 비교 연산자 ( 관계 연산자 )
프로그래밍에서 비교란 주어진 값들의 일치여부 혹은 대소구분을 의미한다. 일치여부 혹은 대소구분을 하고자 할 때 행하고 있는 것의 대한 판단의 결과는 boolean으로 나타난다. 즉, 옳으면 true, 옳지 않으면 false를 나타내는 것이다.
i ) == ( 동등비교연산자 )
현실의 수학에서의 같다 라는 의미의 기호는 등호( = )이다. 그러나 이전 내용에서 =는 대입연산자로서 사용하는 것으로 이미 학습한 적이 있다. 수학에서의 등호가 이미 대입연산자로 사용이되고 있기 때문에, 동등하다 라는 의미를 나타낼 수 있는 기호를 구현할 필요가 있었고, 그것이 " == " 가 된것이다.
동등비교연산자는 양 항의 값으 같을 때 참(True)를 리턴하고, 같지 않으면 거짓(False)을 리턴한다. 비교연산자는 숫자 뿐만 아니라 문자의 비교에서도 사용할 수 있다.
public static void main(String[] args) {
System.out.println(1==2); //false
System.out.println(1==1); //true
System.out.println("one"=="two"); //false
System.out.println("one"=="one"); //true
}
ii ) !=
자바의 비교연산자에 !는 부정(not)을 의미한다. 앞서 ==는 동등한 관계에 사용한다고 하였는데, 앞에 부정으로서 !가 있고 그뒤에 (=)=가 온 것이므로, !=는 같지 않다라는 의미가 된다.
현실의 수학에서 (≠)와 상등하는 의미로 사용된다.
public static void main(String[] args) {
System.out.println(1==2); //false
System.out.println(1==1); //true
System.out.println("one"=="two"); //false
System.out.println("one"=="one"); //true
}
iii ) < , >
해당 기호는 현실의 수학에서의 부등호와 상등하는 의미로 사용된다. 각 항의 값이 같지 않을 때, 어느 쪽 항이 더 큰것인가에 대하여 구별하기 위하여 사용되는 기호이다. 조건이 옳을땐 참(True) 옳지 않을때는 거짓(False)를 리턴한다.
public static void main(String[] args) {
System.out.println(10>20); //false
System.out.println(10>2); //true
System.out.println(10>10); //false
}
iv ) >= , <=
해당 기호 역시 현실에서의 수학에서 ( ≧ , ≦ ) 와 상등한 맥락으로 사용된다. 각 항의 값이 같거나 다를때 각 항의 값들의 상태에대해 설명할 때 사용한다. 역시 옳으면 True, 옳지 않으면 false를 리턴한다.
public static void main(String[] args) {
System.out.println(10 >= 20); // false
System.out.println(10 >= 2); // true
System.out.println(10 >= 10); // true
}
v ) .equals
문자열과 문자열을 비교할 때 같은지 같지 않은지에 대하여 비교할 때 사용한다. equals는 일종의 메소드인데, 동등연사자와 같은 기능을 갖고, 문자열을 비교할 때 사용한다고 생각하면 된다.
'Language > Java' 카테고리의 다른 글
공부내용 정리 Java :: 기초 IV (0) | 2021.06.14 |
---|---|
공부내용 정리 Java :: 기초 III (0) | 2021.06.14 |
공부내용 정리 Java :: 기초I (0) | 2021.06.11 |
공부내용 정리 Java :: 입문III (0) | 2021.05.06 |
공부내용 정리 Java :: 입문II (0) | 2021.05.06 |