파덕이 개발 블로그
article thumbnail
Published 2023. 7. 27. 00:28
자바) 자료형 정리 카테고리 없음

2-1. 자료형

💡 데이터를 저장하려면 메모리에 값을 저장할 공간을 생성하고 이름을 부여해야 함
  • 변수 : 메모리 공간에 부여하는 이름
// 자료형 변수명

int a;               // a는 int형 변수
String b;            // b는 String형 변수

주의해야 할 점

  1. 자료형은 반드시 사용하기 전에 선언 해야 한다.
  2. 자료형은 반드시 한 번만 선언 해야 한다
💡 변수에 한 번 지정된 자료형을 바꿀 수 없는 이유?
변수의 자료형이 처음 선언되면 메모리에는 선언된 자료형의 데이터만 저장할 수 있는 공간이 만들어지는데, 메모리에서 한 번 만들어진 공간은 사라질 수는 있어도 데이터를 저장하는 기능은 변경할 수 없기 때문

변수 사용하기

  • 변수의 선언과 동시에 값 대입
  • // 자료형 변수명 = 값; int a = 3;
  • 변수 선언과 값 대입 분리하기
  • // 자료형 변수명; // 변수명 = 값; int a; a = 3;
// 요약
public class Example1 {
    public static void main(String[] args) {
        // 변수 = 기억장소 이름
        int a; // 변수 선언
        a = 0; // 변수 초기화
        int b = 0;   // 변수 선언과 초기화
        int i=0, j=0, k=0; // 한꺼번에 선언과 초기화
        a = a+ 5;           i = a + 20;        j = a - 20;
        System.out.println("a="+a);
        System.out.print("i="+i+"\\n");
        System.out.printf("j=%d",j);

    }

2-2. 변수 이름 짓기

  • 이름 지을 때 필수 사항
    • 영문 대소 문자와 한글을 사용할 수 있다.
    • 특수 문자는 밑줄(_)과 달러($)표기만 사용할 수 있다.
    • 아라비아 숫자를 사용할 수 있다. 단, 첫 번째 글자로는 사용할 수 없다.
    • 자바에서 사용하는 예약어는 사용할 수 없다.
  • 변수 명을 지을 때 권장 사항
    • 영문 소문자로 시작한다.
    • 영문 단어를 2개 이상 결합할 때는 새로운 단어의 첫 글자를 대문자로 한다.
    • 낙타표기법 : 이름은 소문자로 시작하고 새로운 단어를 결합할 때 의미를 파악하기 쉽도록 대문자로 시작
  • 변수의 생존 기간
    • 메모리에 변수가 만들어진 이후 사라지기 까지의 기간
    • 변수는 선언된 시점에 생성됨
package sec1;

public class Example3 {

    // 변수명 규칙
    // 1. 영문 소문자로 시작
    // 2. 예약어는 사용할 수 없음
    // 3. 변수명 중간에 공백을 사용할 수 없음
    // 4. 시작시 $ 또는 _(UnderScore)로 시작할 수 있음
    // 5. 대문자와 소문자가 서로 엄격히 다르다.

    // 관례
    // 1. 누구나 쉽게 그 변수가 어떠한 역할을 하는지 쉽게 알 수 있도록
    // 2. 여러 단어로 변수명을 정할 경우
        // Snake(파스칼케이스) 방식 또는 카멜 방식으로 연결한다.
        // ex1) chunjaeitcenter
        // 스네이크 - chunjae_it_center
        // 카멜 - chunjaeItCenter
    // 3. 개발 기준서를 기준으로 접두어나 접두사를 붙여 정함
        // ex1) 단순 데이터 저장일 경우 - 해당 변수는 모두 set으로 시작함
        // setKim

    int a, a1, $a, _a;
    int Aa; // 대문자로 시작하지 않도록 유의
    // int k*j; 연산자를 변수로 활용할 수 없음
    // int 1a; 숫자로 시작할 수 없음
    // int a b; 변수명 중간에 띄워쓰기 할 수 없음
    // int class; 예약어를 변수명으로 활용할 수 없음

}

2-3. 자료형의 종류

  • 메모리는 목적에 따라 3가지 영역으로 나뉨
    1. 첫번째 영역
      1. 클래스(class) 영역
      2. 정적(static) 영역
      3. 상수(final) 영역
    2. 두번째 영역
      1. 스택(stack) 영역
    3. 세번째 영역
      1. 힙(heap) 영역

기본 자료형과 참조 자료형의 차이

💡 기본 자료형은 스택 메모리에 생성된 공간에 실제 변숫값을 저장하는 반면, 참조 자료형은 실제 데이터 값은 힙 메모리에 저장하고, 스택 메모리의 변수 공간에는 실제 변숫값이 저장된 힙 메모리의 위칫 값을 저장한다.

기본 자료형의 메모리 크기와 저장할 수 있는 값의 범위

  • 자료형의 크기가 클수록 저장하는 값의 범위도 넓어진다.
  • 각 정수 자료형의 값 범위
    • n개의 비트로(bit)로 표현할 수 있는 정수 = 2의 n제곱
    • 1byte(=8bit) = 2의 8 제곱(=256)
    • 정수는 음수, 0, 양수를 포함하므로 - 표현할 수 있는 전체 개수 중 반은 음수, 나머지 반은 0과 양수에 할당한다. ⇒ 바이트 자료형의 값 범위 -2의 7제곱 ~ 2의 7제곱 -1
    public class Example6 {
        public static void main(String[] args) {
    
            int a = 100;
            int b = 0b100;                      // 실제 연산과 논리연산 등을 수행
            // 2진수 --> 4x1 = 4
            int c = 0100;                       // 권한 부여 및 수행, 회수
            // 8진수 --> 8의 2승 = 64x1 = 64
            int d = 0x100;                      // 실제 물리적 주소 또는 메모리 주소
            // 16진수 --> 16의 2승 = 256x1 = 256
    
            System.out.println("a = " +a);
            System.out.println("b = " +b);
            System.out.println("c = " +c);
            System.out.println("d = " +d);
        }
    
  • 각 실수 자료형의 값 범위
    • float = 4byte / double = 8byte
      • 실수는 저장 방식이 부동 소수점, 즉 ‘가수X밑의 지수 제곱의 형태로 저장
      • float 자료형 - 1bit, 23bit, 8bit
      • double 자료형 - 1bit, 52bit, 11bit를 할당
  • 부울대수 자료형 - boolean
    • true(참), false(거짓)의 값만 저장할 수 있는 자료형
      • 자료 처리의 최소 단위가 바이트 이므로 1byte가 할당된다.
      boolean a = true;
      boolean b = false;
      
  • 리터럴(Literal) : 코드에 직접 작성한 값
  • 정수 자료형 - byte, short, int, long
    • 정수 리터럴의 기준
      1. byte와 short 자료형에 저장할 수 있는 범위 내의 정숫값이 입력됐을 때
      2. byte, short에 저장 할 수 없는 범위의 정수 리터럴은 모두 int자료형으로 인식
      3. 크기에 상관없이 int, long에 정수 리터럴을 입력할 때도 int 자료형으로 인식
  • 실수 자료형 - float, double
  • 문자 자료형 - char
    • char 자료형 메모리 안은 문자가 아니라 정수가 저장된 형태이므로 char에 문자에 해당하는 정숫값을 직접 입력해도 똑같은 결과를 얻을 수 있다.
    • → char 자료형에 정수를 저장할 수 있는 이유
    • char 자료형은 정숫값과 더불어 유니코드 값을 직접 입력 가능
    • → \\u+16진수 유니코드 : 유니코드 값은 2byte, 즉 16진수 4자리로 표현해야함
public class Example5 {
    public static void main(String[] args) {
        byte b1 = 104;
        // byte b2 = -129;          해당 표현범위보다 작음(언더플로우)
        // byte b3 = 128;           해당 표현범위보다 크면(오버플로우)

        char c1 = 'k';
        char c2 = 0;                // 언더플로우
        char c3 = 65535;            // 오버플로우

        short s1 = 32766;
        short s2 = -32768;           // -32768 <  -> 언더플로우
        short s3 = 32767;            //  32767 >  -> 오버플로우

        int i1 = 1000;
        int i2;                      //
        int i3;

        long l1 = 9223372036854775806L;
        long l2;
        long l3;

        float f1 = 3.4028235E37f;
        float f2;
        float f3;

        double d1 = 1.7976931348623157E308d;
        double d2;
        double d3;
    }
}


2-4. 기본 자료형 간의 타입 변환

  • 타입변환(Type Casting) : boolean을 제외한 기본 자료형 7개는 자료형을 서로 변환할 수 있다.
    • 타입 변환 방법은 단순히 변환 대상 앞에 (자료형)만 표기하면 된다.
    • 정수나 실수 리터럴은 숫자 뒤에 L이나 F를 붙여 각각 long, float로 타입 변환 수행 가능
    // 자료형 간의 타입 변환 방법
    // 자료형 A 변수명 = (자료형 A) 값
    
    long 변수명 = 값 + L;
    long 변수명 = 값 + l;
    float 변수명 = 값 + F;
    float 변수명 = 값 + f;
    

※ 타입 변환을 수행할 때는 저장할 수 있는 값의 범위나 종류가 달라지므로 값이 변할 수 있다.

 

자동 타입 변환과 수동 타입 변환

💡 자료형의 크기 byte < short/char < int < long< float < double
public class Example7 {
    public static void main(String[] args) {
        // byte(1)<char(2)<short(2)<int(4)<long(8)
        // float(4)<double(8)

        // 자동형변환(auto casting) : 해당 타입에서 크기가 같거나 더 큰 타입에 대입되었을 때 발생
        int data1 = 1004;                       // 정수형 타입
        float data2 = data1;                    // 실수형 타입으로 변수를 설정함으로써 타입이 변환됨

        char data3 = 'K';
        int data4 = data3;                      // 75번 유니코드 K -> 아스키코드로 변환

        // 강제 형변환 : 형변환 연산자를 활용하는 형변환 -- 가능하면 안 쓰는 것이 좋다. ~ 데이터의 신빙성이 떨어지기 때문
        int data5 = 2048;
        byte data6 = (byte)data5;               // (byte) : 형변환 연산자  --> 알 수 없는 데이터로 삽입

        System.out.println("data1= " +data1);
        System.out.println("data2= " +data2);
        System.out.println("data3= " +data3);
        System.out.println("data4= " +data4);
        System.out.println("data5= " +data5);
        System.out.println("data6= " +data6);
    }
}
  • 자동 타입 변환 : 컴파일러가 자동으로 수행업캐스팅 : 크기(범위)가 작은 자료형을 큰 자료형에 대입 → 어떠한 데이터 손실 발생 X
  • 다운 캐스팅 : 큰 자료형을 작은 자료형에 대입하는 행위 → 데이터 손실이 발생할 수 있으므로 컴파일러에 따른 자동 타입 변환은 일어나지 않으며, 개발자가 직접 명시적으로 타입 변환을 수행 해야 한다.
  • 수동 타입 변환 : 개발자가 직접 타입 변환 수행
  • 기본 자료형 간의 연산

 

기본 자료형과 참조 자료형의 차이

출처) Do it!_자바 완전정복 -저자 김동형 78P 표 참고
출처) Do it!_자바 완전정복 -저자 김동형 79P 표 참고

profile

파덕이 개발 블로그

@dhxogns920

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!