java/java

[java] 3. 자료형(DataType)

jeri 2024. 4. 10. 09:14
반응형
basic > DataTypeApp.java

1. 자료형(DataType) 이란?

  • 값이나 특정 대상을 표현하기 위한 키워드 또는 식별자
  • 값이나 특정 대상을 저장하기 위한 변수 생성을 위해 사용

 

 

2. 자료형(DataType)의 종류

 

1) 원시형(PrimitiveType)

을 표현하기 위한 자료형 - 키워드

  • 숫자형(NumericType) : 산술 연산 가능
    • 정수타입 (정수형리터럴, integerType)
    • 문자타입 (문자리터럴, CharacterType)
    • 실수타입 (실수형리터럴, doubleType)
  • 논리형(논리타입, 논리형리터럴, booleanType) : 산술 연산 불가능
  • 원시형으로 생성된 변수 (일반변수/기본변수) : 실제 값을 저장하기 위한 변수
int num = 10;

 

2) 참조형(ReferenceType)

특정 대상을 표현하기 위한 자료형 - 식별자 (class)

  • String 클래스 : 문자열을 표현하기 위한 자료형(클래스)
  • 이 외 매우 많음 ex) 자동차 : car클래스
  • 배열( Array )
  • 클래스( Class )
  • 인터페이스( Interface )
  • 열거형( Enum )
  • 참조형으로 생성된 변수 (참조변수) : 특정 대상의 메모리 주소값(메모리번지, hash code)을 저장하기 위한 변수
    • 메모리 : 값을 저장하기 위한 공간 , 메모리주소 : 값을 저장하기 위한 고유의 주소
String name = "홍길동";

//heap영역에 String객체가 만들어지고, "홍길동" String 저장
//name 참조변수를 통해 객체에 접근 가능

참조변수의 특징

  • 힙 영역(Heap Area)에 생성된 배열 또는 객체의 메모리 주소를 저장함
  • 메모리 주소로 배열 또는 객체에 접근함
  • 비교연산자를 사용할 경우 메모리 주소 비교함
  • 참조변수는 비교연산자를 권장하지 않음 ( == , !== )
  • 참조변수에 배열 또는 객체를 저장하지 않을 경우 기본값으로 null을 저장할 수 있음
//null : 존재하지 않는 값을 표현하는 키워드 - nullPointException
int[] arr = null; //ok

 

💡 참조변수는 직접적인 접근이 아닌 메모리 번지를 참조하는것이다.
그렇다면 굳이 왜 참조하는 것일까?

그 이유는 참조변수가 생성되는 스택영역은 생각보다 메모리공간이 작아서 아주 많은 값을 저장할 수 없기 때문이다.
이에 반해 힙영역은 메모리공간이 커서 많은 값을 저장할 수 있다.
따라서 힙메모리를 이용하여 저장한다.
하지만 힙메모리는 스택영역스태틱영역에 비해 이름 설정이 불가능이다.

그래서 메모리 주소로 접근하여 힙에 참조변수가 가리키는 배열 및 객체를 저장한다.

 

 

 

 

 

 

3. 컴퓨터가 사용하는 데이타 단위

1) 컴퓨터에서 값을 표현하는 단위

  • Bit (0 또는 1만 저장됨)
  • 1Bit = 1Byte (8Bit) = Character(문자)(영문자)

 

2) 컴퓨터에서 값을 저장하는 단위

Byte (기본 단위)

  • 1Byte = 영문자를 기준으로 원칙적으로 문자 한개를 저장하려고 만든 것!!
  • 1024Byte = 1KByte
  • 1024KByte = 1MByte
  • 1024MByte = 1GByte
  • 1024GByte = 1TByte
  • ex. 32GByte = (32*1024*1024*1024)Byte
  • ex. 1TByte = (1024*1024*1024*1024)Byte

단위 표현

  • Bit > Byte (문자) > Word (문자열) > Field (열, Column) > Record (필드의 모임, = 행, Row) > Table (레코드의모임) > DB (테이블의모임)
    • 워드 : 홍길동 , 서울시 , 강남구 , 역삼동 → 하나씩
    • 필드 : 서울시 강남구 역삼동 → 열로 쌓기
    • 실제적으로 원하는 값을 표현할 때는 필드를 사용

 

3) 프로그램이 처리가능한 데이타 단위의 범위

3-1) 프로그램 언어로 처리할 수 있는 범위

  • Bit > Byte (문자) > Word (문자열) > Field (열, Column) > Record (필드의 모임, = 행, Row)
    • 기본자료형이 처리할 수 있는 범위
      • Bit > Byte (문자) > Word (문자열) > Field (열, Column)
    • 참조자료형(클래스)이 처리할 수 있는 범위
      • Bit > Byte (문자) > Word (문자열) > Field (열, Column) > Record (필드의 모임, = 행, Row)

3-2) SQL이 처리할 수 있는 범위

  • Word (문자열) > Field (열, Column) > Record (필드의 모임, = 행, Row) > Table (레코드의모임) > DB (테이블의모임)

3-3) 중복 범위

  • Word (문자열) > Field (열, Column) > Record (필드의 모임, = 행, Row)

 

4) 프로그램이 데이타를 저장하는 법

  • 물리적 저장 : Bit와 Byte 두개뿐
  • 논리적 저장 : Word부터는 실제 논리적인 저장의 단위임 (값들을 표현할 수 있도록 만들어진 개념들)

 

5) 프로그램에서 데이타를 처리하는 법

  • 프로그램은 데이타를 행단위로 처리함 → Record
  • 행에 있는 열을 가져다가 사용함 → Field

 

6) 번외!! 인터넷의 속도

1Gbps bit Per Second

  • 초당 전송되는 bit 수 , 1초당 1기가비트를 전송하는 것

1Gcps character Per Second

  • 초당 전송되는 bite(=Character) 수
  • 100Mbps - cheap
  • 1Gbps - expensive (요즘 인터넷속도)
  • 10Gbps - expensive

 

 

4. 자바에서 사용한 값(데이타)을 컴퓨터에 저장하는 법

  • 1Byte = 8bit 을 이용해서 숫자를 컴퓨터에 저장하자!!!!
  • 50 저장하기
    • 컴퓨터가 1Byte로 이해하는 50이라는 숫자는??
    • 1Byte = 8bit = 110010 (2진수) = 50 (10진수)
  • 50 = 32 + 16 + 2
    • 실질적으로는 앞에 양수라는 표현의 0 붙음 (signbit) 그래서~
    • 00110010(2진수) = 50(10진수)

    128 64 32 16 8 4 2 1
    0 0 1 1 0 0 1 0
  • 50 저장하기
    • 50(10진수) = 110010(2진수) 아님
    • 00110010 에서
    • 11001101 로 변경 후
    • +1 해주면?
    • 11001110 (=> 보수처리하였다! 라고 표현)
    • 50(10진수) = 11001110(2진수) 이게맞음
    • 음수는 양수를 2의 보수화 처리해서 만드는 것
  • 자바에서는??
    • 4Byte 저장공간이기때문에 50저장할 때
    • 자바에서 (50)을 표현하면 00000000 00000000 00000000 00110010
    • 자바에서 (-50)을 표현하면 11111111 11111111 11111111 11001110

 

 

 

5. 자바의 자료형

1). 정수형 - byte, short, int, long

  • 정수형(IntegerType) 리터럴 : 소숫점이 없는 숫자값
  • Java의 정수형 리터럴은 기본적으로 4Byte(Interger)로 표현
  • int : 2147483648(-약21억) ~ 2147483647(약21억)
  • 자바에서는 범위를 벗어난 정수는 없음
  • println() 메소드는 무조건 10진수의 정수값으로 변환하여 출력 처리

 

🍿진수로 표현하는 법

System.out.println("정수값(10진수 100) = "+100);//숫자값 >> 10진수 정수값을 표현한 리터럴
//정수값(10진수 100) = 100

System.out.println("정수값(8진수 100) = "+0100);//0숫자값 >> 8진수 정수값을 표현한 리터럴
//정수값(8진수 100) = 64

System.out.println("정수값(16진수 100) = "+0x100);//0x숫자값 >> 16진수 정수값을 표현한 리터럴
//정수값(16진수 100) = 256

System.out.println("정수값(10진수 100) = "+100L);//숫자값L >> 8Byte(Long)의 정수값을 표현한 리터럴
//정수값(10진수 100) = 100

 

 

🍿int(4Byte)로 표현 불가능한 정수는 L붙이고 long(8Byte)에 담기

System.out.println("정수값 = "+2147483647);
//4Byte로 표현 가능한 정수값 = -2147483648~2147483647

// => 4Byte로 표현 불가능한 정수값을 사용할 경우 에러 발생
//System.out.println("정수값 = "+2147483648); //error

//4Byte로 표현 불가능한 정수값은 정수값 뒤에 [L]를 붙여 8Byte 정수값으로 표현하여 사용
System.out.println("정수값 = "+2147483648L);

 

 

 

🍿정수값을 표현하기 위한 자료형 4가지

  • byte(1Byte), short(2Byte), int(4Byte), long(8Byte) -> byte(1Byte)
  • 가장 원시적인 데이터타입
  • 하드웨어 제어할 때 이용
  • 데이터 전달할 때는 1byte단위로 전달
  • 실제 정수값을 저장할 때는 byte단위 사용하지 않음
byte a1=127;//1Byte : -128~127
short a2=32767;//2Byte : -32768~32767
int a3=2147483647;//4Byte : -2147483648~2147483647
long a4=2147483648L;//8Byte

 

 

 

🍿값손실 주의 : 큰 그릇에 작은 값 담기 가능 , 작은 그릇에 큰 값 담기 불가능

//int a5=100L; //error 값손실생김

long a6=100; //가능, but 비효율적
//변수에 저장하는 리터럴과 동일한 자료형으로 저장하는 것을 권장함
int a6=100; //효율적으로 저장하자

 

 

2) 실수형 - float, double

  • 실수형(DoubleType) 리터럴 : 소숫점이 있는 숫자값
  • Java의 실수형 리터럴은 기본적으로 8Byte(Double)로 표현
  • 실수형 = 부호비트 + 가수부비트 + 기수부비트 로 구성
  • 값을 표현하는 방법 : 부동소수점방법
    • 정수형리터럴 방식과 다름 , 실수형은 표현의 범위과 매우 큼

 

🍿println() 메소드는 아주 작은 실수값 또는 아주 커다란 실수값을 지수형태로 변환하여 출력

System.out.println("실수값(4Byte) = "+12.3F); //실수값F >> 4Byte(Float)의 실수값을 표현한 리터럴
//실수값(4Byte) = 12.3

System.out.println("실수값(8Byte) = "+12.3); //실수값 >> 8Byte(Double)의 실수값을 표현한 리터럴
//실수값(8Byte) = 12.3

//println() 메소드는 아주 작은 실수값 또는 아주 커다란 실수값을 지수형태로 변환하여 출력
System.out.println("실수값(8Byte) = "+0.000000000123);
//실수값(8Byte) = 1.23E-10

 

 

🍿실수값을 지수형태로 표현하여 사용 가능

System.out.println("실수값(8Byte) = "+1.23E10);
//실수값(8Byte) = 1.23E10

System.out.println("실수값(8Byte) = "+12300000000.0);
//실수값(8Byte) = 1.23E10

 

 

 

🍿실수값을 표현하기 위한 자료형 2가지 : float(4Byte), double(8Byte)

float b1=1.23456789F; //정밀도 : 7자리
double b2=1.23456789123456789; //정밀도 : 15자리


System.out.println("b1 = "+b1);
//b1 = 1.2345679
//소수점 아래 7자리 밑에는 올림하여 출력


System.out.println("b2 = "+b2);
b2 = 1.234567891234568
//소수점 아래 15자리 밑에는 올림하여 출력

 

 

 

 

3) 문자형 - char

  • 문자형(CharacterType) 리터럴 : ' ' 안에 하나의 문자로 표현
    • Java의 문자형 리터럴은 기본적으로 2Byte(Character)로 표현

🍿문자의 종류 : 일반문자 & 회피문자

    • 일반문자
    • 회피문자(Escape Character) : 표현 불가능한 문자를 표현하기 위한 방법
      • \ 기호 
      • \n : Enter
      • \t : Tab
      • \' : 문자'
      • \" : 문자"
      • \\ : 문자 \
      • \0 : NULL 문자

 

🍿문자형 리터럴은 내부적으로 약속된 정수값(0~65535)으로 표현 : 유니코드(UniCode)

  • ''으로 감싼 문자는 char타입 변수에 저장되어 유니코드로 저장되지만,
  • ""로 감싼 문자는 유니코드로 반환되지 않음
  • 유니코드(2Byte) : 아스키코드(1Byte)가 확장된 것 VS
  • 아스키코드(1Byte) : 영문자만 있음 - c언어
  • ex) 'A' : 65 , 'a' : 97 , '0' : 48
  • ex) ' ' : 32 , '\n' : 13
  • ex) '가' : 44032 - 완
System.out.println("문자형(2Byte) = "+ 'A'); //문자형(2Byte) = A
System.out.println("문자형(2Byte) = "+ '가'); //문자형(2Byte) = 가
System.out.println("문자형(2Byte) = "+ ' '); //문자형(2Byte) =
System.out.println("문자형(2Byte) = "+ '');  //error

System.out.println("문자형(2Byte) = "+ '\\0'); // 문자형(2Byte) =
System.out.println("문자형(2Byte) = "+ '\\''); // 문자형(2Byte) = '
System.out.println("문자형(2Byte) = "+ '\\\\'); //문자형(2Byte) = \\

 

 

 

🍿 문자값을 표현하기 위한 자료형 - char(2Byte)

  • 문자형 변수에서는 문자값에 대한 약속된 정수값을 저장할 수 있음
  • alt + 65 -> 이클립스 내 A 로 작성됨
char c1 = 'A'; //문자를 직접 저장
char c2 = 65;  //문자를 10진수로 저장 (2Byte범위,양수값인 0~65535 내 들어옴)
char c3 = 'a' - 32; //문자값에 대한 연산 결과의 값을 저장함

System.out.println("c1 = "+c1); //c1 = A
System.out.println("c2 = "+c2); //c2 = A
System.out.println("c3 = "+c3); //c3 = A

char c4 = 45000;
char c5 = 45001;
System.out.println("c4 = "+c4); //c4 = 꿈
System.out.println("c5 = "+c5); //c5 = 꿉

char c6 = '\\u0041'; //16진수로 저장
//16진수 유니코드에 해당하는 문자 출력
System.out.println("c6 = "+c6); //c6 = A

 

 

 

4) 논리형 - boolean

  • 논리형(BooleanType)리터럴 : false(거짓), true(참)

🍿Java의 논리형 리터럴은 기본적으로 1Byte(Boolean)로 표현

System.out.println("논리형(1Byte) = "+ false);
//논리형(1Byte) = false
System.out.println("논리형(1Byte) = "+ true);
//논리형(1Byte) = true


//관계연산자(비교연산자)를 이용한 연산식의 결과값으로 논리형 리터럴을 사용
System.out.println("논리형(1Byte) = "+ (20<10));
//논리형(1Byte) = false
System.out.println("논리형(1Byte) = "+ (20>10));
//논리형(1Byte) = true

 

 

 

🍿 논리값을 표현하기 위한 자료형 - boolean(1Byte)

boolean d1 = false;
boolean d2 = 20>10;
System.out.println("d1 = "+d1); //d1 = false
System.out.println("d2 = "+d2); //d2 = true

 

 

 

5) 참조형

  • 문자열(StringType) 리터럴: " "안에 0개 이상의 문자들로 표현

🍿문자열은 원시형(기본형)이 아닌 참조형으로 String클래스로 표현

System.out.println("문자열 = " +"홍길동"); 
//문자열 = 홍길동
System.out.println("유관순 열사가 \\"대한 독립 만세\\"를 외쳤습니다."); 
//유관순 열사가 "대한 독립 만세"를 외쳤습니다.

 

 

🍿 문자열을 표현하기 위한 자료형 - String 클래스

String name = "임꺽정";
System.out.println("이름 ="+ name); //이름 = 임꺽정
반응형