본문 바로가기
Java 문법 종합반

[Java 문법 종합반] 변수, 저장공간, 형변환, 자동 형변환

by Won's log 2023. 5. 23.

#변수

변하는 것

: 일반적인 변수

 

#상수 (=constant value)

변하지 않는 것

: 값이 정해지면 변하지 않는 것

상수라고 꼭 수가 아니라

변하지 않는 '값'이라고 생각하기

 

자바에서는 값을 다루기 위해서는 저장공간이 필요하다

변수는 변할 수 있다는 것이므로

어떤 공간을 마련해 놓고 변할 수 있는 값을

넣고 빼는 공간이 필요하므로 저장공간도 세트 개념이다

 

저장공간의 선언

Int number

Int (=Integer의 약자)로

저장공간의 타입 (=접시의 종류)이다

숫자 종류를 담겠다는 의미

number는 저장공간의 이름

(=접시 이름)이다

 

변수는 변수의 타입을 정하고 이름을 정하는

'선언'이 필요하다

 

선언 다음은 값의 저장이며

할당이라고도 불린다

(= 선언과 할당이 변수를 만드는 과정이다)

 

자바 프로그램에서 저장공간에 값을 저장하는 방법 2가지

1. 선언과 동시에 값을 할당

(= 변수로 선언 및 초기화)

Int number = 10 ;

저장공간 타입 + 저장공간 이름 = 저장할 값(담을 음식)

2. 선언 이후에 값을 저장할 경우, 덮어쓰기로 값 저장하기

(= 변수의 값을 바꾼다

= 덮어쓰기)

number = 10 ;

저장공간 이름 =  저장할 값

 


저장공간의 개념을 이해한 상태에서

결국 변수와 상수는

변수 :  변하는 저장공간으로

자바 프로그램에서 저장하는 대부분의 값은

변하는 것, 변수가 많다

 

상수 : 변하지 않는 저장공간

= 한번 할당을 하면 바꿀 수 없는 저장공간

예) pi -> 3.141592...

예) final Int number = 10 ;

number = 11 ;

final이기 때문에 11로 덮어쓰기 할 수 없음으로

에러가 난다!


저장공간의 타입

기본형과 참조형

 

1. 기본형

숫자형, 문자형, Boolean

 

2. 참조형

뭔가 복잡한 녀석들

한 번에 저장하기 어렵고 어딘가에 별도로 저장하여

저장한 주소값을 참조하는 식으로 저장

 

1. 기본형 변수

1) 논리형 변수 : boolean

ture :  1

false : 2

boolean flag = true; // 1. 논리형 변수 boolean 으로 선언 및 True 값으로 초기화

flag = false; // 2. False 값으로도 저장할 수 있습니다.

2) 문자형 변수 :  char

A와 1과 같은 문자 하나만 저장

문자열 X

char alphabet = 'A'; // 문자 하나를 저장합니다.

3) 정수형 변수 : 

byte, short, int, long

0, 1, 2,.. 99와 같은 정수형 숫자값을 저장

정수형 변수 표현 범위에 따라 변수타입을 나눔

byte byteNumber = 127; // byte 는 -128 ~ 127 범위의 숫자만 저장 가능합니다.

short shortNumber = 32767; // short 는 -32,768~32,767 범위의 숫자만 저장 가능합니다.

int intNumber = 2147483647; // int 는 -21억~21억 범위의 숫자만 저장 가능합니다.

long longNumber = 2147483647L; // long 은 숫자뒤에 알파벳 L 을 붙여서 표기하며 매우 큰수를 저장 가능합니다.

정수형 리터럴 구분값(리터럴 = 데이터값)**
`int` 와 `long` 의 데이터값(리터럴)을 구분하기 위한 구분자로 long으로 담을 숫자뒤에 L을 붙입니다.
이런식으로 데이터값(리터럴) 뒤에 붙이는 구분값을 “접미사”라고 부릅니다.

long형은 L을 붙임

 

byte 저장공간 = 1 byte

short 저장공간 = 2 byte

int 저장공간 = 4 byte

long 저장공간 = 8byte

 

막간의 실습

byte byteNumber = 127;  // -128 ~ 127 (1byte = 8bit=256가지를 표현) *bit는 0과 1을 표현하는 최소단위
short shortNumber = 32767; // -32,768 ~ 32,767
int intNumber = 21378943; 
long longNumaber = 218345L; 

System.out.println(byteNumber);
System.out.println(shortNumber);
System.out.println(intNumber);
System.out.println(longNumaber);

 

4) 실수형 변수

float, double

0.123, 0.9999.. 같은 소수점 실수값을 저장

실수형 변수 표현 범위

표현 범위가 매우 넓어서

정수형 변수에서 담지 못할 수 있음

= float 가 long 보다 더 넓은 범위를 표현하기 때문에 자동 형변환이 안 된다

long longNumber = 3.14f; // long < float 자동 형변환 불가

float floatNumber = 0.123f; // float 는 4byte 로 3.4 * 10^38 범위를 표현하는 실수값
double doubleNumber = 0.123123123; // double 은 8byte 로 1.7 * 10^308 범위를 표현하는 실수값

float와 double의 차이는 표현 범위가 다름

 

컴퓨터는 정수와 소수로 표현되는데

소수점은 고정소수점과 부동소수점으로 나뉜다

부동소수점.... 추가 공부가 필요해서 패스


참조형 변수는 문자열 변수와 그 외로 나뉜다

참조형 변수는 단일 공간에 담을 수 없음

어느 공간에 있는 주소값을 바라보는 변수

복잡한 친구다 ^^

길이를 예측할 수 없는 변수

 

1. 문자열 변수 : spring

문자형 변수 char가 여러 개 모였을 때 완성

Apple = A+p+p+l+e

String message = "Hello World"; // 문자열을 저장합니다.

 

2. 그 외

Object, Array, List

객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장

List<int> alphabet = [0,1,2,3]; // 기본형 변수 여러개를 저장합니다.
// 참조형! 배열 변수

        int[]a = {1,2,3};
        System.out.println(Arrays.toString(a));

레퍼 클래스 변수

Wrapper Class

기본형 변수(int, byte, boolen..)를 클래스로 감싸는 변수

레퍼 클래스로 한 번 감싸면 유용한 기능을 사용가능

기본형 변수 타입명에서 첫 글자를 대문자로 바꾸어서 래퍼 클래스를 정의

1) 박싱

기본 타입에서 래퍼 클래스 변수로 변수를 감싸는 것

2) 언박싱

래퍼 클래스 변수를 기본 타입 변수로 가져오는 것

// 박싱 VS 언박싱

// 박싱
// Integer 래퍼 클래스 num 에 21 의 값을 저장
int number = 21;
Integer num = new Integet(number);

// 언박싱
int n = num.intValue(); // 래퍼 클래스들은 inValue() 같은 언박싱 메서드들을 제공해줍니다.
        // 레퍼 클래스 변수

        int number = 21;
        Integer num = number; //boxing
        System.out.println(num.intValue()); //unboxing

모든 기본 타입에는 래퍼 클래스가 있다.

클래스는 객체지향 언어인 Java 의 핵심기능이다

그렇기 때문에 클래스로 변수를 관리하면

객체지향의 많은 기능을 사용할 수 있게된다


숫자와 문자

아스키코드를 통해 숫자를 문자(char)로 매핑해서 표현한다

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // Scanner는 입력한 값을 저장

        int asciiNumber = sc.nextInt();
        char ch = (char)asciiNumber; // 문자로 '형변환'을 해주면 숫자에 맞는 문자로 표현된다

        System.out.println(ch);

    }
}
//값
//97
//a
public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // Scanner는 입력한 값을 저장

        char letter = sc.nextLine().charAt(0); // 첫번째 글자만 받아오기 위해 charAt(0) 매서드를 사용
        int asciiNumber = (int)letter; //숫자로 형변환을 해주면 저장되어있던 아스키 숫자값으로 표현
        System.out.println(asciiNumber);

    }
}

//값 
a
97

문자형과 문자열

 

문자형은 기본형

문자열은 참조형

 

1. 선언 관점에서 차이점

문자형 (Char)

문자 한 개만 저장하며 따옴표를 사용하여 값을 지정 (ex. ’A’)

char alphabet = 'A'; // 문자 하나를 저장합니다.

문자열 (String)

문자 여러 개를 문장형태로 저장하며 큰따옴표를 사용하여 범위를 지정 (ex. “ABCDEFG”)

String message = "Hello World"; // 문자열을 저장합니다.

2. 저장 관점에서 차이점

문자 (char)

문자 뒤에 \0(널문자)가 없습니다.

(1 byte 만 쓰기 때문에 끝을 알아서 데이터만 저장하면 됩니다.)

 

문자열 (String)

문장의 끝에 \0(널문자)가 함께 저장이 됩니다.

(몇 개의 byte를 쓸지 모르기 때문에 끝을 표시해야 합니다.)


+ 참조형

복잡한 친구

참조형 변수 = 주소형 변수

기본형 변수는 실제 값을 저장하는 저장공간인 반면

참조형 변수는 실제 값이 아닌 원본값의 주소값을 저장한다.

=크기가 크기 때문에 별도의 저장공간이 필요하다는 뜻

다시 말해 참조형 변수는 주소값을 저장하는 주소형 변수라고 불다.

 

저장 관점에서 차이점

기본형 변수 : 원본값이 Stack 영역에 있다

참조형 변수 : 원본값이 Heap 영역에 있다

 

Stack 영역에는 따로 저장해둔 원본값의 Heap 영역주소를 저장한다

 

Stack 영역 vs Heap 영역

Stack정적으로 할당된 메모리 영역

크기가 몇 byte인지 정해져 있는 기본형 변수를 저장한다

또 크기가 정해져 있는 참조형 변수의 주소 값도 저장한다.

Heap의 경우에는 동적으로 할당된 메모리 영역

크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장한다

동적 = 알 수 없을 때 = 동적으로 그 크기에 맞게 커진다

예) int는 4바이트를 사용하는 정적인 영역과 반대 개념


입력&출력

입력

Java 프로그램에서는

Scanner.in 객체의 next() 명령을 사용해서 입력

출력

System.out 객체의 println() 명령을 사용해서 출력

Scanner sc = new Scanner(System.in); // Scanner 객체를 new 명령어로 생성합니다.
String input = sc.next();  // sc(Scanner)의 .next(); 를 실행하면 input 변수에 입력한 글자를 받을 수 있습니다.
Scanner sc = new Scanner(System.in);
String input = sc.next();  

System.out.println("입력값 : " + input);  // 입력한 글자를 출력합니다.

// 실행 결과
{입력}
입력값 : {입력}

비트&바이트

변수는 Byte(바이트) 에 나누어서 저장한다

Byte = 8 Bit

 

Bit

Bit(비트)는 0,1 형태의 2진수 데이터

로컴퓨터가 저장(표현)할 수 있는 최소 단위

 

정수형 값

10진수 숫자(0~10범위의 숫자)

2진수(0~1범위)Bit 로 저장(표현) 

4개의 Bit로 16진수 숫자(0~F(16)범위의 숫자)를

2진수(0~1범위)Bit 로 저장(표현).


형변환

변수의 타입을 바꾸는 방법

예) 문자열 -> 숫자,

숫자 -> 실수,

실수 -> 정수

 

public static void main(String[] args) {
        // double or float형 -> int
        // 실수 -> 정수 (0.xxx -> 0)

//      정수 - > 실수
        int intNumber = 10;
        double doubleNumber = (double)intNumber;
        float floatNumber = (float)intNumber;

        System.out.println("intNumber => " + intNumber);
        System.out.println("doubleNumber => " + doubleNumber);
        System.out.println("floatNumber =>"  + floatNumber);

        값
        intNumber => 10
        doubleNumber => 10.0
        floatNumber =>10.0

 


자동 형변환

자동으로 형변환해주는 것

자동 타입변환은 작은 크기의 타입에서 큰 크기의 타입으로

저장될 때 큰 크기로 형변환이 발생

예시

public static void main(String[] args) {
      byte byteNumber = 10;
      int intNumber = byteNumber;

//     int -> long number 형변환
        intNumber = 100;
        long longNumber = intNumber;
        System.out.println(longNumber);

//    int -> double
        intNumber = 200;
        double doubleNumber = intNumber;
        System.out.println(doubleNumber);

// 		작은 크기의 타입이 큰 크기의 타입가 '계산'될 때, 자동으로 큰 크기의 타입으로 형변환이 된다
        int intNumber = 10;
        double doubleNumber = 5.5;

        double result = intNumber + doubleNumber ;
        System.out.println("Plus ==> "+ result);

 

  • 작은 타입 > 큰 타입 형변환시 (자동 형변환)
    • 더 큰 표현범위를 가진 타입으로 변환되는것이라 값의 손실이 없다
    • 컴파일러가 자동으로 형변환을 해준다.
  • 큰 타입 > 작은 타입 형변환시 (강제 형변환 = 캐스팅)
    • 더 작은 표현범위를 가진 타입으로 변환된는것이라 값의 손실이 생긴다.
    • 값의 손실이 생기기 때문에 자동으로 형변환을 해주지 않고 개발자가 선택하여 형변환을 한다.

 

 

출처 : 스파르타코딩클럽 <내일배움캠프>

[Java 문법 종합반] 최원장 튜터님