기본형(Primitive)과 참조형(Reference)
- 기본형(Primitive)은 변수에 직접 값을 저장한다.
- 참조형(Reference)형은 힙(Heap)이라는 메모리 영역에 실제 데이터인 객체를 저장하고, 변수에는 그 객체를 참조할 수 있는 참조값( id값 || key값)만을 저장하는 특성이 있다.
생활에서의 자료형 | 프로그래밍에서의 자료형 | 예시 | |
문자 | char | char firstAlpha='A'; | |
숫자 | 정수형 | byte, short, int, long | int age=20; long earthAge=454000000000000L; |
실수형 | float, double | float height=180.5f; double weight=80.5; |
|
논리 | boolean | boolean isPowerOn=true; | |
어떤것 | 나머지 모두 | Date today=new Date( ); String name='홍길동'; |
기본형의 크기
구분 | 1byte | 2byte | 4byte | 8byte |
논리형 | boolean | |||
문자형 | char | |||
정수형 | byte | short | int | long |
실수형 | float | double |
컴퓨터는 모든 자료를 0과 1로만 구분한다. 이 단위를 1bite라고 한다.
1bit는 8개의 byte로 구성된다.
맨 앞의 bit를 부호비트(sign bit)라고 하며, 이 비트는 양수인지, 음수인지 표시한다.
부호비트를 뺀 나머지 7개의 비트에만 값을 기록한다.
정수형 값의 표현 범위
표현의 범위는 할당될 수 있는 값의 한계를 나타낸다. 범위를 넘어가는 값은 할당할 수 없다.
byte 변수명; // -128 ~ 127
short 변수명; // -32768 ~ 32767
int 변수명; // -2,147,483,648 ~ 2,147,483,647
long 변수명; // -9223372036854775808 ~ 9,223,372,036,854,775,807
실수형 값의 표현 범위
- float는 소수점이하 9번째 자리에서 반올림해서 8자리까지 표현한다.
- double은 소수점이하 18번째 자리에서 반올림해서 17자리까지 표현다.
float 변수명; // 1.40129846432481707e-45 ~ 3.40282346638528860e+38
double 변수명; //4.94065645841246544e-324d ~ 1.79769313486231570e+308d
문자형 값의 표현 범위
정수형
- 정수형 타입의 기본형은 int이다.
- int보다 작은 타입의 변수에 할당할 경우, 자동으로 해당 타입으로 변경된다.(묵시적 형변환)
- int보다 큰 타입의 변수에 할당할 경우, 리터럴에 데이터 타입을 알려줘야한다.
long long1=10;
long long2=10_000_000_000; //int 타입으로 간주하여, 오류가 발생한다.
long long3=10_000_000_000L; //long 타입으로 인식하여 오류발생하지 않음
실수형
- 실수형 타입의 기본형 double이다.
아무 표현 없이 실수 리터럴 작성시 double 타입의 자료를 사용한것이다. - float 타입의 변수에 실수를 할당할 경우, 리터럴에 f로 데이터 타입을 알려줘야한다.
float height=180.5f;
double weight=90.5;
문자형
- char는 하나의 문자만을 표현하기 위한 자료형이다.
- 문자를 표현하기 위해서 아스키코드 또는 아스키코드의 확장판인 유니코드를 사용한다.
- 문자형을 표현할때는 작은따옴표( ' ' )를 이용해서 하나의 문자를 표현한다.
char a='a';
프로그래밍에서 문자는 사실 정수형 숫자이다. 따라서 정수처럼 연산할 수 있다.
다음 예에서 'A'라는 문자에 1을 더하면 어떻게 되는지 살펴보자
int i='A'+1;
System.out.println(i+":"+(char)i); //66:B
논리형
- true와 false 두 개의 값만을 사용할 수 있다..
//직접작성하기
boolean isRun=true;
if(isRun) {
System.out.println("달려요!");
}
//비교 연산의 결과로 얻어내기
boolean isGreater=10>2;
if(isGreater) {
System.out.println("10은 2보다 커요");
}
//논리연산의 결과로 얻어내기
boolean result=true||false;
System.out.println(result);
문자열
- 문자열은 기본자료형이 아닌 참조형 자료형.
- 문자열을 표시할때는 큰따옴표( " " )로 묶어준다.
- 문자(Char)데이터를 배열로 넣어서 다룬다.
- 어떤 타입의 자료든 문자열과 더하면 기존 문자열과 결합하여 문자열로 변한다.
- 참조형(Reference)형 힙(Heap)이라는 메모리 영역에 실제 데이터인 객체를 저장하고, 변수에는 그 객체를 참조할 수 있는 참조값( id값 || key값)만을 저장하는 특성이 있다.
//name 안에 들어 있는 참조값을 tmp1 변수에 대입하기(참조값 복사)
String tmp1=name;
String tmp2=msg;
//num 안에 들어있는 value를 tmp3 변수에 대입하기(value 복사)
int num=10;
int tmp3=num; //value 값을 복사해줌
형변환(casting)
형변환 연산자
- 형변환이란 값의 형을 다른 값으로 변환하는 것을 말한다.
- 기본형은 기본형끼리 참조형은 참조형끼리 변환 가능하다.
- 자료형이 표현할 수 있는 값의 범위에 따라 형변환 연산자의 사용여부가 결정된다.
자료형이 표현할 수 있는 값의 범위에 따라 형변환 연산자의 사용여부가 결정된다.
long l1=100;
float f1=l1; //묵시적 형변환 가능
long l2=(long)f1; //명시적 형변환 필요
long은 64bit이고 float는 32bit이다.
하지만 float에서 표현할 수 있는 값의 범위는 long 보다 훨씬 크다.
형변환의 종류
묵시적 형변환과 명시적 형변환이 있다.
- 값의 타입에 따라 명시적 형변환을 해주어야한다.
- 값의 손실이 있는 경우 명시적 형변환을 해줘야한다.
(값의 손실을 프로그래머가 책임짐) - 값의 손실이 없는 경우 묵시적 형변환이 이루어진다.
값의 손실이 없어 묵시적으로 형변환이 이루어지는 경우
byte b=10;
int i1=(int)b; //형변환 연산자를 써도 되지만
int i2=b; //생략해도 상관없다.
값의 손실이 있어 명시적으로 형변환을 해줘야하는 경우
int i1=266;
byte b1=i1; //type mismatch
byte b2=(byte) i1;
10진수 266을 2진수로 표시하면 1 0000 1010으로 총 9자리이다.
byte가 부호비트를 포함해서 총 8자리이므로 맨처음의 1을 표현할 수 없어 값의 손실이 일어난다.
이런경우는 반드시 명시적으로 형변환 연산자를 사용해줘야한다.
값의 손실을 프로그래머가 책임지는 것이다.
값의 타입에 따라 명시적 형변환을 해주어야한다
int i1=10;
byte b1=i1; // type mismatch
i1의 값이 byte에서 표현할 수 있는 작은 값이지만, b1는 byte형 변수 이므로 명시적으로 형변환을 해주어야한다.
기본형 사이의 형변환 현상
정수형 간의 형변환
- 자릿수에 다른 값의 손실만 조심하면 된다.
- 묵시적 형변환이 일어나는 경우, 자연스럽게 값이 할당된다.
- 명시적 형변환이 일어나는 경우, 자릿수가 줄어들어 값의 손실이 발생하지 않는지 주의 해야한다.
정수형과 실수형 간의 형변환
- 정수형과 실수형간의 가장 큰 차이는 소수점의 유무이다.
- 묵시적 형변환이 일어나는 경우는 정수에서 실수로의 형변환이 될때이고 이때는 소수점이 추가된다.
하지만, 소수점 자리수는 정확히 표현되지 않는다. - 명시적 형반환이 일어나는 경우는 실수에서 정수로 형변환이 될때이고, 이때는 실수부가 삭제되고 정수부는 자리수에 맞게 줄어들 수 있다.
예시) 숫자형 데이터 타입의 연산
국어와 영어 점수는 각각 95점, 100점이고, 모두 정수이기 때문에 정수형 데이터 타입 중 하나인 int 데이터 타입으로 명시해주었다.
//국어점수
int kor=95;
//영어점수
int eng=100;
평균을 구하려면 두 수의 합을 구해야하는데, 두 수의 합 또한 정수로 출력 되기 때문에 동일하게 int 데이터 타입으로 명시한다.
//두 점수의 합
int sum=kor+eng;
문제는 평균을 구할때이다.
float avg=sum/2; //97.0
위와같이 연산을 하면 소수점 자리는 나오지 않는다.
그 이유는 위에 나와 있듯이 sum/2로 정수끼리 연산을 했기 때문이다.
소수점 자리까지 정확하게 나오기 위해서는 숫자 2위에 float type의 data라고 명시해주어야한다.
float ave=sum/2f; //97.5
실수형 간의 변환
- double에서 float로 명시적 형변환이 이루어질때는 유효 자릿수에 대한 문제로 값 손실이 발생할 수 있다.
- 묵시적 형변환은 아무런 변화가 없다.
문자와 숫자의 형변환
- 타입의 크기와 상관없이 숫자는 문자로 묵시적 형변환이 이뤄지지 않는다.
(반드시 명시적 형변환 필요)
숫자가 문자로 형변환되면 실수부는 없어지고 정수부를 자릿수에 맞게 줄인 후, 유니코드에 매칭되는 문자로 표기. - 문자를 숫자로 변환하면 문자가 매칭된 정수가 앞서 설명한 규칙에 따라 형변환 된다.
논리형의 형변환
- 논리형은 다른 어떤 기본형과도 형변환이 될 수 없다.
'JAVA' 카테고리의 다른 글
연산자 Operator (0) | 2019.11.29 |
---|---|
이클립스 export / import / delete 하는 방법 (0) | 2019.11.29 |
Object 객체와 Method 사용법 Field 영역 접근 (0) | 2019.11.28 |
JAVA 설치 / Eclipse 설치 및 세팅 (0) | 2019.11.28 |
java 프로그래밍 및 실행 순서 / 클래스 구조 분석 (0) | 2019.11.28 |