Language/Java

[Java] 자바 타입 - 변수, 상수, 기본/참조형 타입, 타입 변환

재은초 2024. 4. 6. 11:44
반응형

변수(variable)란?

  • 변수(variable)란 데이터(data)를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 의미한다.

이름 생성 규칙

  • 변수의 이름은 영문자(대소문자), 숫자, 언더스코어(_), 달러($)로만 구성할 수 있다.
  • 변수의 이름은 숫자로 시작할 수 없다.
  • 변수의 이름 사이에는 공백을 포함할 수 없다.
  • 변수의 이름으로 자바에서 미리 정의된 키워드(keyword)는 사용할 수 없다.

 

변수 종류

기본 타입(primitive type) 

  • 자바에서는 여러 형태의 타입을 미리 정의하여 제공하고 있는데, 이것을 기본 타입(primitive type)이라고 하며 실제 연산에 사용된다.
  • 자바의 기본 타입은 모두 8종류가 제공되며, 크게는 정수형, 실수형, 문자형 그리고 논리형 타입으로 나눌 수 있다. 

정수형(byte, short, int, long)

  • 자바에서 정수란 부호를 가지고 있으며, 소수 부분이 없는 수를 의미한다.
  • 자바에서 정수형 타입 중 기본이 되는 타입은 int형으로, 내부적으로 정수형 중에서도 int형의 데이터를 가장 빠르게 처리한다.
  • 정수형 데이터의 타입을 결정할 때에는 반드시 자신이 사용하고자 하는 데이터의 최대 및 최소 크기를 고려해야 한다.
  • 해당 타입이 표현할 수 있는 범위를 벗어난 데이터를 저장하면, 오버플로우(overflow)나 언더플로우(underflow)가 발생해 전혀 다른 값이 저장될 수 있기 때문이다.
오버플로우(overflow)란 해당 타입이 표현할 수 있는 최대 범위보다 큰 수를 저장할 때 발생하는 현상을 가리킨다.
언더플로우(underflow)란 해당 타입이 표현할 수 있는 최소 범위보다 작은 수를 저장할 때 발생하는 현상을 가리킨다. 

실수형(float, double)

  • 자바에서 실수란 소수부나 지수부가 있는 수를 가리키며, 정수보다 훨씬 더 넓은 표현 범위를 가진다.
  • 실수형 타입 중 기본이 되는 타입은 double형이다.
  • 실수형 데이터의 타입을 결정할 때에는 표현 범위 이외에도 반드시 유효 자릿수를 고려해야 한다.
  • 자바뿐만 아니라 모든 프로그래밍 언어에서 실수를 표현하는 방식은 오차가 발생할 수 밖에 없는 태생적 한계를 지닌다.

문자형(char)

  • 자바에서 문자형 데이터란 작은 정수나 문자 하나를 표현할 수 있는 타입을 의미한다.
  • 컴퓨터는 2진수밖에 인식하지 못하므로 문자도 숫자로 표현해야 인식할 수 있는데, 자바에서는 유니코드(unicode)를 사용하여 문자를 표현한다.
C언어와 C++에서는 아스키코드(ASCII)를 사용하여 문자를 표현하고 자바는 유니코드(unicode)를 사용하여 문자를 표현한다. 아스키코드(ASCII)는 영문 대소문자를 사용하는 7비트의 문자 인코딩 방식이다. 아스키코드는 문자 하나를 7비트로 표현하므로, 총 128개의 문자를 표현할 수 있다. 아스키코드는 영문자와 숫자밖에 표현 못 하는 반면에, 유니코드는 각 나라의 모든 언어를 표현할 수 있다. 유니코드는 문자 하나를 16비트로 표현하므로, 총 65,536개의 문자를 표현할 수 있다.

논리형(boolean)

  • 논리형은 참(true)이나 거짓(false) 중 한 가지 값만을 가질 수 있는 불리언 타입을 의미한다.
  • boolean형의 기본값은 false이며, 기본 타입 중 가장 작은 크기인 1바이트의 크기를 가진다.

참조형(reference type) 변수

  • 참조형 변수는 8개의 기본형 변수를 사용하여 사용자가 직접 만들어 사용하는 변수를 의미한다.

 

변수 선언 방법

  • 자바에서는 변수를 사용하기 전에 반드시 먼저 변수를 선언하고 초기화해야 한다.

변수 선언만 하는 방법

  • 먼저 변수를 선언하여 메모리 공간을 할당받고, 나중에 변수를 초기화하는 방법이다.
  • 하지만 초기화되지 않은 변수는 해당 메모리 공간에는 알 수 없는 쓰레깃값만이 들어가 있으므로 반드시 초기화한 후에 사용해야 한다.
  • 자바에서는 프로그램의 안전성을 위해 초기화하지 않은 변수는 사용할 수 없도록 하고 있으므로, 초기화되지 않은 변수를 사용하려면 자바 컴파일러는 오류를 발생시킨다.
  • 아래 예제처럼 정수를 저장하기 위한 메모리 공간을 할당받으면, 반드시 해당 타입의 데이터만을 저장해야 한다. 만약 다른 타입의 데이터를 저장하려고 하면, 자바 컴파일러는 오류를 발생시킨다.
타입 변수이름;
int num;                 // 변수의 선언
System.out.println(num); // 오류 발생
num = 20;                // 변수의 초기화
System.out.println(num); // 20

변수 선언과 동시에 초기화하는 방법

  • 자바에서는 변수의 선언과 동시에 그 값을 초기화할 수 있다
  • 선언하고자 하는 변수들의 타입이 같다면 이를 동시에 선언할 수도 있지만, 선언하고자 하는 변수의 타입이 서로 다르면 동시에 선언할 수 없다.
1. 타입 변수이름[, 변수이름];
2. 타입 변수이름 = 초깃값[, 변수이름 = 초깃값];
int num1, num2;                  // 같은 타입의 변수를 동시에 선언함
double num3 = 3.14;              // 선언과 동시에 초기화함
double num4 = 1.23, num5 = 4.56; // 같은 타입의 변수를 동시에 선언하면서 초기화함
double num1, num2;        // 같은 타입의 변수를 동시에 선언
num1 = 1.23, num2 = 4.56; // 하지만 이미 선언된 여러 변수를 동시에 초기화할 수는 없음

 

상수(constant)란?

  • 상수(constant)란 변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간이다. 하지만 상수가 변수와 다른 점은 프로그램이 실행되는 동안 메모리에 저장된 데이터를 변경할 수 없다는 점이다.
  • 자바에서는 final 키워드를 사용하여 상수를 선언하며, 이러한 상수는 선언과 동시에 반드시 초기화해야 한다.
  • 자바에서 상수의 이름은 일반적으로 모두 대문자를 사용하여 선언하며, 여러 단어로 이루어진 이름의 경우에는 언더스코어(_)를 사용하여 구분한다.
final int AGES = 30;

 

리터럴(literal)이란?

  • 리터럴(literal)이란 그 자체로 값을 의미한다.

타입에 따른 리터럴

  • 정수형 리터럴(Integer literals)은 123, -456과 같이 아라비아 숫자와 부호로 직접 표현된다.
  • 실수형 리터럴(floating-point literals)은 3.14, -45.6과 같이 소수 부분을 가지는 아라비아 숫자로 표현된다.
  • 논리형 리터럴(boolean literals)은 true나 false로 표현된다.
  • 문자형 리터럴(character literals)은 'a', 'Z'와 같이 작은따옴표('')로 감싸진 문자로 표현된다.
  • 문자열 리터럴(string literals)은 "자바", "홍길동"과 같이 큰따옴표("")로 감싸진 문자열로 표현된다.
  • null 리터럴(null literals)은 단 하나의 값인 null로 표현되며, null이란 아무런 값도 가지고 있지 않은 빈 값을 의미한다.

리터럴 타입 접미사(literal type suffix)

  • 리터럴 뒤에 추가되어 해당 리터럴의 타입을 명시해주는 접미사를 리터럴 타입 접미사(literal type suffix)라고 한다.

https://www.tcpschool.com/java/java_datatype_constant

 

타입 변환(type conversion)

  • 자바에서는 boolean형을 제외한 나머지 기본 타입 간의 타입 변환을 자유롭게 수행할 수 있다.
  • 자바에서 다른 타입끼리의 연산은 우선 피연산자들을 모두 같은 타입으로 만든 후에 수행된다.
  • 메모리에 할당받은 바이트의 크기가 상대적으로 작은 타입에서 큰 타입으로의 타입 변환은 생략할 수 있다. 하지만 메모리에 할당받은 바이트의 크기가 큰 타입에서 작은 타입으로의 타입 변환은 데이터의 손실이 발생한다. 따라서 상대적으로 바이트의 크기가 작은 타입으로 타입 변환을 할 경우 자바 컴파일러는 오류를 발생시킨다.

타입 변환의 종류

묵시적 타입 변환(자동 타입 변환, implicit conversion)

  • 묵시적 타입 변환이란 대입 연산이나 산술 연산에서 컴파일러가 자동으로 수행해주는 타입 변환을 가리킨다.
  • 자바에서는 데이터의 손실이 발생하지 않거나, 데이터의 손실이 최소화되는 방향으로 묵시적 타입 변환을 진행하며, 자바에서는 데이터의 손실이 발생하는 대입 연산은 허용하지 않는다.
  • 자바에서는 타입의 표현 범위에 따라 다음과 같은 방향으로 자동 타입 변환이 이루어진다.
    byte형 → short형 → int형 → long형 → float형 → double형
                     char형 ↗
double num1 = 10;            // double형 변수에 int형 데이터 대입, int형 데이터가 double형으로 자동 타입 변환
// int num2 = 3.14;          // int형 변수가 표현할 수 있는 범위보다 더 큰 double형 데이터를 대입하므로 데이터의 손실, 에러 발생
double num3 = 7.0f + 3.14;   // 데이터의 손실이 최소화되도록 float형 데이터가 double형으로 자동 타입 변환

System.out.println(num1);    // 10.0
System.out.println(num3);    // 10.14

명시적 타입 변환(강제 타입 변환, explicit conversion)

  • 명시적 타입 변환이란 사용자가 타입 캐스트 연산자(())를 사용하여 강제적으로 수행하는 타입 변환을 가리킨다.
(변환할타입) 변환할데이터              // 데이터의 앞에 괄호(())를 타입 캐스트(type cast) 연산자라고 한다
  • 자바에서 산술 연산을 수행하고 얻는 결괏값의 타입은 언제나 피연산자의 타입과 일치해야 한다.
int num1 = 1, num2 = 4;

double result1 = num1 / num2;             // 원래 0.25가 반환되야하지만, int형으로 자동 타입 변환되어 0이 반환
double result2 = (double) num1 / num2;    // 피연산자 중 하나를 double형으로 강제 타입 변환, 나머지도 double형으로 자동 타입 변환 

System.out.println(result1);             // 0.0
System.out.println(result2);             // 0.25

 

Reference

반응형