Java & DB 데이터 타입 완벽 가이드📚

jinkyu Seok·2024년 12월 19일

기초학습

목록 보기
6/11

1. 숫자형 데이터 타입 🔢

정수형

Java 기본형Java 래퍼클래스MySQLOracle크기표현가능 숫자범위
byteByteTINYINTNUMBER(3)1byte-128 ~ 127
shortShortSMALLINTNUMBER(5)2byte-32,768 ~ 32,767
intIntegerINTNUMBER(10)4byte-2,147,483,648 ~ 2,147,483,647
longLongBIGINTNUMBER(19)8byte-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

ex1) Long l = 105L;

  • Long: 래퍼 클래스 타입
  • l: 변수명
  • 105: 값
  • L: long 타입 리터럴 표시 (필수)
  • 큰 숫자를 저장할 수 있는 상자(변수)를 만들어서 105를 담는 것

  • L을 붙이는 이유: "이건 큰 숫자 전용 상자에 넣을 거야!" 라고 표시

  • 실생활 비유: "큰 상자(Long)에 105라는 숫자를 담았어요"

  • 다른 예시들

long l1 = 105L;    // 기본형 (소문자)
Long l2 = 105L;    // 래퍼클래스 (대문자)
long l3 = 105;     // L 생략 가능 (int 범위 내)

ex2) int arr = new int[3];

  • int[]: 정수형 배열
  • arr: 배열 변수명
  • new: 메모리 할당
  • [3]: 배열 크기 (3칸)
  • 생성 결과

    arr[0] = 0 // 기본값 0으로 초기화
    arr[1] = 0
    arr[2] = 0

  • 다른 선언 방법들

int[] arr1 = new int[3];     // 권장되는 방식
int[] arr2 = {1, 2, 3};      // 초기값 지정
int[] arr3 = new int[]{1,2,3}; // 명시적 초기화
  • 숫자 3개를 순서대로 저장할 수 있는 칸막이 상자를 만드는 것

  • 실생활 비유: "3칸짜리 서랍장을 새로 만들었어요"

    [0][0] [0] // 처음에는 각 칸이 0으로 채워짐

  • 값을 넣으면:

    arr[0] = 10; // 첫 번째 칸에 10을 넣기
    -> [10][0] [0]

ex3) boolean b[];

  • boolean: 논리형 타입
  • b: 배열 변수명
  • []: 배열 표시
  • 실제 사용시에는 크기 지정 필요

    boolean b[] = new boolean[3];

  • 결과

    b[0] = false // 기본값 false로 초기화
    b[1] = false
    b[2] = false

  • 다른 선언 방법들

boolean[] b1;                    // 권장되는 방식
boolean[] b2 = {true, false};    // 초기값 지정
boolean b3[] = new boolean[3];   // 크기만 지정
  • 참/거짓만 저장할 수 있는 칸막이 상자를 만들겠다는 선언(아직 서랍장(칸 수)은 실제로 안 만든 상태)

  • 실제 사용하려면:

    boolean b[] = new boolean[2]; // 2칸짜리로 만들기
    -> [false][false] // 처음에는 false로 채워짐

  • 값을 넣으면:

    b[0] = true; // 첫 번째 칸에 true 넣기
    -> [true][false]

⚠주의사항 ⚠

1. Long 타입에서 L 생략 주의
Long l = 105;    // 경고! 암시적 박싱
Long l = 105L;   // 권장되는 방식

2. 배열 선언 위치 차이
int[] arr;    // 권장 (타입의 일부로 표현)
int arr[];    // 비권장 (C언어 스타일)

3. 배열 초기화 필수
boolean b[];      // 선언만 한 상태
b = new boolean[3];  // 반드시 초기화 필요

실수형

Java 기본형Java 래퍼클래스MySQLOracle크기정밀도(표현가능 소수점)
floatFloatFLOATNUMBER(38,7)4byte소수점 7자리
doubleDoubleDOUBLENUMBER(38,15)8byte소수점 15자리
-BigDecimalDECIMALNUMBER가변지정가능

2. 문자형 데이터 타입 📝

단일 문자

Java 기본형Java 래퍼클래스MySQLOracle크기특징
charCharacterCHARCHAR2byte(Java), 1~255byte(DB)고정 길이(한글자만 가능)

문자열(String : 두글자 이상 입력을 받아야할때 사용)

  • 입력받은 문자열을 저장하는 변수/숫자도 쓸 수 있는데 문자로 받아들인다
Java 타입MySQLOracle크기특징
StringVARCHARVARCHAR2~65,535byte(MySQL), ~4000byte(Oracle)가변 길이
StringTEXTCLOB~65,535byte대용량 텍스트
StringMEDIUMTEXTCLOB~16,777,215byte더 큰 텍스트
StringLONGTEXTCLOB~4GB초대용량 텍스트
  • String name = “Paul” —-> ‘P’, ‘a’, ‘u’, ‘l’ 의 조합

Ex1) String name = "qknwfwibg"
Ex2) String name = "qkaaaaaaaanwfwibg"
-> 위 두개에서 레퍼런스변수(name) 은 무조건 8바이트


3. 날짜/시간 데이터 타입 📅

Java 타입MySQLOracle형식용도
java.util.DateDATETIMEDATEYYYY-MM-DD HH:MM:SS날짜+시간
java.sql.DateDATEDATEYYYY-MM-DD날짜만
java.sql.TimeTIMEDATEHH:MM:SS시간만
java.sql.TimestampTIMESTAMPTIMESTAMPYYYY-MM-DD HH:MM:SS.SSS날짜+시간+밀리초
java.time.LocalDateDATEDATEYYYY-MM-DDJava8 이후 날짜
java.time.LocalTimeTIMEDATEHH:MM:SSJava8 이후 시간
java.time.LocalDateTimeDATETIMEDATEYYYY-MM-DD HH:MM:SSJava8 이후 날짜+시간

4. 논리형 데이터 타입 ✅

Java 기본형Java 래퍼클래스MySQLOracle저장값특징
booleanBooleanTINYINT(1)NUMBER(1)0/1true/false

5. 기타 특수 데이터 타입 🎯

바이너리 데이터

Java 타입MySQLOracle크기용도
byte[]TINYBLOBBLOB~255byte작은 바이너리
byte[]BLOBBLOB~65,535byte일반 바이너리
byte[]MEDIUMBLOBBLOB~16MB중간 바이너리
byte[]LONGBLOBBLOB~4GB대용량 바이너리

JSON 데이터

Java 타입MySQLOracle특징
StringJSONCLOBJSON 형식 데이터
ObjectJSONCLOB객체 매핑 가능

6. 참조형 변수

참조형 변수를 TV와 리모컨으로 비유해서 설명해드리겠습니다! 📺

1. 기본형 vs 참조형 비교 🔄

// 1. 기본형 변수 (값을 직접 저장)
int age = 25;  // 나이라는 값이 직접 들어있음

// 2. 참조형 변수 (주소를 저장)
String name = "Kim";  // "Kim"이 있는 위치를 가리키는 화살표만 저장

2. 실생활 비유: TV와 리모컨 📺

기본형 변수 = TV 버튼
- TV에 있는 실제 버튼
- 버튼 자체가 기능을 가짐

참조형 변수 = TV 리모컨
- TV를 가리키는 리모컨
- 실제 TV는 다른 곳에 있음
- 리모컨은 TV의 위치 정보만 가짐

3. 메모리 구조로 보기 💾

// 1. 기본형 (Stack 영역에 직접 저장)
int number = 100;
[Stack 영역]
number = 100  // 값이 직접 저장

// 2. 참조형 (Heap 영역의 주소를 저장)
String text = "Hello";
[Stack 영역]     [Heap 영역]
text = @ABC123"Hello"  // 주소만 저장

4. 크기가 8바이트인 이유 📏

// 모든 참조형 변수는 주소값만 저장
// 32bit 시스템 = 4바이트
// 64bit 시스템 = 8바이트

String str = "긴 문자열";     // 8바이트 (주소 저장)
int[] arr = new int[1000];  // 8바이트 (주소 저장)
Object obj = new Object();   // 8바이트 (주소 저장)

5. 실체가 외부에 저장되는 예시 🎯

String name = "Kim";
String name2 = name;  // 같은 "Kim"을 가리킴

// 메모리 구조
[Stack]        [Heap]
name = @ABC123"Kim"
name2 = @ABC123

정리하면 📝

  1. 기본형 (8가지)

    • int, long, float, double
    • byte, short, char, boolean
    • 값을 직접 가짐
  2. 참조형 (나머지 전부/모든 래퍼변수는 참조형변수이다)

    참조형 변수
    ├── 래퍼 클래스 (Integer, Long, Double 등)
    ├── String
    ├── Array
    ├── Class
    └── 기타 객체들

    • 주소값만 가짐 (8바이트)
    • 실제 데이터는 다른 곳에 저장

쉽게 말해서, 참조형 변수는 "실제 물건이 있는 위치를 알려주는 리모컨" 같은 것입니다!


7. 주요 특징 및 주의사항 ⚠️

Null 처리

// 기본형: null 불가
int num = null;        // 컴파일 에러
boolean flag = null;   // 컴파일 에러

// 래퍼클래스: null 가능
Integer number = null;  // OK
Boolean flag = null;   // OK

메모리 사용

기본형 < 래퍼클래스 (메모리 사용량)
- int: 4byte
- Integer: 16byte (객체 오버헤드 포함)

성능 고려사항

// 1. 단순 연산시 기본형 사용 권장
int sum = 0;
for(int i = 0; i < 1000000; i++) {
    sum += i;
}

// 2. 컬렉션, null 필요시 래퍼클래스 사용
List<Integer> numbers = new ArrayList<>();

8. 데이터 타입 선택 가이드 💡

  1. 숫자 데이터

    • 일반 계산: int, long
    • 금액 계산: BigDecimal
    • null 필요: Integer, Long
  2. 문자 데이터

    • 고정 길이: char, CHAR
    • 가변 길이: String, VARCHAR
    • 대용량: TEXT, CLOB
  3. 날짜 데이터

    • Java8 이상: LocalDateTime
    • 이전 버전: Date
    • 시간대 필요: ZonedDateTime

이러한 데이터 타입들을 상황에 맞게 적절히 선택하여 사용하면 됩니다.

0개의 댓글