본문 바로가기
Java

Java_변수와 자료형

by 유서담 2023. 10. 24.

변수

 

변수란?

  • 변수는 값을 담는 저장소다.
  • 변수는 고유한 타입을 가진다.
  • 변수는 자신의 타입과 일치하는 타입의 값만 저장할 수 있다.
  • 변수의 타입의 한 번 정해지면 변경할 수 없다.
  • 변수에 저장된 값은 프로그램이 실행되는 동안만 사용할 수 있다.
  • 변수는 고유한 이름을 가진다. 이를 식별자라고 부른다.
  • 변수의 이름은 영어대문자, 소문자, 숫자, _ 를 조합해서 정한다.
  • 변수의 이름은 반드시 문자로 시작해야 한다. 숫자로 시작할 수 없다.
  • 변수의 이름은 대소문자를 구분한다.

 

변수의 생성

  • 메모리에 지정된 타입의 값을 저장하는 저장소가 생성된다.
  • 변수를 생성할 때는 반드시 변수(저장소)의 타입을 변수명 앞에 적어야 한다.
  • 동일한 이름을 가지는 변수를 같은 블록 내에서 선언할 수 없다.
  • 변수를 생성하면, 변수에 값을 저장할 준비가 완료된 것이다.

 

 

변수의 초기화

  • 변수의 초기화는 변수 생성 후 변수에 값을 저장하는 것을 말한다.
  • 초기화 작업이 완료되면 변수(저장소)를 사용할 준비가 완료된 것이다.
  • 초기화되지 않은 변수는 수행문에서 사용할 수 없다.

 

// 변수 생성하기
int a;	// 메모리에 정수를 저장할 수 있는 공간이 확보되고, 그 저장소를
	// a라는 변수명으로 엑세스할 수 있게 되었다.
    
// 변수 초기화
a = 100;	// 변수 a에 값을 대입한다
		// 변수에 값을 대입/저장하는 것을 "변수를 초기화한다"라고 한다

 

 

자바의 기본 데이터 타입(자료형)

  • 데이터 타입은 변수가 저장할 수 있는 값의 종류를 결정한다.
  • 변수를 생성할 때는 반드시 그 변수가 저장할 수 있는 값의 종류를 지정하여야 한다.
  • 자바의 기본 데이터 타입은 정수형, 실수형, 문자형, 논리형이 있다.

 

 데이터 타입의 종류

Type Keyword Size Default Range
논리형 boolean 1 byte false true, false
정수형 byte 1 byte 0 -128 ~ 127
정수형 short 2 byte 0 -32,768 ~ 32,767
정수형 int (기본) 4 byte 0 -2,147,483,648 ~ 2,147,483,647
정수형 long 8 byte 0L -9,223,372,036,854,775,808 ~ 
9,223,372,036,854,775,807
실수형 float 4 byte 0.0F 3.4 X 10−38 ~ 3.4 X 1038 의 근사값
실수형 double (기본) 8 byte 0.0 1.7 X 10−308 ~ 1.7 X 10308 의 근사값
문자형 char 2 byte (유니코드) '\u0000' 0 ~ 65,535

 

데이터 타입의 유의사항

   - 정수형

  • 정수형 타입을 결정할 때, 사용하려는 데이터의 최소/최대 표현 범위를 고려해야 한다
  • 해당 타입이 표현할 수 있는 표현 범위를 벗어난 데이터를 저장하면 오버플로우 또는 언더플로우가 발생해 엉뚱한 값이 저장된다
    • 오버플로우 (overflow) : 해당 타입이 표현할 수 있는 '최대 표현 범위'보다 큰 수를 저장할 때 발생하는 현상
    • 언더플로우 (underflow) : 해당 타입이 표현할 수 있는 '최소 표현 범위'보다 작은 수를 저장할 때 발생하는 현상

 

  - 실수형

  • 실수형 변수에 저장된 값으로 사칙연산을 수행하면 작은 오차가 발생할 수 있다.
  • double의 범위를 초과하는 무한한 크기의 실수는 BigDecimal를 사용하면 저장/연산을 수행할 수 있다.

 

정수형

 

정수형 타입의 종류

  • byte
  • short
  • int ( default )
  • long

 

정수 자료형 타입의 변수 생성과 초기화

int num1 = 100;		// 양의 정수값을 저장한다
int num2 = -100;	// 음의 정수값을 저장한다
int num3 = 100_000_000;	// 자릿수가 표현된 정수값을 저장한다
int num4 = 0100;	// 8진법으로 표현된 정수값을 저장한다
int num5 = 0x100;	// 16진법으로 표현된 정수값을 저장한다

 

정수 자료형의 default 자료형은 int다.

대부분의 프로그램에서 정수값은 int 범위내에 속하기 때문에 특별한 경우가 아니면 정수를 저장하는 변수는 int 타입으로 생성한다.

(byte 타입은 입출력에서 바이너리 데이터를 다룰 때 사용한다. long 타입은 int 범위를 초과하는 정수값을 다룰 때 사용한다.) 

 

int 범위를 초과하는 정수값의 저장 및 출력, 연산

int num6 = 10_000_000_000;	// int의 범위를 넘어서기 때문에 out of range 라는 오류가 발생한다

long num6 = 10_000_000_000L;

정수값이 int의 범위를 초과하는 경우, long 타입의 변수에 저장해야한다.

long타입을 사용할 경우에 정수값 끝에 L이나 l을 붙여야한다.

 

// 연산결과가 int의 범위를 초과하는 경우
int num7 = 123456789;
int num8 = 123;
long num9 = num7*num8;	// -1994684137이 출력된다
long num10 = (long)num7*num8;

 

연산결과가 데이터타입의 범위를 초과하는 경우.

즉, 정수와 정수간의 연산이 int의 범위를 넘었을 경우에는 long 타입을 사용해야하고

long num9 같은 경우는 num7과 num8의 데이터 타입이 int형이다보니 int  * int 로 long타입을 표현하는 것이 아닌 int 타입의 값이 long 타입인 num9로 대입이 되기 때문에 올바른 값이 출력이 되지 않는다. 

long num10 = (long)num7 * num8; 코드처럼 형변환을 해줘야 올바른 값 출력이 가능하다

 

 

실수형 

 

실수형 타입의 종류

  • float
  • double ( default ) 

 

실수형의 default 자료형은 double이다

실수값의 대부분 double 타입의 변수로 다룬다

( float 타입의 변수를 사용하는 경우가 거의 없다 )

 

실수형 변수 생성과 초기화

double num1 = 3.14;
double num2 = 123.4;
double num3 = 1.234e2; // e2는 10의 2제곱이다.
float num4 = 3.14f;

 

실수의 기본타입이 double이기 때문에 실수값은 언제나 double타입의 값으로 생각한다.

따라서, 실수값을 float타입의 변수에 대입할 때는 이 실수값을 double이 아닌 float타입으로 생각하게 해야한다

그래서 실수끝에 F나 f를 붙인다

 

 

실수값의 연산

double num5 = 0.1;
double num6 = 0.2;
double num7 = num5 + num6;
System.out.println("num7의 값 : " + num7);	// 결과 : 0.30000000000000004

 

실수값의 연산은 프로그램에서 실수를 저장하는 방식 때문에 계산결과에 오차가 발생할 수 있다.

 

더보기

부동소숫점 방식 

 

실수를 저장하는 방식인 부동소숫점 방식

 

실수 = 부호 + 지수부 + 가수부

 

Ex)

-118.625 부동소수점 방식으로 저장하기

(float 타입 기준) 부호비트(1비트) + 지수부(8비트) + 가수부(23비트)

 

1. 음수기 때문에 최상위 부호비트는 1이다.

 

2. 절대값 118.625를 이진법으로 변환한다

    정수부를 변환

       118 ----> 1110110

        0.625 --> 101

    결과

       118.625 ---> 1110110.101

 

3. 소수점을 이동시켜서 정수부가 한자리가 되도록 조정한다.

       1110110.101 ---> 1.110110101*2^6

 

4. 지수부에 127을 더한다

        6 + 127 = 133 ---> 10000101

 

5. 부동소숫점 방식으로 저장된 -118.625

       1   10000101   1110110101000000000

    부호   지수부          가수부

 

부동소숫점 방식으로 실수를 저장하면, 0.625와 같이 이진수 소수점으로 딱 떨어지는 수는 문제가 없지만, 

0.1과 같이 0.0001100110011001100110011...로 무한반복되는 이진수 실수는 아무리 큰 수를 저장하는

부동소수점 방식이라도 메모리의 한계 때문에 어느부분에서 끊어서 반올림할 수 밖에 없다.

따라서, 컴퓨터에서 실수값을 표현할 때는 그 값과 가장 가까운 값이 저장된다. 

실수값의 계산 결과는 연산오차가 발생할 수 있다.

 

연산오차를 해결하기 위해서는

    1. 실수값을 정수형으로 변환한 다음에 계산한다.

        0.1 +0.2 = (0.1 * 10 + 0.2 * 10) / 10

    2. BigDecimal 클래스를 이용해서 계산한다.

 

문자 / 문자열 타입

 

문자 자료형

 

char

 

  • 문자 자료형 타입의 변수는 오직 한 문자만 저장할 수 있다.
  • 문자 자료형의 유니코드를 지원하기 때문에 전세계의 모든 글자를 표현할 수 있다.
  • 만약, 1글자 이상을 저장하는 경우에는 String 객체를 사용한다.
  • 대부분의 경우 문자 하나로 이루어진 값이라 하더라도 char보다는 String 타입으로 다룬다.

 

char ch1 = 'A';			// 문자값을 대입한다.
char ch2 = '가';	
char ch3 = '\uAC00';		// 유니코드(16진수)에 해당하는 문자가 대입된다.
char ch4 = '\uAC01';
char ch5 = 65;			// 십진수 65는 유니코드 41이다. 즉, 유니코드 41에 해당하는 글자가 대입된다.
char ch6 = 44032;		// 십진수 44032는 유니코드 AC00이다. 즉, '가'가 대입된다.

 

문자열 타입

 

String

 

  • 문자열은 1글자 이상의 문자를 표현하는 자료형이다.
  • 문자열은 "  " 사이에 표시한다.
  • 문자열은 1글자 이상으로 표현되기 때문에 문자열을 대상으로 다양한 작업을 수행할 필요가 있다.

예) 길이를 조회하기, 특정 문자열이 포함되어 있는지 조사하기,  특정 위치의 문자 알아내기, 특정 문자열로 시작하거나 끝나는지 알아내기,  대/소문자로 변환하기, 특정 시작위치부터 지정된 위치까지 잘라내기, 특정 문자열을 다른 문자열로 변경하기

  • 자바는 문자열을 표현하고, 문자열을 조작하는 다양한 기능을 포함하고 있는 String 클래스(설계도)를 제공한다.

 

// 문자열 타입의 값을 저장하기
String s1 = "홍길동";
String s2 = "서울특별시 은평구 신사동";
String s3 = "A";

//오류. char타입의 값을 String타입의 변수에 대입할 수 없다.
String s4 = 'A';

// 각각의 변수에 저장된 문자열을 출력
System.out.println(s1);	// 홍길동
System.out.println(s2);	// 서울특별시 은평구 신사동
System.out.println(s3);	// A

// 각각의 변수에 저장된 문자열의 길이를 출력한다
System.out.println(s1.length());	// 3
System.out.println(s2.length());	// 13
System.out.println(s3.length());	// 1

 

 

논리형 타입

 

boolean

 

  • 논리값은 true, false 2가지 값만 존재한다.
  • true와 false는 각각 참, 거짓을 표현하는 자바의 예약어다.
  • 논리값은 boolean 타입의 변수에만 대입할 수 있다
Ex)
// 논리값은 참, 거짓 2가지 상태만 존재하는 데이터를 표현할 때 사용한다.
boolean 합격여부 = true;
boolean 존재여부 = false;
boolean 배송완료여부 = true;
boolean 퇴사여부 = false;

// boolean 합격여부 = "true";	// 문자열은 boolean 타입 변수에 대입할 수 없다.

boolean b1 = true;	// true
boolean b2 = 100 < 10;	// false

 

더보기

자바의 리터럴

 

정수 리터럴 : 코드에서 정수값을 표현하는 방법


100

-100
100_000_00 <-- 자릿수가 표현된 정수값을 저장한다
01000 <-- 8진법으로 표현된 정수값을 저장한다
0x1000 <-- 16진법으로 표현된 정수값을 저장한다

 

실수 리터럴 : 코드에서 실수값을 표현하는 방법


3.16
-3.45
1.235e2 <-- e2는 10의 2제곱

 

문자 리터럴 : 코드에서 한 문자를 표현하는 방법, char 타입의 값을 표현하는 방법


'A' <--- 문자타입(char) A
'가' <--- 문자타입(char) 가

 

문자열 리터럴 : 코드에서 문자열을 표현하는 방법


"안녕하세요"
"서울특별시 은평구 신사동"
"A" <--- 문자열타입(String) A
"가" <--- 문자열타입(String) 가

'Java' 카테고리의 다른 글

Java_반복문(for문, while문)  (0) 2023.10.27
Java_조건문( if문과 switch문 )  (0) 2023.10.26
Java_타입의 형변환  (0) 2023.10.24
Java 및 Java 설치방법  (0) 2023.10.23
Eclipse(이클립스) 설치방법  (0) 2023.10.20