본문 바로가기
내일배움캠프(Sparta)/Java Handbook

[Java Handbook] Part 1-4

by mmm- 2023. 9. 11.

1. 기본형

기본형

: 데이터의 가장 기본이 되는 타입

  • 논리, 문자, 정수, 실수형으로 나뉨
    • 논리형: boolean
    • 문자형: char
    • 정수형: byte, short, int, long
    • 실수형: float, double

기본형의 종류와 크기

  • 논리형
    • true / false
    • 조건식과 논리적 계산에 적용
  • 문자형
    • 문자 저장. 변수 당 하나의 문자만을 저장할 수 있음 (여러 개의 문자는 String)
  • 정수형
    • 정수 값 저장
    • 주로 int, long을 사용하며 byte는 이진 데이터를 다루는데 사용
  • 실수형
    • 실수 값 저장

기본형의 표현 범위

  • 1bit 에는 0과 1이 들어갈 수 있음
    • 1bit는 0, 1 -> 2개
      2bit는 00, 10, 01, 11 -> 4개
  • n비트로 표현할 수 있는 값의 개수: 2^n 개
    n비트로 표현할 수 있는 부호없는 정수의 범위: 0~2^n-1
    n비트로 표현할 수 있는 부호있는 정수의 범위: -2^(n-1)~2^(n-1)-1

 

실수형의 표현 범위

정밀도: 소수점 몇 자리까지 오차없이 표현할 수 있는지

 

 

  • S: 부호 (양수 or 음수 표현)
  • E: 지수 (2의 지수 표현)
  • M: 가수 (소수점 이하 표현)
  • 실수형은 정수형과 저장방식이 달라 오차가 발생함
  • float이 int보다 더 큰 범위의 값을 저장할 수 있음

 


메모리에 값이 저장되는 과정

 

 

  • 변수 b에 10진수 3을 저장하면 컴퓨터는 이것을 2진수로 변환해 메모리에 저장
  • 타입마다 값이 저장되는 형식에 맞게 변환되어 저장됨

 

 


문자가 저장되는 과정

아스키 코드표

  • 컴퓨터는 아스키 코드표를 기준으로 매칭하여 문자를 저장

 

아스키코드

  • 128개의 문자조합을 제공하는 7비트 부호
  • 알파벳, 숫자, 특수기호, 그 외 컴퓨터에 필요한 몇 가지만이 정의

유니코드

  • 각 나라별 언어를 모두 표현하기 위해 나온 코드 체계
  • 문자마다 고유한 코드 값을 제공하는 새로운 개념의 코드
  • 16비트로 표현 (최대 65,536자 표현 가능)

UTF-8

  • 유니코드를 사용하는 인코딩 방식 중 하나
  • 영문/숫자/기호는 1바이트로, 한글/한자는 3바이트로 표현
  • 전세계 모든 글자들을 한꺼번에 표현 가능
  • 유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지 사용

정수형 오버플로우

  • 정수형은 해당 변수타입의 최솟값, 최댓값 범위를 넘어가면 값을 순환함
public class Variable3_1 {
    public static void main(String[] args) {
        // 부호가 있는 경우
        short sMin = -32768;
        short sMax = 32767;

        // short 타입에서 최솟값 범위를 넘었을 때
        // sMin - 1 = 32767
        System.out.println("sMin = " + sMin);
        System.out.print("sMin - 1 = ");
        System.out.println((short)(sMin - 1));
        
        // short 타입에서 최댓값 범위를 넘었을 때
        // sMax + 1 = -32768
        System.out.println("sMax = " + sMax);
        System.out.print("sMax + 1 = ");
        System.out.println((short)(sMax + 1));
        
        // 부호없는 경우
        char cMin = 0;
        char cMax = 65535;

        // short 타입에서 최솟값 범위를 넘었을 때
        // cMin - 1 = 65535
        System.out.println("cMin = " + (int)cMin);
        System.out.print("cMin - 1 = ");
        System.out.println((int)(--cMin));

        // short 타입에서 최댓값 범위를 넘었을 때
        // cMax + 1 = 0
        System.out.println("cMax = " + (int)cMax);
        System.out.print("cMax + 1 = ");
        System.out.println((int)(++cMax));
    }
}

문자와 숫자간의 변환

  1. 숫자 → 문자
    • 숫자 + '0'  → 문자
  2. 문자 → 숫자
    • 문자 - '0' → 숫자
public class Variable3_2 {
    public static void main(String[] args) {
        int num = 5;
        char ch = '5';

        // 숫자 -> 문자
        System.out.println("num = " + num);
        // '0'이 48이기 때문에 결과값을 char 타입으로 변환 필요
        System.out.println("num + '0' = " + (char)(num + '0'));

        // 문자 -> 숫자
        System.out.println("ch = " + ch);
        System.out.println("ch - '0' = " + (ch - '0'));

        // '5'에서 숫자 5로 변환되었기 때문에 결과값 6
        System.out.print("ch - '0' + 1 = ");
        System.out.print(ch - '0' + 1);
    }
}

 

문자열로의 변환

  1. 숫자 → 문자열
    • 숫자 + ""  → 문자열
  2. 문자 → 문자열
    • 문자 + "" → 문자
public class Variable3_3 {
    public static void main(String[] args) {
        int num = 5;
        char ch = '5';

        // 숫자 -> 문자열
        System.out.println("num + \"\" = " + num + "");
        // num이 "5"로 변환되었기 때문에 "5" + "5"로 결과값은 "55"
        System.out.println("num + \"\" + \"5\" = " + num + "" + "5");

        // 문자 -> 문자열
        System.out.println("ch + \"\" = " + ch + "");
        // ch가 '5'에서 "5"로 변환되었기 때문에 "5" + "8"로 결과값은 "58"
        System.out.println("ch + \"\" + \"8\" = " + ch + "" + "8");
    }
}

 

문자열을 숫자, 문자로 변환

  1. 문자열 → 숫자
    • Integer.parseInt("문자열");
    • Double.parseDouble("문자열");
  2. 문자열 → 문자
    • "문자열".charAt(0)
public class Variable3_4 {
    public static void main(String[] args) {
        String str1 = "100";
        String str2 = "3.14";
        String str3 = "8";

        // 문자열 -> 숫자
        System.out.println("Integer.parseInt(str1) = " + Integer.parseInt(str1));
        // Integer.parseInt() 는 int 타입만 가능
        //System.out.println("Integer.parseInt(str2) = " + Integer.parseInt(str2));
        System.out.println("Double.parseDouble(str2) = " + Double.parseDouble(str2));

        // 문자열 -> 문자
        System.out.println("str1.charAt(0)  = " + str1.charAt(0) + str1.charAt(1) + str1.charAt(2));
        System.out.println("str3.charAt(2) = " + str3.charAt(0));



    }
}

2. 참조형

  • 기본형을 제외한 나머지 타입 (ex; String, System)
  • 참조형 변수는 null 또는 메모리 주소를 저장
    • null: 어떤 객체의 주소도 저장되지 않음을 의미
    • 타입에 관계없이 변수의 크기가 항상 4byte (JVM이 64bit일 경우 8byte)
    • 4byte는 2진수, 대략 40억개로 40억byte(4GB)의 메모리를 다룰 수 있음
import java.util.Date;

public class Variable3_5 {
    public static void main(String[] args) {
        Date date; // 참조형 변수 date 선언
        date = new Date(); // date에 객체의 주소를 저장, new는 객체를 생성하는 명령어

        System.out.println(date);
    }
}

3. 문자와 문자열의 차이

public class Variable4_1 {
    public static void main(String[] args) {
        char ch1 = 'A';  // 문자
        //char ch2 = 'AB';
        //char ch3 = ''; // 빈 문자 불가능

        String s1 = "ABC"; // 문자열
        String s2 = ""; // 빈 문자열 가능
        String s3 = "A"; // 문자 한 개도 문자열

        // 아래 두 표현식 모두 사용 가능하지만 ss2 방식은 거의 사용하지 않음
        String ss1 = "AB";
        String ss2 = new String("AB");

        System.out.println("ss1 = " + ss1);
        System.out.println("ss2 = " + ss2);

    }
}

4. 문자열 결합

public class Variable4_2 {
    public static void main(String[] args) {
        String s1 = "A" + "B"; // "AB"
        System.out.println("s1 = " + s1);

        // 문자열은 문자열하고만 결합 가능하기 때문에 숫자를 문자열로 바꾼 후 결합함.
        String s2 = ""+ 7;
        System.out.println("s2 = " + s2);

        // 문자열 결합 순서에 의한 차이 확인
        String s3 = "" + 7 + 7;
        // "" + 7 + 7 => "7" + 7  => "7" + "7" = "77"
        System.out.println("s3 = " + s3);


        String s4 = 7 + 7 + "";
        // 7 + 7 + "" => 14 + "" => "14"
        System.out.println("s4 = " + s4);
    }
}

5. 두 변수의 값 교환

public class Variable4_3 {
    public static void main(String[] args) {
        int x = 10, y = 20;

        // x와 y값 교환
        x = y; // x = 20;
        // 변수는 하나의 값만 저장할 수 있기 때문에 기존의 x의 값 10은 사라지고 20이 됨.
        y = x; // y = 20;

        System.out.println("x = " + x); // 20
        System.out.println("y = " + y); // 20

        System.out.println();

        int a = 10, b = 20;
        int tmp; // 교환할 때 중간다리 역할을 할 변수 선언

        tmp = a; // a = 10, tmp = 10
        a = b; // b = 20, a = 20
        b = tmp; // tmp = 10, b = 10

        System.out.println("a = " + a); // 20
        System.out.println("b = " + b); // 10
        System.out.println("tmp = " + tmp); // 10
    }
}

'내일배움캠프(Sparta) > Java Handbook' 카테고리의 다른 글

[Java Handbook] Part 2-2  (0) 2023.09.12
[Java Handbook] Part 2-1  (0) 2023.09.12
[Java Handbook] Part 1-3  (0) 2023.09.11
[Java Handbook] Part 1-2  (0) 2023.09.11
[Java Handbook] Part 1-1  (0) 2023.09.11