[JAVA] 데이터타입과 연산자

김주현·2021년 3월 22일
1

Java

목록 보기
2/15

1. 데이터타입

1-1. 데이터의 크기

8bit(비트) : 1byte(바이트)로 이루어져 있으며, 컴퓨터에 저장되는 정보의 가장 작은 단위는 bit입니다.
컴퓨터는 0과 1로 이루어져 있으므로, 1bit는 0이나 1의 값을 가질 수 있습니다.
byte는 bit보다 8배 큰 단위입니다.

정수형

데이터 타입메모리의 크기표현가능범위
byte1byte-128~127
short2byte-32,768 ~ 32,767
int4byte-2,147,483,648~2,147,483,647
long8byte-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

실수형

데이터 타입메모리의 크기표현가능범위
float4byte±(1.40129846432481707e-45 ~ 3.40282346638528860e+38)
double8byte±(4.94065645841246544e-324d ~ 1.79769313486231570e+308d)

float와 double의 표현방식

참고1 : http://www.tcpschool.com/java/java_datatype_floatingPointNumber
참고2 :
https://m.blog.naver.com/PostView.nhn?blogId=7rlaguswns7&logNo=221349728794&proxyReferer=https:%2F%2Fwww.google.com%2F

고정소수점 방식 (fixed point)

말그대로 소수점이 고정되었다는 의미입니다.
소수부자리의 자릿수를 미리 정하여 2진수로 변환한 값을 미리 대입한 방식입니다.

고정소수점 방식은 정수부와 소수부의 자릿수가 크지 않아 표현할 수 있는 범위가 작다는 단점이 있습니다.

부동소수점 방식 (floating point)

부동, floating의 뜻은 '떠다니다,유동적이다' 라는 뜻을 가지고 있다. 이는 소수점이 고정되어 있지 않고 좌우로 움직일 수 있다는 뜻을 말한다.

부동소수점 방식은 고정소수점 방식과 다르게 다음 수식을 이용하여 매우 큰 실수까지도 표현할 수 있습니다. 대부분의 시스템에서는 부동소수점 방식으로 실수를 표현하고 있습니다.

float형 부동소수점 방식

double형 부동소수점 방식

문자

데이터 타입메모리의 크기표현가능범위
char2byte모든 유니코드 문자

char가 2바이트인 이유

출처 : https://gyugyu.tistory.com/6

c언어에서는 1byte(ASKII코드)를 가지고 있지만, 자바에서는유니코드( 2 byte 문자 체계)를 사용하므로 2 byte의 크기를 가지고 있습니다.

유니코드는 세계 각국의 언어를 통일된 방법으로 표현할 수 있게된 국제적인 코드규약이다. 동양 3국의 한글, 한자 또는 일어 등과 같은 문자는 1 byte로는 표현이 불가능하기에 2byte로 문자를 표현하는 유니코드가 만들어 졌다.

2. 형변환

형변환이란 한쪽의 데이터 타입을 다른쪽의 데이터타입으로 전환해주는 전환작업입니다.

double a=3.0F

위의 코드는 double타입의 변수를 a에 float타입의 값을 대입하고 있습니다. 이 때 3.0F의 값은 자동으로 double타입으로 형변환이 일어납니다. 이것이 가능한 이유는 double타입이 float타입보다 더 많은 수를 표현 할 수 있기 때문입니다. 타입을 변경해도 정보의 손실이 일어나지 않는 경우 자동 형 변환이 일어납니다.

반대로 아래의예제는 상수 3.0은 double형이어서, 표현범위가 좁은 float에 넣으려고 하기 때문에 오류가 발생합니다.

[예제]

float a=3.0

자동 형 변환의 원칙은 표현범위 좁은 데이터 타입에서 넓은 데이터 타입으로의 변환만 허용된다는 것입니다.

  • 자동 형 변환이 일어나는 규칙
    byte -> short,char -> int -> long -> float -> double

2-1. 명시적 형변환

자동 형 변환이 적용되지 않을 경우에는 수동으로 형 변환을 해야합니다. 이를 명시적 형변환이라고합니다. 명시적 형 변환 방법으로는 데이터값(데이터 타입)이 있습니다.

아래 예제를 실행하면 자동 형 변환이 이루어지지 않아 오류가 발생하게 됩니다.

[예제]

float a=100.0;
int b=100.0F;

아래코드로 수정하면 형 변환으로 인해 오류가 발생하지 않습니다.

[예제]

float a=(float)100.0;  //double형에서 float형으로 형변환
int b=(int)100.0F;     //float형에서 int형으로 형변환

3. 연산자

연산자(operator)는 특정한 작업을 하기 위해서 사용하는 기호를 의미합니다.

산술연산자

[예제]

//빼기, result=2
result=result-1;
System.out.println(result);
		
//곱셈, result=4
result=result*2;
System.out.println(result);

//나누기, result=2
result=result/2;
System.out.println(result);

//덧셈, result=10
result=result+8;
System.out.println(result);
		
//나머지, result=3
result=result%7;
System.out.println(result);

단항연산자

단항연산자는 하나의 항을 대상으로 연산이 이루어지는 연산자입니다.
증감연산자로 변수의 값에 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++는 다음 println으로 넘겨준 다음 값을 출력하고, ++i는 println에 넣어 값을 바로 출력합니다.

비교와 boolean

boolean은 참과 거짓을 의미하는 1byte(true/false) 데이터타입입니다.

비교연산자 종류 : ==, !=, >, >=, .equals

[예제]

	System.out.println(1==2);  //false
	System.out.println(1==1);  //true 
	System.out.println("one"=="two"); //false
	System.out.println("one"=="one"); //true

.equals는 문자열을 비교할 때 사용하는 메소드입니다.
아래 예제에서 문자와 문자를 비교할때는 '=='를 사용하지 않고, equals를 사용합니다.

[예제]

	String a="Hello world";
	String b=new String("Hello world");
	System.out.println(a==b);			//false
	System.out.println(a.equals(b));	//true

equals과 ==의 차이

equals()는 객체끼리 값을 비교할 수 있는 '메소드'입니다
==는 객체의 참조(주소)값을 비교하는 '연산자'입니다.

	String b="abcd";
	String c=new String("abcd");
	if (a==b) {
		System.out.println("a와 b는 참조값이 같다.");   
	}else {
		System.out.println("a와 b는 참조값이 다르다.");
		}
	if (a==c) {
		System.out.println("a와 c는 참조값이 같다.");   
	}else {
		System.out.println("a와 c는 참조값이 다르다."); 
		}
	if (a.equals(b)) {
		System.out.println("a와 b는 참조값이 같다.");   
	}else {
		System.out.println("a와 b는 참조값이 다르다.");
		}
	if (a.equals(c)) {
		System.out.println("a와 c는 참조값이 같다.");   
	}else {
		System.out.println("a와 c는 참조값이 다르다.");
		}
	}

결과 :
a와 b는 참조값이 같다.
a와 c는 참조값이 다르다.
a와 b는 참조값이 같다.
a와 c는 참조값이 같다.

2개의 댓글

comment-user-thumbnail
2021년 3월 22일

1) 자료형들 메모리 그림으로 표현하는 게 좋습니다. 부호와 크기 영역도 표시해서요.
2) float와 double에 한해서는 부동소수점에 대한 정보도 추가하는게 좋습니다.
3) java에서는 char를 왜 2바이트로 쓰는지 염두해 두면 좋겠습니다.
문자 표현에 ascii code를 쓴다면 1바이트겠지만, 유니코드를 쓴다면 2바이트가 맞겠지요.
4) 실수 숫자에 F를 붙이면 float형, 안붙이면 double형이란건 계속 주의해야 겠네요.
5) boolean은 1비트라는 것 염두.
6) .equals는 문자열 간 비교를 하는 것. 문자 간 비교도 되는지 확인이 필요.
7) .equals 예제에서 아래 두 줄을 추가하여, a와 b가 문자열 첫 글자에 대한 주소를 나타냄을 확인하는 것이 좋겠네요.
System.out.println(a); 0x00303320032
System.out.println(b); 0x03402340333

답글 달기
comment-user-thumbnail
2021년 4월 22일

마지막 예제에 a는 선언이 안되어있네요. 오타 수정 필요합니다.

답글 달기