Java

[Java] 자료형과 변수

인생은단짠단짠 2022. 9. 19. 16:00

 

컴퓨터에서 자료 표현하기

 

우리가 평소에 사용하는 것은 10진수입니다. 그러나 컴퓨터는 2진수를 사용합니다.

 

2진수

0과 1로만 데이터를 저장함
bit(1비트) : 컴퓨터가 표현하는 데이터의 최소 단위로 2진수 하나의 값을 저장할 수 있는 메모리의 크기
byte(바이트) : 1byte = 8bit

 

2진수, 8진수, 10진수, 16진수

 

비트로 나타낼 수 있는 수의 범위

  • 한 개의 비트로 나타낼 수 있는 수 : 0. 1 (2개) - 0~(2^1-1)까지 표현 가능
  • 두 개의 비트로 나타낼 수 있는 수 : 00, 01, 10, 11 (4개) - 0~(2^2-1)
  • 세 개의 비트로 나타낼 수 있는 수 : 000, 001, 010, 011, 100, 101, 110, 111 (8개) - 0~(2^3-1)

 

직접 실습해보기

ackage ch04;

public class BinaryTest {

	public static void main(String[] args) {
		
		int num=10;
		int bNum= 0B1010; //0B로 시작하는 숫자는 2진수다.
		int oNum=012; //0으로 시작하는 숫자는 8진수다.
		int xNum=0XA; //0X로 시작하는 숫자는 16진수다.
		
		System.out.println(num);
		System.out.println(bNum);
		System.out.println(oNum);
		System.out.println(xNum);
	}

}

결과

10
10
10
10

 

2진수, 8진수, 16진수를 표현하기 위해 각각 0B, 0, 0X를 앞에 붙여줍니다. 

위 수를 모두 System.out.println을 통해 출력하면 10진수로 나옵니다.

 

변수(Variavle)

 

프로그램에서는 게임의 레벨, 학생의 성적, 회원의 전화번호 등 항상 변하는 값을 나타낼 필요가 있습니다. 

그 때 표현하려는 수에 맞는 데이터 타입( 자료형 ) 을 이용하여 변수를 선언합니다.

표현하려는 자료가 숫자, 문자, 문자열 등 다양할 수 있으므로 그에 맞는 자료형을 사용해야 합니다.

 

변수 선언은 자료형과 변수명으로 선언합니다. 선언과 동시에 초기화 할 수 있습니다.

int age;
age=10

int level=10000;

 

변수의 이름 규칙

패키지명은 소문자로 정한다는 규칙이 있습니다. 클래스명은 앞글자가 대문자여야 한다는 규칙이 있습니다.

변수도 역시 변수명 규칙이 존재합니다.

 

  1. 변수 이름은 영문자(대문자, 소문자)나 숫자를 사용할 수도 있고, 특수문자 중에는 $와 _만 사용 (ex. count100, _master)
  2. 변수 이름의 시작은 숫자로 할 수 없음 ( ex. 27days(X), 1abc(X))
  3. 자바에서 이미 사용하고 있는 예약어는 사용할 수 없음 (while, break 등)
  4. 변수 이름은 프로그램내에서 사용되는 것이므로 그 용도에 맞고 가독성이 좋게 만드는것이 중요   ex) int numberOfStudent;

 

변수와 메모리

변수를 선언하면 해당되는 자료형의 크기 만큼 메모리가 할당 됩니다.

변수는 할당된 메모리를 가리키는 이름입니다.

 

int level = 10;

-> 4byte 정수형 메모리가 level이라는 이름으로 할당됩니다. 그 안에 10이 저장되어 있습니다. 

 

 

기본 자료형의 종류와 크기

메모리 사이즈는 정해져 있습니다. 바이트 수가 지정되어 있어야 램을 관리하기가 쉬워집니다.

 

원시 자료형은 다 stack에 저장됩니다. 

참조 자료형은 다 heap에 저장됩니다.

 

스택과 힙은 같은 공간이며 스택은 위에서 부터 쌓이고 heap은 위에서 부터 쌓입니다.

경계선을 넘어가면 오버플로우가 발생합니다. 

 

자료형 크기 비교

byte (1) < short (2) < int (4) < long (8) < float (4) < double (8) < String

 

정수 자료형

 

정수는 크게 4개의 자료형이 있습니다. 

byte= 8비트지만 부호비트 한자리를  제외하고 -2^7 ~ 2^7-1 까지 표현할 수 있습니다. short, int, long도 마찬가지 입니다.

int num = 10;

 

10이 저장되어있는 공간이 4byte짜리인 것입니다.

 

 

byte와 short

  • byte : 1바이트 단위의 자료형 동영상, 음악 파일, 실행 파일의 자료를 처리할 때 사용
  • short: 2바이트 단위의 자료형 C/C++ 언어와 호환 시 사용

int

 

  • 자바에서 사용하는 정수에 대한 기본 자료 형
  • 4바이트 단위의 자료형
  • 프로그램에서 사용하는 모든 숫자(리터럴)은 int 로 저장됨
  • 32 비트를 초과하는 숫자는 long 자료형으로 처리

 

long

 

  • 8바이트 자료형
  • 숫자의 뒤에 알파벳 L 또는 l 을 써서 long 형임을 표시 함
  • 예) int num = 12345678900; // 오류 - int로 담을 수 없는 큰 수를 선언했기 때문입니다.
    long lnum = 12345678900; //오류
    long lnumber = 12345678900L; // ok

 

 

숫자 자체가 항상 4byte로 잡힙니다. 그래서 long으로 선언했다고 하더라도  오류가 나는것입니다.

큰 숫자는 long형으로 잡으라고 L을 뒤에 붙여줘야 합니다. 

 

실수 자료형

실수를 표현할때는 부동소수점 방식을 사용합니다.

 

부동소수점 방식이란?

 

  • 실수는 정수 보다 정밀하기 때문에 정수와는 다른 방식으로 표현해야 함
  • 부동 소수점 방식으로 실수 값 0.1 표현
  • 지수부와 가수부로 표현 함
  • 컴퓨터에서는 밑수를 2로 사용
  • 정규화 : 가수가 밑수보다 작은 한 자리까지 가수로 표현 되는 것
  • 컴퓨터에서는 밑수가 2 이므로 정규화를 하게 되면 가수부분의 첫 번째 자리 숫자는 항상 1임
    예) 0.2 표현 0.4 X 2-1 정규화 하면 1.6 X 2-3

 

정규화를 통해 실수는 1.m x 2ⁿ로 표현됩니다. 

 

float형과 double형

자바에서는 실수의 기본타입은 double을 사용합니다.

 

flost와 double 예제

package ch07;

public class DoubleTest {

	public static void main(String[] args) {
		double dnum=3.14;
		float fnum=3.14f; //일반적으로 실수는 8바이트로 잡혀있음. float에 저장하고 싶을때 f를 붙여준다.
	
		System.out.println(dnum);
		System.out.println(fnum);
	}

}

결과

3.14
3.14

 

실수의 기본 타입은 double로 실수는 8바이트로 잡힙니다. 그래서 4바이트인 float에 저장하고 싶을때는 f를 붙여줘야 합니다.

 

부동 소수점 방식의 오류

지수와 가수로 나타내는 부동 소수점 방식에서는 지수부가 0을 표현할 수 없기 때문에 약간의 오차가 발생할 수 있습니다

public class DoubleTest2 {

	public static void main(String[] args) {

		double dnum = 1;
		
		for(int i = 0; i<10000; i++) {
			dnum = dnum + 0.1;
		}
		System.out.println(dnum);
	}
}

결과

1001.000000000159

 

 

문자 자료형

문자도 정수로 표현합니다.

 

  • 어떤 문자를 컴퓨터 내부에서 표현하기 위해 특정 정수 값을 정의
  • A 는 65
  • 문자세트 : 각 문자를 얼마로 표현할 것인지 코드 값을 모아둔 것을 문자세트(charater set)라 함
    (ex. ASKII, euc-kr, utf-8, utf-16)

 

 

인코딩은 문자가 숫자로 변환되는 것, 디코딩은 숫자에서 다시 문자로 변환 되는 것입니다.

A라는 문자를 컴퓨터에서는 특정한 숫자로 표현합니다.

그 숫자는 우리가 약속한 값입니다. 그 약속을 한 것들을 문자세트라고 합니다. 

ASKII code는 알파벳과 숫자 특수 문자등을 1바이트에 표현하는데 사용하는 문자세트입니다.

모든 나라의 문자들을 하나의 코드로 표준화 한것이 유니코드입니다. 

유니코드는 2byte로 표현합니다. 1byte는 아스키와 완벽하게 호환이 됩니다. 2byte를 쓸 때 다른 언어들과 호환해서 사용합니다. 

 

utf-16은모든 문자를 2byte 표현합니다.

utf-8은 1byte ~ 4byte, 유동적으로 표현합니다. 좀 더 효율적으로 사용하는 것이 utf-8방식입니다.

 

'A', "A"는 같지 않다.

'A'은 2byte짜리 문자

"A"는 문자열 - 속을 들여다 보면 A10 (문자열을 나타내는 null캐릭터가 같이 있다.)

 

 

자바에서의 문자 표현

 

  • 문자를 위한 데이터 타입 char ch = 'A';
  • 내부적으로 숫자료 표현되므로 숫자를 넣어도 문자가 출력될 수 있음
  • char ch2 = 66;
  • char에는 양수만 쓸 수 있음

 

 

char 예제

package ch08;

public class CharacterTest {

	public static void main(String[] args) {

		char ch1 = 'A';
		System.out.println(ch1);
		System.out.println((int)ch1); 
		
		char ch2=66;
		System.out.println(ch2);  //char로 인식되서 출력된다.
		System.out.println((char)ch2); //의미 없는 캐스팅
		
		int ch3=67;
		System.out.println(ch3);
		System.out.println((char)ch3);
		
		char han = '한';
		char ch = '\uD55c'; //16진수로 표현되어있다. 16진수는 숫자 하나가 4비트로 표현된다. 숫자가 4개니까 2바이트다 . 
		System.out.println(han);
		System.out.println(ch);
	}

}

한글 유니코드 표를 보고 '한'에 해당되는 유니코드를 선언했습니다. 

 

결과

A
65
B
B
67
C
한
한

 

 

정리하면 char라는 자료형은 자바에서 2바이트(유니코드)로 쓰고, 내부적으로 해당되는 코드 값에 대한 정수값을 가지고 있습니다. 

 

논리형

 

  • true(참), false(거짓) 두 가지만 나타냄
  • 1바이트를 사용 함
  • 값이 존재하는지, 배열이 비었는지, 결과가 참인지 거짓인지등을 표현

 

boolean isMarried = true;
System.out.println(isMarried);

 

자료형 없이 변수 사용 (지역변수)

 

 

  • Local variable type inference
  • 추론 가능한 변수에 대한 자료형을 선언하지 않음
  • 한번 선언하여 추론 된 변수는 다른 타입의 값을 대입 할 수 없음
  • 지역 변수만 사용 가능
package ch09;

public class LocalVariableInter {

	public static void main(String[] args) {
		
		var i = 10;
		var j = 10.0;
		var str = "test";
		
		System.out.println(i);
		System.out.println(j);
		System.out.println(str);
		
		var str2= str;
		System.out.println(str2);
		
		str="hello";  //가능
		//str=3; 불가능
	}

}

 

결과

10
10.0
test
test

str=3이 불가능 한 이유는 이미 string으로 형이 정해졌기 때문입니다.

 

 

변하지 않는 수

 

변하지 않는 수는 상수라고 합니다.

 

상수

 

  • 상수는 변하지 않는 수
  • 원주률 3.14, 1년 12개월 등
  • final 예약어를 사용하여 선언
  • 상수를 사용하면 변하지 않는 값을 반복하여 사용할 때 의미있는 문자로 인식하기 쉽고
    혹, 변하더라도 선언한 부분만 변경하면 되므로 여러부분을 수정할 필요가 없음

 

package ch10;

public class ContantTest {
	public static void main(String[] args) {
		
		final int MAX_NUM=100;
		final int MIN_NUM;
		
		MIN_NUM=0; //사용하기 전에 반드시 값을 지정해야 한다.
		System.out.println(MAX_NUM);
		System.out.println(MIN_NUM);
		
		
	}
}

 

 

리터럴

 

  • 프로그램에서 사용하는 숫자, 문자, 논리값을 뜻함
  • 리터럴은 상수 풀(constant pool)에 있음
  • 정수 리터럴은 int 로 실수 리터럴은 double 로 저장됨
    정수의 범위가 넘어가는 경우는 L,l을 float로 사용하려는 경우는 F,f 식별자를 써줘야 함

 

 

 

형 변환 (Type Conversion)

 

 

  • 서로 다른 자료형 간에 연산등의 수행을 위해 하나의 자료형으로 통일하는 것
  • 묵시적 형 변환(explicit type conversion, 자동 형 변환)과 명시적 형 변환(implicit type conversion, 강제 형 변환)이 있음
  • 바이트 크기가 작은 자료형에서 큰 자료형으로 형 변환은 자동으로 이루어 짐
  • 덜 정밀한 자료형(정수)에서 더 정밀한 자료형(실수)으로의 형 변환은 자동으로 이루어 짐
  • 반대의 경우는 직접 타입 캐스팅을 해줘야 하고, 값 손실이 발생합니다. 

 

타입 캐스팅은 큰 것을 작은 곳에 넣기 위한 것으로 그 대신 손실이 반드시 발생합니다.

앞에 캐스팅 하기 위한 자료형을 괄호호 붙여줍니다. 

 

작은 것을 큰 곳에 넣을 때는 자동으로 들어갑니다. (promotion이라고 합니다.)

 

 

 

 

형 변환 예제

package ch10;

public class TypeConversion {

	public static void main(String[] args) {

		double dNum = 1.2;
		float fNum = 0.9F;
		
		int iNum1 = (int)dNum + (int)fNum;
		int iNum2 = (int)(dNum + fNum);
		
		System.out.println(iNum1);
		System.out.println(iNum2);
	}

}

결과

1
2

iNum1은 1+0 이기 때문에 1이 나오고, iNum2는 2.1을 int한 것이기 때문에 2입니다.

'Java' 카테고리의 다른 글

[Java] 참조 자료형 변수  (0) 2022.09.21
[Java] 객체 구현  (0) 2022.09.21
[Java] 제어문  (0) 2022.09.20
[Java] 자바의 연산자들  (0) 2022.09.19
[Java] 자바프로그래밍이란  (0) 2022.09.19