02 변수와 타입

winA·2025년 7월 1일

BE/Java

목록 보기
4/16
post-thumbnail

💛 변수

변수

하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름

자바의 변수는 한번에 한가지 타입의 데이터만 저장이 가능하다.

변수 선언

변수를 사용하기 위해서는 변수를 먼저 선언해줘야 한다.

  • 저장할 데이터의 타입
  • 변수의 이름(첫번째 글자는 문자, 캐멀스타일)
int age;
double pi;

변수 선언은 저장되는 값의 타입과 이름만 결정한 것이다.

변수 초기화

변수에 최초로 값이 대입될 때 메모리가 할당 되고, 해당 메모리에 값이 저장된다. 따라서 변수를 사용하기 위해서는 반드시 초기화 작업을 진행해줘야 한다.

자바에서는 변수의 위치에 따라 초기화 규칙이 조금 다르다.

  • 필드(클래스 안에서 선언한 변수)는 자동으로 초기화가 된다. 각 타입의 0에 해당하는 값이 할당된다.
  • 지역변수(메서드 안에서 선언한 변수)는 자동 초기화가 되지 않는다. 초기화되지 않은 변수를 연산식에 사용할 경우 컴파일 에러(The local variable value may not have been initialized)가 발생한다.

💛 정수 타입

자바의 데이터 타입

컴파일러 언어에서는 개발자가 변수를 선언할 때, 개발자가 어떤 타입인지 명확하게 정해줘야 한다. 그 타입에 따라 얼마만큼의 메모리를 쓸지 컴파일러가 결정하게 된다.

기본 타입(primitive type)

값의 분류기본 타입
정수byte, char, short, int, long
실수float, double
논리(true/false)boolean

primitive type은 해당 타입명에 크기가 고정돼있다.

변수는 선언할 때 데이터를 저장할 수 있는 해당 타입에 따라 메모리가 확보된다.

타입메모리 크기
byte1byte
short2byte
char2byte
int4byte
long8byte

int는 총 20억개의 데이터를 저장할 수 있다. 최상위 비트는 부호 bit로 사용되고, 나머지 bit는 값의 범위를 결정한다.

최상위 비트가 0이면 양수, 1이면 음수이다.

byte = 128로 설정하면 byte가 표현할 수 있는 범위를 넘어서기 때문에 오류가 발생한다. 자바에서 byte 타입은 128부터 127까지만 표현 가능하다.

기본적으로 컴파일러는 정수 리터럴을 int 타입 값으로 간주하기 때문에 long은 숫자 뒤에 L(l)을 붙여줘서 해당 숫자가 long 타입임을 컴파일러에게 알려줘야 한다. long var4 = 1000000000000**L**;, long 타입은 은행이나 과학 분야에서 많이 사용된다.

정수 리터럴 표기법

  • 2진수: 0b(B)로 시작하고 0과 1로 작성한다.
  • 8진수: 0으로 시작하고 0~7의 숫자로 작성한다.
  • 10진수: 소수점이 없는 0~9의 숫자로 작성한다.
  • 16진수: 0x(X)로 시작하고, 0~9-A~F(a~f)로 작성한다.

따로 설정을 해주지 않고, println에서 출력하면 10진수로 인식하여 출력하게 된다.

💛 문자 타입

하나의 문자를 작은따옴표()로 감싼 것

컴퓨너는 기계이기 때문에 숫자만 다룰 수 있다. 그렇다면 문자는 어떻게 인식할 것인가?

1byte로 표현할 수 있는 문자의 갯수는 256개이다. 한글로 표현할 수 있는 글자수(초성중성종성)는 7천개가 넘기 때문에 한글은 2byte로 보통 처리한다. 이외에도 언어가 섞이면 2byte로도 부족하기 때문에 unicode(3byte) 체계를 사용하기 시작했다. char 타입은 해당 유니코드를 한글자씩 저장한다.

char는 또 다르게 말하면 숫자를 사람이 알아보기 쉽게 변환하여 보여주는 것이기 때문에 실제 타입은 정수 타입에 속한다. 그래서 char타입에 유니코드를 직접 저장해도 문제없이 저장이 된다.

자바는 기본적으로 utf-8을 이용해서 문자를 처리한다.

public class CharExample {

  public static void main(String[] args) {
    char c1 = 'A'; //문자 저장
    char c2 = 65; //유니코드 직접 저장
    char c3 = '가'; //문자 저장
    char c4 = 44032; //유니코드 직접 저장
    
    System.out.println(c1);
    System.out.println(c2);
    System.out.println(c3);
    System.out.println(c4);
  }
}

char 타입의 변수를 초기화할 목적으로 ‘’을 대입하면 컴파일 에러가 발생한다. char타입의 변수를 초기화할 때는 ‘ ‘의 공백 하나를 포함해서 초기화 해줘야 한다.

💛 실수 타입

타입메모리 크기구성
float4byte(32bit)부호(1bit)+지수(8bit)+가수(23bit)
double8byte(64bit)부호(1bit)+지수(11bit)+가수(52bit)
double x = 0.25;
double y = 0.12E-2; //0.12*10^(-2)=0.0012

실수에서는 가수(유효숫자)의 부분이 얼마나 정밀하냐가 중요하다. 실수의 정밀성이 가장 중요시 되기 때문에 더 정밀하게 표현할 수 있는 double실수의 표준으로 사용하고 있다. double 타입은 float 타입보다 약 2배의 유효 자릿수를 가져서 더 정확한 데이터의 표현이 가능한 것이다.

표준이 double이기 때문에 float을 나타낼 때는 리터럴 뒤에 f(F)를 붙여서 컴파일러가 float 타입임을 알 수 있게 해준다.

💛 논리 타입

참과 거짓을 의미하는 truefalse로 구성

사용처

  • 두가지 상태값을 저장해야 한다.
  • 상태값에 따라 조건문과 제어문의 실행흐름을 변경한다.

💛 문자열 타입

작은따옴표()로 감싼 한 개의 문자는 char 타입이지만, 큰따옴표()로 감싼 여러 개의 문자들은 유니코드로 변환되지 않는다.

큰따옴표로 감싼 문자들

문자열을 변수에 저장하고 싶다면 다음과 같이 String 타입을 사용해야 한다. String은 참조타입이다.

이스케이프 문자

이스케이프 문자출력
\”“문자 포함
\’'문자 포함
\\문자 포함
\u16진수16진수 유니코드에 해당하는 문자 포함
\t출력 시 탭만큼 띄움
\n출력 시 줄바꿈
\r출력 시 캐리지 리턴

텍스트 블록 문법

큰따옴표 3개로 감싸면 이스케이프하거나 라인피드를 할 필요가 없이 작성된 그대로 문자열로 저장된다.

    String str1 = "" +
        "{\n" +
        "\t\"id\":\"winter\",\n" +
        "\t\"name\":\"눈송이\"\n" +
        "}";

    String str2 = """
        {
        "id":"winter",
        "name":"눈송이"
        }
        """;

💛 자동 타입 변환

값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 대입될 때 발생한다.

byte byteValue = 10;
int intValue = byteValue; //자동 타입 변환

이 부분은 개발자가 따로 처리해줄 부분 없이 자바가 자동으로 처리 한다.

  • intlong
  • longfloat
  • longdouble
  • 정수→실수

💛 강제 타입 변환(casting)

허용 범위가 큰 타입에서 허용 범위가 작은 타입으로 자동 타입 변환 될 수는 없다.

큰 허용 범위 타입을 작은 허용 범위 타입으로 쪼개어서 저장하는 것을 강제 타입 변환이라고 한다.

작은허용범위타입 = (작은허용범위타입) 큰허용범위타입

만약 int의 값이 1byte를 넘어간 값이라면 원래 int값은 보장되지 않는다. intbyte에서 보장할 수 있는 값은 -128~127이다.

// int -> byte
int intValue = 10;
byte byteValue = (byte) intValue;

// long -> int
long longValue = 300;
int intValue = (int) longValue;

// int -> char
int intValue = 65;
char charValue = (char) intValue;

// 실수 -> 정수
double doubleValue = 3.14;
int intValue = (int) doubleValue;

💛 연산식에서 자동 타입 변환

  • 연산식에서 int 타입의 자동 변환: 정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 int 타입보다 작은 byte, short 타입 변수는 int 타입으로 자동 변환되어 연산이 수행된다.
    byte x = 10;
    byte y = 20;
    // byte result = x+y; //컴파일 에러
    int result = x+y;
  • 연산식에서 long 타입의 자동 변환: 다른 타입의 피연산자들이 long 타입으로 변환되어 계산된다.
  • 연산식에서 실수 타입의 자동 변환
    • float만 있는 경우 float로 계산한다
    • double이 있는 경우 모두 double로 자동 변환 후 계산한다
    • int 타입과 double 타입이 연산에 있는 경우 double 타입으로 자동 변환 된다. 정수 타입으로 계산을 원하는 경우에는 강제 형변환을 해줘야 한다.
    • int 연산자를 실수 연산을 원한다면 피연산자 중 최소 하나double로 강제 형변환해줘야 한다.

String 타입 자동 변환

+연산자는 피연산자가 모두 숫자일 때 덧셈 연산을 수행하는 역할을 하지만, 피연산자 중 하나가 문자열일 경우에는 나머지 피연산자도 문자열로 자동 변환하고, 문자열 결합 연산을 수행하는 역할도 한다.

int value = 3+7; //10
String str = "3"+7; //"37"

💛 문자열을 기본 타입으로 변환

프로그램에서 문자열로 입력을 받았지만, 연산은 숫자로 진행해야 하는 경우가 있다. 이때 문자열을 기본 타입으로 변환한 후 연산 작업을 진행해줘야 한다.

변환 타입사용 예
Stringbytebyte value=Byte.parseByte(str);
Stringshortshort value=Short.parseShort(str);
Stringintint value=Integer.parseInt(str);
Stringlonglong value=Long.parseLong(str);
String→floatfloat value=Float.parseFloat(str);
Stringdoubledouble value=Double.parseDouble(str);
Stringbooleanboolean value=Boolean.parseBoolean(str);

💛 변수 사용 범위

중괄호 {} 블록 내에서 선언된 변수는 해당 중괄호 {} 블록 내에서만 사용이 가능하고 밖에서는 사용할 수 없다.

💛 콘솔로 변수값 출력

메소드의미
println(내용);괄호 안의 내용을 출력하고 행을 바꿔라
print(내용);괄호 안의 내용을 출력하고 행은 바꾸지 말아라
printf(”형식문자열”, 값1,값2);형식 문자열에 맞추어 뒤의 값을 출력해라

형식 문자열 형식: %[argument_index$][flags] [width][.precision] conversion

  • %d: 정수(123)
  • %6d: 6자리 정수, 왼쪽 빈자리 공백( 123)
  • %-6d: 6자리 정수, 오른쪽 빈자리 공백(123 )
  • %06d: 6자리 정수, 왼쪽 빈자리 0 채움(000123)

💛 키보드 입력 데이터를 변수에 저장

Scanner 타입 변수 활용하기

  1. Scanner 타입 변수를 선언한다.

  2. 대인 연산자 =를 사용해서 new 연산자로 생성한 Scanner 객체를 변수에 대입한다.

    Scanner sc = new Scanner(System.in);
  3. sc.nextLine()을 실행하면 키보드로 입력된 내용을 문자열로 읽고 좌측 String 변수에 저장한다.

    String inputData = sc.nextLine();

0개의 댓글