"정수형"의 두 판 사이의 차이
(→자동 타입 변환) |
잔글 |
||
(사용자 4명의 중간 판 43개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
− | ''' | + | '''정수형'''(int)이란 프로그램 개발 시 [[정수]] 형식의 데이터를 처리하기 위한 [[변수]](variable)이다. '''int'''라고 쓴다. int는 'integer'의 약자이다.<ref name="위키백과">〈[https://ko.wikipedia.org/wiki/Int_(C_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4) int (C 프로그래밍 언어)]〉, 《위키백과》</ref> |
− | |||
==개요== | ==개요== | ||
− | int는 정수형을 처리하기 위한 변수로, [[char]]와 같은 구조와 특성을 | + | int는 정수형을 처리하기 위한 변수로, [[char]]와 같은 구조와 특성을 가진다. char는 모든 [[CPU]]에서 무조건 8비트인 것에 비해, 16, 32, 64비트의 처리 단위로 CPU마다 다르다는 차이가 있다. 보통 8비트 CPU는 16비트의 처리 단위를 가지며, 32비트 CPU이면 32비트의 처리 단위를 갖는 것이 일반적인 정수형 처리이다. char와 마찬가지 CPU의 [[ALU]]을 사용하여 연산 처리한다. 8비트 CPU는 16비트 처리 단위인 int의 16비트를 처리하기 위해 여러 개의 [[기계어]] [[코드]]를 사용한다. 따라서 8비트 CPU는 32비트 CPU보다 처리 시간이 더 걸린다.<ref name="위키백과"></ref> |
==크기== | ==크기== | ||
+ | int는 4 byte이자 32 bit의 크기를 가진 자료형으로 가장 보편적으로 쓰이는 정수형이다. 32 bit에는 4,294,967,296개의 숫자를 저장할 수 있다. 이 숫자는 별로 중요하지 않다. 이 숫자를 기억하는 것보다 숫자가 2^32개를 저장 할 수 있다는 것으로 이해하면 된다. 마찬가지로 반으로 나눠 반은 음수를 나머지 반은 0과 양수를 표현한다면, 표현할 수 있는 숫자의 범위는 -2,147,483,648 ~ 2,147,483,647이다.<ref>삐멜 소프트웨어 엔지니어, 〈[https://imasoftwareengineer.tistory.com/48 2. 자바 변수와 자료형 (3) byte, short, int, long]〉, 《티스토리》, 2019-03-04</ref> | ||
+ | |||
+ | ==데이터 타입== | ||
+ | {|class=wikitable width=800 | ||
+ | |- | ||
+ | !align=center|표현 형태 | ||
+ | !align=center|데이터 타입 | ||
+ | !align=center|메모리의 크기 | ||
+ | !align=center|표현 가능 범위 | ||
+ | |- | ||
+ | |align=center rowspan="4"|정수형 | ||
+ | |align=center|byte | ||
+ | |align=center|1 byte | ||
+ | |align=center|-128 ~ 127 | ||
+ | |- | ||
+ | |align=center|short | ||
+ | |align=center|2 byte | ||
+ | |align=center|-32,768 ~ 32,767 | ||
+ | |- | ||
+ | |align=center|int | ||
+ | |align=center|4 byte | ||
+ | |align=center|-2,147,483,648~2,147,483,647 | ||
+ | |- | ||
+ | |align=center|long | ||
+ | |align=center|8 byte | ||
+ | |align=center|-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | ||
+ | |- | ||
+ | |align=center rowspan="2"|실수형 | ||
+ | |align=center|float | ||
+ | |align=center|4 byte | ||
+ | |align=center|±(1.40129846432481707e-45 ~ 3.40282346638528860e+38) | ||
+ | |- | ||
+ | |align=center|double | ||
+ | |align=center|8 byte | ||
+ | |align=center|±(4.94065645841246544e-324d ~ 1.79769313486231570e+308d) | ||
+ | |- | ||
+ | |align=center|문자형 | ||
+ | |align=center|char | ||
+ | |align=center|2 byte | ||
+ | |align=center|모든 유니코드 문자 | ||
+ | |- | ||
+ | |align=center|논리형 | ||
+ | |align=center|boolean | ||
+ | |align=center|1 byte | ||
+ | |align=center|true / false | ||
+ | |} | ||
− | + | 어떤 숫자를 저장하느냐에 따라서 사용하는 메모리의 크기가 달라지는 것이 아니고, 어떤 [[데이터 타입]]으로 변수를 선언했느냐에 따라서 사용하는 메모리의 크기가 달라지는 것이다. 결국, 변수에 들어올 수 있는 숫자의 최대 크기를 잘 판단해서 데이터 타입을 지정해야 메모리의 용량을 아낄 수 있다.<ref>〈[https://opentutorials.org/course/2517/13987 데이터 타입]〉, 《오픈튜토리얼스》, 2016-11-03</ref> | |
==변수 선언== | ==변수 선언== | ||
− | [[자바]](Java)에서 | + | [[자바]](Java)에서 정수형 변수뿐만 아니라 모든 변수는 사용하기 전에 반드시 먼저 변수를 선언하고 초기화해야 한다. 변수란 [[데이터]]를 저장하기 위해 프로그램에 의해 이름을 할당받은 [[메모리]] 공간을 의미한다. 즉, 변수란 데이터를 저장할 수 있는 메모리 공간을 의미하며, 이렇게 지정된 값은 변경될 수 있다. 또한 변수는 타입에 따라 크게 기본형(primitive type) 변수와 참조형(reference type) 변수로 구분할 수 있다. [[기본형 변수]]는 실제 연산에 사용되는 변수다. 자바에서는 8가지의 기본형 변수를 제공하고 있다. 정수형인 [[byte]], [[short]], int, [[long]]을 제공하고, 실수형인 [[float]]와 [[double]], 문자형인 [[char]], 논리형인 [[boolean]]을 제공한다. [[참조형 변수]]는 8개의 기본형 변수를 사용하여 사용자가 직접 만들어 사용하는 변수를 의미한다. |
− | |||
− | |||
===변수의 이름 생성 규칙=== | ===변수의 이름 생성 규칙=== | ||
− | 자바에서는 변수뿐만 아니라 클래스(class), 메소드(method)등의 이름을 | + | 변수의 이름은 해당 변수에 저장될 데이터의 의미를 잘 나타내도록 짓는 것이 좋다. 자바에서는 변수뿐만 아니라 클래스(class), 메소드(method) 등의 이름을 설정할 때 반드시 지켜야 하는 공통된 규칙이 있다. |
+ | |||
* 변수의 이름은 영문자(대소문자), 숫자, 언더스코어(_), 달러($)로만 구성할 수 있다. | * 변수의 이름은 영문자(대소문자), 숫자, 언더스코어(_), 달러($)로만 구성할 수 있다. | ||
* 변수의 이름은 숫자로 시작할 수 없다. | * 변수의 이름은 숫자로 시작할 수 없다. | ||
− | * 변수의 이름 사이에는 공백을 | + | * 변수의 이름 사이에는 공백을 포함할 수 없다. |
* 변수의 이름으로 자바에서 미리 정의된 [[키워드]](keyword)는 사용할 수 없다. | * 변수의 이름으로 자바에서 미리 정의된 [[키워드]](keyword)는 사용할 수 없다. | ||
− | |||
===변수 선언만 하는 방법=== | ===변수 선언만 하는 방법=== | ||
− | 이 방법은 먼저 변수를 선언하여 메모리 공간을 | + | 이 방법은 먼저 변수를 선언하여 메모리 공간을 할당받고, 나중에 변수를 초기화하는 방법이다. 하지만 이렇게 선언만 된 변수는 초기화되지 않음으로, 해당 메모리 공간에는 알 수 없는 값들이 들어가 있다. 따라서 선언만 된 변수는 반드시 초기화한 후에 사용해야 한다. 자바에서는 프로그램의 안전성을 위해 초기화하지 않는 변수는 사용할 수 없도록 하고 있다. 만약 초기화되지 않은 변수를 사용하려고 하면, 자바 [[컴파일러]]는 오류를 발생시킬 것이다. |
+ | |||
타입 변수이름; | 타입 변수이름; | ||
− | + | ||
− | int num; // 변수의 선언 | + | int num; // 정수형 변수의 선언 |
System.out.println(num); // 오류 발생 | System.out.println(num); // 오류 발생 | ||
num=10; // 변수의 초기화 | num=10; // 변수의 초기화 | ||
System.out.println(num); // 10 | System.out.println(num); // 10 | ||
− | |||
− | ===변수 선언 동시에 | + | 위에 내용처럼 정수를 저장하기 위한 메모리 공간을 할당받으면, 반드시 해당 타입의 데이터만 저장해야 한다. 만약 다른 타입의 데이터를 저장하려고 하면, 자바 컴파일러는 오류를 발생시킬 것이다. |
+ | |||
+ | ===변수 선언 동시에 초기화하는 방법=== | ||
자바에서는 변수의 선언과 동시에 그 값을 초기화할 수 있다. 그리고 선언하고자 하는 변수들의 타입이 같다면 이를 동시에 선언도 가능하다. | 자바에서는 변수의 선언과 동시에 그 값을 초기화할 수 있다. 그리고 선언하고자 하는 변수들의 타입이 같다면 이를 동시에 선언도 가능하다. | ||
− | |||
− | |||
− | int num1,num2; // 같은 타입의 변수를 동시에 선언한다. | + | 타입 변수 이름, 변수 이름; // 같은 타입의 변수를 동시에 선언한다. |
+ | 타입 변수 이름 = 초기화값, 변수이름 = 초기화 값; // 같은 타입의 변수를 동시에 선언하면서 초기화한다. | ||
+ | |||
+ | int num1, num2; // 같은 타입의 변수를 동시에 선언한다. | ||
int num3 = 3; // 선언과 동시에 초기화 한다. | int num3 = 3; // 선언과 동시에 초기화 한다. | ||
double num4 = 1.23, num5 = 9.87 // 같은 타입의 변수를 동시에 선언하면서 초기화한다. | double num4 = 1.23, num5 = 9.87 // 같은 타입의 변수를 동시에 선언하면서 초기화한다. | ||
+ | |||
위에 내용처럼 선언하고자 하는 변수의 타입이 서로 다르면 동시에 선언할 수 없고, 여러 변수를 동시에 초기화할 수 없다. | 위에 내용처럼 선언하고자 하는 변수의 타입이 서로 다르면 동시에 선언할 수 없고, 여러 변수를 동시에 초기화할 수 없다. | ||
− | / | + | |
+ | /* 잘못된 예시 */ | ||
int num1,num2; // 같은 타입의 변수를 동시에 선언한다. | int num1,num2; // 같은 타입의 변수를 동시에 선언한다. | ||
... | ... | ||
− | num1 = 2, num2 = 3; // 이미 선언된 여러 변수를 동시에 | + | num1 = 2, num2 = 3; // 이미 선언된 여러 변수를 동시에 초기화할 수는 없다. |
− | 만약 위에 예제처럼 변수의 초기화를 동시에 하려면, 자바 컴파일러는 오류를 | + | |
+ | 만약 위에 예제처럼 변수의 초기화를 동시에 하려면, 자바 컴파일러는 오류를 발생시킬 것이다.<ref>〈[http://tcpschool.com/java/java_datatype_variable 7)변수]〉, 《TCP 스쿨》</ref> | ||
==타입 변환== | ==타입 변환== | ||
− | [[타입 변환]](type conversion)은 하나의 타입을 다른 타입으로 바꾸는 것을 말하며, 자바에서는 boolean형을 제외한 나머지 기본 타입 간의 타입 변환을 자유롭게 수행이 가능하다. 다른 타입끼리의 연산은 우선 | + | [[타입 변환]](type conversion)은 하나의 타입을 다른 타입으로 바꾸는 것을 말하며, 자바에서는 boolean형을 제외한 나머지 기본 타입 간의 타입 변환을 자유롭게 수행이 가능하다. 다른 타입끼리의 연산은 우선 [[피연산자]]들을 모두 같은 타입으로 만든 후에 수행하는데, 메모리에 할당 받은 [[바이트]]의 크기가 상대적으로 작은 타입에서는 큰 타입으로의 타입 변환은 생략할 수 있다. 하지만 메모리에 할당받은 바이트의 크기가 큰 타입에서 작은 타입으로의 타입 변환은 데이터의 손실이 발생하므로 자바 컴파일러는 오류를 발생시킬 것이다. 자바에서는 타입 변환을 크게 자동 타입 변환(묵시적 타입 변환, implicit conversion)과 강제 타입 변환(명시적 타입 변환, explicit conversion)으로 나뉜다. |
===자동 타입 변환=== | ===자동 타입 변환=== | ||
− | 자동 타입 변환(묵시적 타입 변환, implicit conversion)이란 대입 연산이나 산술 연산에서 | + | 자동 타입 변환(묵시적 타입 변환, implicit conversion)이란 대입 연산이나 산술 연산에서 [[컴파일러]]가 자동으로 수행해 주는 타입 변환을 말한다. 자바에서는 데이터의 손실이 발생하지 않거나, 데이터의 손실이 최소화되는 방향으로 자동 타입 변환을 진행하고 데이터의 손실이 발생하는 대입 연산은 허용하지 않는다. |
− | double num1 = 10; | + | |
− | //int num2 = 3.14; | + | double num1 = 10; // 1번 라인 |
− | double num3 = 7.0f + 3.14; | + | //int num2 = 3.14; // 2번 라인 |
+ | double num3 = 7.0f + 3.14; // 3번 라인 | ||
System.out.println(num1); | System.out.println(num1); | ||
System.out.println(num3); | System.out.println(num3); | ||
− | 실행 결과 | + | |
+ | 실행 결과 | ||
10.0 | 10.0 | ||
10.14 | 10.14 | ||
− | 위 내용에 | + | |
− | + | 위 내용에 1번 라인에서는 double형 변수에 int형 데이터를 대입하므로, int형 데이터가 double형으로 자동 타입 변환된다. 하지만 주석 처리된 2번 라인에서는 int형 변수가 표할 수 있는 범위보다 더 큰 double형 데이터를 대입하므로 데이터 손실이 발생하기 때문에 이 대입 연산에는 자바 컴파일러가 오류를 발생시킬 것이다. 3번 라인에서는 float형 데이터와 double형 데이터의 산술 연산을 수행하는데, 이때도 데이터의 손실이 최소화되도록 float형 데이터가 double형으로 자동 타입 변환된다. 이처럼 자바 컴파일러가 자동으로 수행하는 타입 변환은 언제나 데이터의 손실이 최소화되는 방향으로 이루어진다. | |
+ | |||
byte형 → short형 → int형 → long형 → float형 → double형 | byte형 → short형 → int형 → long형 → float형 → double형 | ||
char형 ↗ | char형 ↗ | ||
+ | |||
+ | 자바에서는 타입의 표현 범위에 따라 위에 내용과 같은 방향으로 자동 타입 변환이 이루어진다. | ||
+ | |||
+ | byte num1 = 100; // OK // 1번 라인 | ||
+ | byte num2 = 200; // Type mismatch // 2번 라인 | ||
+ | int num3 = 9876543210; // Out of range // 3번 라인 | ||
+ | long num4 = 9876543210; // Out of range // 4번 라인 | ||
+ | float num5 = 3.14; // Type mismatch // 5번 라인 | ||
+ | |||
+ | 위 내용에서 1번 라인에서는 byte형 변수에 표현 범위가 더 큰 int형 데이터를 대입하고 있다. 정수 100은 byte형 변수가 표현할 수 있는 범위 내에 있음으로 자동 타입 변환이 이루어져서 대입된다. 하지만 2번 라인에서 byte형 변수가 표현할 수 있는 범위를 벗어난 int형 데이터는 타입 변환되지 못하고 오류를 발생시킬 것이다. 5번 라인도 마찬가지로 float형 변수가 표현할 수 있는 범위를 벗어난 double형 데이터를 대입하므로 오류를 발생시킬 것이다. 3번 라인과 4번 라인 모두 'Out of range' 오류가 발생한다. 이것은 int형 [[리터럴]](literal)이 표현할 수 있는 최대 범위인 2,147,483,647을 초과하는 정수형 리터럴을 사용했기 때문이다.<ref name="TCP SCHOOL">〈[http://tcpschool.com/java/java_datatype_typeConversion 11)타입 변환]〉, 《TCP 스쿨》</ref> | ||
+ | 리터럴(literal)이란 소스 [[코드]]의 고정된 값을 대표하는 용어다.<ref>〈[https://ko.wikipedia.org/wiki/%EB%A6%AC%ED%84%B0%EB%9F%B4 리터럴]〉, 《위키백과》</ref> | ||
+ | |||
+ | int num1=9876543210L; // Type mismatch // 6번라인 | ||
+ | long num4=9876543210L; // OK | ||
+ | |||
+ | 이렇게 int형 리터럴(literal) 보다 더 큰 정수를 사용하기 위해서는 리터럴의 마지막에 L이나 I접미사를 추가하여 long형 리터럴(literal)로 명시해야만 한다. 하지만 6번 라인에서 int형 변수가 표현할 수 있는 범위를 벗어난 long형 데이터를 대입하므로 오류를 발생시킬 것이다. | ||
===강제 타입 변환=== | ===강제 타입 변환=== | ||
+ | 강제 타입 변환(명시적 타입 변환, explicit conversion)이란 사용자가 [[타입 캐스트]] 연산자 '()'를 사용하여 강제적으로 수행하는 타입 변환을 말한다. | ||
+ | |||
+ | (변환할 타입) 변환할 데이터 | ||
+ | |||
+ | 자바에서는 위에 내용처럼 명시적 타입 변환을 수행할 수 있다. 변환시키고자 하는 데이터의 앞에 괄호 '()'를 넣고, 그 괄호 안에 변환할 타입을 적으면 된다. 이 괄호를 타입 캐스트(type cast) [[연산자]]라고 한다. | ||
+ | |||
+ | int num1 = 1, num2 = 4; | ||
+ | |||
+ | double result1 = num1/num2; //1번라인 | ||
+ | double result2 = (double)num1/num2; //2번라인 | ||
+ | |||
+ | System.out.println(result1); | ||
+ | System.out.println(result2); | ||
+ | |||
+ | 실행결과 | ||
+ | 0.0 | ||
+ | 0.25 | ||
+ | |||
+ | 위 내용에 1번 라인에서 나눗셈 연산의 결과로는 0이 반환된다. 자바에서 산술 연산을 수행하고 얻는 결괏값의 타입은 언제나 피연산자의 타입과 일치해야 한다. 즉, int형 데이터끼리의 산술 연산에 대한 결괏값은 언제나 int형 데이터의 결과로 나오게 되므로 1 나누기 4의 결과로는 0.25가 반환되지만, int형으로 자동 타입 변환되어 0이 반환된다. 그리고서 double형 변수에 그 결과가 대입될 때, double형으로 자동 타입 변환되어 0.0이라는 결과가 출력된다. 따라서 정확한 결과를 얻고자 한다면 2번 라인처럼 피연사자 중 하나의 타입을 double형으로 강제 타입 변환해야 한다. 이렇게 피연산자 중 하나의 타입이 double형이 되면, 나눗셈 연산을 위해 나머지 하나의 피연산자도 double형으로 자동 타입 변환된다. 그래서 그 결과 또한 double형인 0.25가 될 것이며, 이 결과가 double형 변수에 제대로 대입될 것이다.<ref name="TCP SCHOOL"></ref> | ||
{{각주}} | {{각주}} | ||
73번째 줄: | 160번째 줄: | ||
==참고자료== | ==참고자료== | ||
* 〈[https://ko.wikipedia.org/wiki/Int_(C_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4) int (C 프로그래밍 언어)]〉, 《위키백과》 | * 〈[https://ko.wikipedia.org/wiki/Int_(C_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4) int (C 프로그래밍 언어)]〉, 《위키백과》 | ||
− | * 〈[http://tcpschool.com/java/java_datatype_variable 7)변수]〉, 《TCP | + | * 〈[https://opentutorials.org/course/2517/13987 데이터 타입]〉, 《오픈튜토리얼스》, 2016-11-03 |
+ | * 삐멜 소프트웨어 엔지니어, 〈[https://imasoftwareengineer.tistory.com/48 2. 자바 변수와 자료형 (3) byte, short, int, long]〉, 《티스토리》, 2019-03-04 | ||
+ | * 〈[http://tcpschool.com/java/java_datatype_variable 7)변수]〉, 《TCP 스쿨》 | ||
+ | * 〈[http://tcpschool.com/java/java_datatype_typeConversion 11)타입 변환]〉, 《TCP 스쿨》 | ||
+ | * 〈[https://ko.wikipedia.org/wiki/%EB%A6%AC%ED%84%B0%EB%9F%B4 리터럴]〉, 《위키백과》 | ||
==같이 보기== | ==같이 보기== |
2021년 9월 24일 (금) 15:31 기준 최신판
정수형(int)이란 프로그램 개발 시 정수 형식의 데이터를 처리하기 위한 변수(variable)이다. int라고 쓴다. int는 'integer'의 약자이다.[1]
목차
개요[편집]
int는 정수형을 처리하기 위한 변수로, char와 같은 구조와 특성을 가진다. char는 모든 CPU에서 무조건 8비트인 것에 비해, 16, 32, 64비트의 처리 단위로 CPU마다 다르다는 차이가 있다. 보통 8비트 CPU는 16비트의 처리 단위를 가지며, 32비트 CPU이면 32비트의 처리 단위를 갖는 것이 일반적인 정수형 처리이다. char와 마찬가지 CPU의 ALU을 사용하여 연산 처리한다. 8비트 CPU는 16비트 처리 단위인 int의 16비트를 처리하기 위해 여러 개의 기계어 코드를 사용한다. 따라서 8비트 CPU는 32비트 CPU보다 처리 시간이 더 걸린다.[1]
크기[편집]
int는 4 byte이자 32 bit의 크기를 가진 자료형으로 가장 보편적으로 쓰이는 정수형이다. 32 bit에는 4,294,967,296개의 숫자를 저장할 수 있다. 이 숫자는 별로 중요하지 않다. 이 숫자를 기억하는 것보다 숫자가 2^32개를 저장 할 수 있다는 것으로 이해하면 된다. 마찬가지로 반으로 나눠 반은 음수를 나머지 반은 0과 양수를 표현한다면, 표현할 수 있는 숫자의 범위는 -2,147,483,648 ~ 2,147,483,647이다.[2]
데이터 타입[편집]
표현 형태 | 데이터 타입 | 메모리의 크기 | 표현 가능 범위 |
---|---|---|---|
정수형 | byte | 1 byte | -128 ~ 127 |
short | 2 byte | -32,768 ~ 32,767 | |
int | 4 byte | -2,147,483,648~2,147,483,647 | |
long | 8 byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | |
실수형 | float | 4 byte | ±(1.40129846432481707e-45 ~ 3.40282346638528860e+38) |
double | 8 byte | ±(4.94065645841246544e-324d ~ 1.79769313486231570e+308d) | |
문자형 | char | 2 byte | 모든 유니코드 문자 |
논리형 | boolean | 1 byte | true / false |
어떤 숫자를 저장하느냐에 따라서 사용하는 메모리의 크기가 달라지는 것이 아니고, 어떤 데이터 타입으로 변수를 선언했느냐에 따라서 사용하는 메모리의 크기가 달라지는 것이다. 결국, 변수에 들어올 수 있는 숫자의 최대 크기를 잘 판단해서 데이터 타입을 지정해야 메모리의 용량을 아낄 수 있다.[3]
변수 선언[편집]
자바(Java)에서 정수형 변수뿐만 아니라 모든 변수는 사용하기 전에 반드시 먼저 변수를 선언하고 초기화해야 한다. 변수란 데이터를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 의미한다. 즉, 변수란 데이터를 저장할 수 있는 메모리 공간을 의미하며, 이렇게 지정된 값은 변경될 수 있다. 또한 변수는 타입에 따라 크게 기본형(primitive type) 변수와 참조형(reference type) 변수로 구분할 수 있다. 기본형 변수는 실제 연산에 사용되는 변수다. 자바에서는 8가지의 기본형 변수를 제공하고 있다. 정수형인 byte, short, int, long을 제공하고, 실수형인 float와 double, 문자형인 char, 논리형인 boolean을 제공한다. 참조형 변수는 8개의 기본형 변수를 사용하여 사용자가 직접 만들어 사용하는 변수를 의미한다.
변수의 이름 생성 규칙[편집]
변수의 이름은 해당 변수에 저장될 데이터의 의미를 잘 나타내도록 짓는 것이 좋다. 자바에서는 변수뿐만 아니라 클래스(class), 메소드(method) 등의 이름을 설정할 때 반드시 지켜야 하는 공통된 규칙이 있다.
- 변수의 이름은 영문자(대소문자), 숫자, 언더스코어(_), 달러($)로만 구성할 수 있다.
- 변수의 이름은 숫자로 시작할 수 없다.
- 변수의 이름 사이에는 공백을 포함할 수 없다.
- 변수의 이름으로 자바에서 미리 정의된 키워드(keyword)는 사용할 수 없다.
변수 선언만 하는 방법[편집]
이 방법은 먼저 변수를 선언하여 메모리 공간을 할당받고, 나중에 변수를 초기화하는 방법이다. 하지만 이렇게 선언만 된 변수는 초기화되지 않음으로, 해당 메모리 공간에는 알 수 없는 값들이 들어가 있다. 따라서 선언만 된 변수는 반드시 초기화한 후에 사용해야 한다. 자바에서는 프로그램의 안전성을 위해 초기화하지 않는 변수는 사용할 수 없도록 하고 있다. 만약 초기화되지 않은 변수를 사용하려고 하면, 자바 컴파일러는 오류를 발생시킬 것이다.
타입 변수이름; int num; // 정수형 변수의 선언 System.out.println(num); // 오류 발생 num=10; // 변수의 초기화 System.out.println(num); // 10
위에 내용처럼 정수를 저장하기 위한 메모리 공간을 할당받으면, 반드시 해당 타입의 데이터만 저장해야 한다. 만약 다른 타입의 데이터를 저장하려고 하면, 자바 컴파일러는 오류를 발생시킬 것이다.
변수 선언 동시에 초기화하는 방법[편집]
자바에서는 변수의 선언과 동시에 그 값을 초기화할 수 있다. 그리고 선언하고자 하는 변수들의 타입이 같다면 이를 동시에 선언도 가능하다.
타입 변수 이름, 변수 이름; // 같은 타입의 변수를 동시에 선언한다. 타입 변수 이름 = 초기화값, 변수이름 = 초기화 값; // 같은 타입의 변수를 동시에 선언하면서 초기화한다. int num1, num2; // 같은 타입의 변수를 동시에 선언한다. int num3 = 3; // 선언과 동시에 초기화 한다. double num4 = 1.23, num5 = 9.87 // 같은 타입의 변수를 동시에 선언하면서 초기화한다.
위에 내용처럼 선언하고자 하는 변수의 타입이 서로 다르면 동시에 선언할 수 없고, 여러 변수를 동시에 초기화할 수 없다.
/* 잘못된 예시 */ int num1,num2; // 같은 타입의 변수를 동시에 선언한다. ... num1 = 2, num2 = 3; // 이미 선언된 여러 변수를 동시에 초기화할 수는 없다.
만약 위에 예제처럼 변수의 초기화를 동시에 하려면, 자바 컴파일러는 오류를 발생시킬 것이다.[4]
타입 변환[편집]
타입 변환(type conversion)은 하나의 타입을 다른 타입으로 바꾸는 것을 말하며, 자바에서는 boolean형을 제외한 나머지 기본 타입 간의 타입 변환을 자유롭게 수행이 가능하다. 다른 타입끼리의 연산은 우선 피연산자들을 모두 같은 타입으로 만든 후에 수행하는데, 메모리에 할당 받은 바이트의 크기가 상대적으로 작은 타입에서는 큰 타입으로의 타입 변환은 생략할 수 있다. 하지만 메모리에 할당받은 바이트의 크기가 큰 타입에서 작은 타입으로의 타입 변환은 데이터의 손실이 발생하므로 자바 컴파일러는 오류를 발생시킬 것이다. 자바에서는 타입 변환을 크게 자동 타입 변환(묵시적 타입 변환, implicit conversion)과 강제 타입 변환(명시적 타입 변환, explicit conversion)으로 나뉜다.
자동 타입 변환[편집]
자동 타입 변환(묵시적 타입 변환, implicit conversion)이란 대입 연산이나 산술 연산에서 컴파일러가 자동으로 수행해 주는 타입 변환을 말한다. 자바에서는 데이터의 손실이 발생하지 않거나, 데이터의 손실이 최소화되는 방향으로 자동 타입 변환을 진행하고 데이터의 손실이 발생하는 대입 연산은 허용하지 않는다.
double num1 = 10; // 1번 라인 //int num2 = 3.14; // 2번 라인 double num3 = 7.0f + 3.14; // 3번 라인 System.out.println(num1); System.out.println(num3); 실행 결과 10.0 10.14
위 내용에 1번 라인에서는 double형 변수에 int형 데이터를 대입하므로, int형 데이터가 double형으로 자동 타입 변환된다. 하지만 주석 처리된 2번 라인에서는 int형 변수가 표할 수 있는 범위보다 더 큰 double형 데이터를 대입하므로 데이터 손실이 발생하기 때문에 이 대입 연산에는 자바 컴파일러가 오류를 발생시킬 것이다. 3번 라인에서는 float형 데이터와 double형 데이터의 산술 연산을 수행하는데, 이때도 데이터의 손실이 최소화되도록 float형 데이터가 double형으로 자동 타입 변환된다. 이처럼 자바 컴파일러가 자동으로 수행하는 타입 변환은 언제나 데이터의 손실이 최소화되는 방향으로 이루어진다.
byte형 → short형 → int형 → long형 → float형 → double형 char형 ↗
자바에서는 타입의 표현 범위에 따라 위에 내용과 같은 방향으로 자동 타입 변환이 이루어진다.
byte num1 = 100; // OK // 1번 라인 byte num2 = 200; // Type mismatch // 2번 라인 int num3 = 9876543210; // Out of range // 3번 라인 long num4 = 9876543210; // Out of range // 4번 라인 float num5 = 3.14; // Type mismatch // 5번 라인
위 내용에서 1번 라인에서는 byte형 변수에 표현 범위가 더 큰 int형 데이터를 대입하고 있다. 정수 100은 byte형 변수가 표현할 수 있는 범위 내에 있음으로 자동 타입 변환이 이루어져서 대입된다. 하지만 2번 라인에서 byte형 변수가 표현할 수 있는 범위를 벗어난 int형 데이터는 타입 변환되지 못하고 오류를 발생시킬 것이다. 5번 라인도 마찬가지로 float형 변수가 표현할 수 있는 범위를 벗어난 double형 데이터를 대입하므로 오류를 발생시킬 것이다. 3번 라인과 4번 라인 모두 'Out of range' 오류가 발생한다. 이것은 int형 리터럴(literal)이 표현할 수 있는 최대 범위인 2,147,483,647을 초과하는 정수형 리터럴을 사용했기 때문이다.[5] 리터럴(literal)이란 소스 코드의 고정된 값을 대표하는 용어다.[6]
int num1=9876543210L; // Type mismatch // 6번라인 long num4=9876543210L; // OK
이렇게 int형 리터럴(literal) 보다 더 큰 정수를 사용하기 위해서는 리터럴의 마지막에 L이나 I접미사를 추가하여 long형 리터럴(literal)로 명시해야만 한다. 하지만 6번 라인에서 int형 변수가 표현할 수 있는 범위를 벗어난 long형 데이터를 대입하므로 오류를 발생시킬 것이다.
강제 타입 변환[편집]
강제 타입 변환(명시적 타입 변환, explicit conversion)이란 사용자가 타입 캐스트 연산자 '()'를 사용하여 강제적으로 수행하는 타입 변환을 말한다.
(변환할 타입) 변환할 데이터
자바에서는 위에 내용처럼 명시적 타입 변환을 수행할 수 있다. 변환시키고자 하는 데이터의 앞에 괄호 '()'를 넣고, 그 괄호 안에 변환할 타입을 적으면 된다. 이 괄호를 타입 캐스트(type cast) 연산자라고 한다.
int num1 = 1, num2 = 4; double result1 = num1/num2; //1번라인 double result2 = (double)num1/num2; //2번라인 System.out.println(result1); System.out.println(result2); 실행결과 0.0 0.25
위 내용에 1번 라인에서 나눗셈 연산의 결과로는 0이 반환된다. 자바에서 산술 연산을 수행하고 얻는 결괏값의 타입은 언제나 피연산자의 타입과 일치해야 한다. 즉, int형 데이터끼리의 산술 연산에 대한 결괏값은 언제나 int형 데이터의 결과로 나오게 되므로 1 나누기 4의 결과로는 0.25가 반환되지만, int형으로 자동 타입 변환되어 0이 반환된다. 그리고서 double형 변수에 그 결과가 대입될 때, double형으로 자동 타입 변환되어 0.0이라는 결과가 출력된다. 따라서 정확한 결과를 얻고자 한다면 2번 라인처럼 피연사자 중 하나의 타입을 double형으로 강제 타입 변환해야 한다. 이렇게 피연산자 중 하나의 타입이 double형이 되면, 나눗셈 연산을 위해 나머지 하나의 피연산자도 double형으로 자동 타입 변환된다. 그래서 그 결과 또한 double형인 0.25가 될 것이며, 이 결과가 double형 변수에 제대로 대입될 것이다.[5]
각주[편집]
참고자료[편집]
- 〈int (C 프로그래밍 언어)〉, 《위키백과》
- 〈데이터 타입〉, 《오픈튜토리얼스》, 2016-11-03
- 삐멜 소프트웨어 엔지니어, 〈2. 자바 변수와 자료형 (3) byte, short, int, long〉, 《티스토리》, 2019-03-04
- 〈7)변수〉, 《TCP 스쿨》
- 〈11)타입 변환〉, 《TCP 스쿨》
- 〈리터럴〉, 《위키백과》
같이 보기[편집]