[JAVA] 변수

야부엉·2023년 10월 18일
post-thumbnail

변하는 것과 변하지 않는 것

1. 저장 공간의 선언과 값의 저장

(1) 저장 공간의 선언

int number;
  • int : 저장 공간의 타입(종류)
  • number: 저장 공간의 이름

비유 : 저장 공간을 접시라고 했을 때, 우린 접시의 종류가 int 타입인 것이라고 생각하면 된다.
즉,
접시의 이름을 number라고 생각하면 된다.

(2) 값의 저장

  • 초기화 방식
int number = 10;
- 선언과 동시에 저장한다.(초기화)
  • 덮어쓰기 방식
int number;
number = 10;
- 선언 이후에 값을 저장한다.(덮어쓰기)

비유 : number 라는 접시그릇에 우린 10 이라는 반찬을 담았다.

(3) 변수와 상수

  • 변수 : 변하는 저장 공간
    비유 : 접시 라는 공간에서 내가 먹을 음식을 자유롭게 담고 먹고 다른 걸로 담는 것을 반복하는 것이라고 생각하면 된다.
int number = 10;
  • 상수 : 변하지 않는 저장 공간
    비유 : 냄비랑 비슷하다. 찌개를 담아놓고 다 먹을때까지 다른 걸 담지 않는다고 생각하면된다.
final int number = 10;
  • 상수를 만들 때 final(접근제어자) 이라는 키워드를 사용한다.

2. 저장 공간의 종류(타입)

(1) 기본형 변수 -> 단순히 원본 값을 저장

논리형 변수

  • boolean
    - true / false 값만 저장
    - 예시
    boolean flag = true;
    flag = false;

문자형 변수

  • char
    - 'A'와 '1'와 같은 문자 하나만 저장
    - '' 를 사용함 -> 문자열과 차이점
    - 예시
    char ch = 'a';

정수형 변수

  • byte(1byte) : -128 ~ 127 범위의 숫자만 저장 가능
  • short(2byte) : -32,768~32,767 범위의 숫자만 저장 가능합니다.
  • int(4byte) : -21억~21억 범위의 숫자만 저장 가능합니다.
  • long(8byte) : 9백경 정도의 매우 큰수를 저장 가능합니다.

    정수형 리터럴 구분값(리터럴 = 데이터값)
    longint와 구분하기 위해 접미사 'L'을 붙여서 사용한다.

  • 예시
byte byteNumber = 127;
short shortNumber = 32767;
int intNumber = 214812312;
long longNumber = 123215125L;

정수형 변수

  • float(4byte) : 3.4 -10^38 ~ 3.4 10^38(long 보다 큼)범위의 숫자 저장이 가능합니다.
  • double(8byte) : 1.7 -10^308 ~ 1.7 10^308(long 보다 큼)범위의 숫자 저장이 가능합니다.
  • 표현 범위: float > long -> 부동소수점 방식 때문이다.

    floatdouble을 구분하기 위해 float에 접미사 'f'을 붙여서 사용한다.

(2) 참조형 변수 -> 원본 값은 따로 저장 되어 있고 원본이 들어 있는 주소값 저장

  • 문자열 변수 : String
    - "Apple", "텍스트"와 같은 문장을 저장한다.
    String helloWorld = "Hello World";
  • 그 외 : Object, Array, List ...
    - 객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장한다.
    - 예시
    int a[] = {1,2,3};

(3) 래퍼 클래스 변수

  • 기본형 변수를 클래스로 한번 랩핑(감싸는) "변수"
  • 사용 이유
    - 클래스는 특징과 행동이 있다. 클래스로 변환하면서 유용한 기능을 사용 할 수 있다.
  • boxing , unboxing
    - 기본 타입에서 래퍼 클래스 변수로 변수를 감싸는 것을 “박싱”
    - 래퍼 클래스 변수를 기본 타입 변수로 가져오는 것을 “언박싱”
  • 예시
        int number = 21;
        // Deprecated 됫다 -> 안쓰게 됫다. new 로 감싸지 않아도 된다.
        //Boxing
        Integer num = number;

        // Unboxing
        System.out.println(num.intValue());
  • 래퍼 클래스 변환 형태


3. 숫자와 문자

  • 문자의 저장 방식 : 숫자를 문자로 매핑해서 표현 -> 아스키 코드 기반으로 변환된다.

    아스키 코드

  • 예시
 char letter = sc.nextLine().charAt(0);
 int asciinum = (int)letter;
 System.out.println(asciinum); 
 // a를 입력시 97이 나온다.

4. 문자와 문자열 차이

(1) 선언 관점에서의 차이

  • 문자
    - 따옴표를 사용하여 값을 저장
    char ch = 'A';
  • 문자열
    - 쌍따옴표를 사용하여 값을 저장
    String message = "Hello world";

(2) 저장 관점에서의 차이

  • 문자
    - 문자 뒤에 \0(널문자)가 없다.
    - 1byte만 사용해서 끝을 알 수 있다.
  • 문자열
    - 문장의 끝에 \0(널문자)가 함께 저장.
    - 몇개의 byte를 쓸지 모르기 때문에 끝을 표시

(3) 참조형

  • 참조형 == 주소형 변수?
    - 참조형 변수는 주소값만 저장이 되고, 원본 값은 다른 곳에 저장이 된다.(저장 위치가 다르다)
  • 메모리 영역

    - 참조형 변수는 stack에 저장이 되고 원본값은 Heap영역에 저장이 된다.

Heap vs Stack

  • Heap 영역은 동적으로 할당된 메모리 영역 -> 크기를 알 수없는 변수의 원본을 저장한다.
  • Stack 영역은 정적으로 할당된 메모리 영역 -> 크기가 정해져 있는 것들을 저장한다.

5. 입출력

  • 입력
    - Scanner.in 객체의 next 메소드(행동)을 이용해서 입력을 받는다.

    Scanner sc = new Scanner(System.in); // Scanner 객체를 new 명령어로 생성합니다.
    String input = sc.next(); // sc(Scanner)의 .next(); 를 실행하면 input 변수에 입력한 글자를 받을 수 있습니다.
  • 출력
    - System.out 객체의 println() 메소드(행동)을 이용해서 출력한다.

    Scanner sc = new Scanner(System.in);
    String input = sc.next();  
    System.out.println("입력값 : " + input);  // 입력한 글자를 출력합니다.

6. 형변환(변수 타입 바꾸기)

(1) 종류

  • 강제 형변환
    - 더 작은 표현 범위를 가진 타입으로 변환한다.
    - (int)와 같이 명시적으로 사용해야한다.
    - 값의 손실이 날 수 있다.
    double doubleNumber = 10.101010;
    		float floatNumber = 10.1010f;
    int intNumber;
    intNumber = (int)doubleNumber; // double -> int 형변환
    intNumber = (int)floatNumber; // float -> int 형변환
  • 자동 형변환
    - 더 큰 표현 범위를 가진 타입으로 변환한다.
    • 작은 크기의 타입이 큰 크기의 타입과 계산이 될때, 자동으로 큰 크기의 타입으로 형변환이된다.
    • 명시적 표현을 사용하지 않아도 된다.
    • 값의 손실이 없다.
      int intNumber = 10;
      double doubleNumber = (double)intNumber; // int -> double 형변환
  • 정수형과 실수형타입의 변수 표현 범위 순서
    - double(8) > float(4) > long(8) > int(4) > short(2) > byte(1)

출처

profile
밤낮없는개발자

0개의 댓글