수학과의 좌충우돌 프로그래밍

[JAVA] 02. 변수 본문

프로그래밍 언어/Java

[JAVA] 02. 변수

ssung.k 2020. 11. 27. 17:09

자료형은 크게 기본형과 참조형 두 가지로 나눌 수 있습니다.

기본형 변수는 실제 값을 저장하고, 참조형은 어떤 값이 저장되어 있는 주소를 값으로 가집니다.

 

1. 기본형

기본형에는 모두 8개의 타입이 있으며 크게 논리형, 문자형, 정수형, 실수형으로 구분됩니다.

  • 논리형
    • Boolean
    • true와 false 중 하나의 값
    • 1bit만 있어도 표현하기에 충분하지만 java에서 데이터를 다루는 최소단위가 byte이기 때문에 1byte로 표현
  • 문자형
    • char
    • 하나의 문자를 저장
  • 정수형
    • byte, short, int, long
  • 실수형
    • float, double

 

  1byte 2byte 4byte 8byte
논리형 boolean      
문자형   char    
정수형 byte short int long
실수형     float double

 

2. 상수와 리티럴

상수

상수는 변수와 마찬가지로 값을 저장하는 공간이지만 다른 값으로 변경할 수 없습니다.

상수를 선언하는 방법은 변수를 선언한 후 그 앞에 final 키워드를 붙여줍니다.

final int MAX_VALUE = 10;

 

상수는 보통 선언과 동시에 초기화하며 이름을 모두 대문자로 하는 것이 관례입니다.

 

리티럴

원래 123, 3,14, 'A' 와 같은 값들이 상수인데 프로그래밍에서 상수를 위와 같이 변경할 수 없는 저장공간이라고 저장했기 때문에 다른 이름이 필요했습니다.

따라서 리터럴이라는 용어로 기존의 상수를 표현합니다.

final int MAX_VALUE = 10;
int value = 5;

위와 같은 예시에서 MAX_VALUE는 상수, value는 변수, 10과 5는 리터럴이 됩니다.

 

리터럴은 접미사가 붙습니다.

논리형과 문자형에는 접미사가 따로 없으며 정수형과 실수형은 각각의 접미사가 존재합니다.

long 타입의 경우, l이나 L을 사용하고

float의 경우, f, F

double의 경우 d, D를 사용하며 double은 생략 가능합니다.

 

따라서 아래와 같은 구문은 float에 double을 대입하므로 에러입니다.

float pi = 3.14;

 

 

타입의 불일치

하지만 반대로 아래의 구문은 에러를 일으키지 않습니다.

double pi = 3.14F;

 

일반적으로 리터럴의 타입과 저장될 변수의 타입은 일치하지만 위와 같이 다를 경우, 에러가 발생할 수도 정상적으로 동작할 수 도 있습니다.

저장 범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용됩니다.

 

 

3. 형식화된 출력

화면을 출력할 때는 println()을 사용하면 형식화된 출력이 불가능합니다.

같은 값이라도 다른 형식으로 출력하고 싶을 경우에는 대신 printf()를 사용합니다.

 

printf()의 지시자 중에서 자주 사용하는 것들을 아래와 같습니다.

지시자 설명
%b boolean 형식으로 출력
%d 10진 정수의 형식으로 출력
%o 8진 정수의 형식으로 출력
%x, %X 16진 정수의 형식으로 출력
%f 부동 소수점의 형식으로 출력
%e, %E 지수 표현식의 형식으로 출력
%c 문자로 출력
%s 문자열로 출력

 

%f

다음 지시자는 실수형 값을 출력하는데 사용합니다.

그리고 다음과 같이 전체 자리수와 소수점 아래의 자리수를 지정할 수 있습니다.

%전체자리.소수점아래자리f

 

소수점도 자리를 차지하며 소수점 아래 빈자리는 0으로, 정수 앞에 빈자리는 공백으로 채웁니다.

double testValue = 1.23456789;
System.out.printf("%14.10f\n", testValue);
//  1.2345678900

 

 

%s

다음 지시자는 문자열을 출력하는데 사용합니다.

앞에 숫자를 추가하여 출력공간을 확보하고 - 를 사용하여 정렬할 수 있습니다.

또한 . 을 통해 문자열의 일부만 출력할 수 있습니다.

String testValue = "Hello World";

System.out.printf("%s\n", testValue);
System.out.printf("%15s\n", testValue);
System.out.printf("%-15s\n", testValue);
System.out.printf("%.5s\n", testValue);

/*
Hello World
    Hello World
Hello World    
Hello
*/

 

 

 

4. 화면에서 입력받기

기존에 정리했던 포스팅이 있어 대체합니다.

https://ssungkang.tistory.com/entry/java%EC%82%AC%EC%9A%A9%EC%9E%90%EB%A1%9C-%EB%B6%80%ED%84%B0-%EA%B0%92-%EC%9E%85%EB%A0%A5%EB%B0%9B%EA%B8%B0-Scanner

 

 

5. 형변환

영어로는 캐스팅이라고 하며, 변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 형변환이라고 합니다.

형변환을 하는 방법은 타입을 괄호와 함께 변수나 리터럴 앞에 붙여줍니다.

double pi = 3.14;
int intPi = (int)pi;

 

자동 형변환

서로 다른 타입간의 대입이나 연산을 할 때 타입을 일치시키는 것이 원칙이지만 경우에 따라 형변환을 생략할 수 있습니다.

이 경우 컴파일러가 생략된 형변환을 자동적으로 추가합니다.

float f = 1234;

 

위 경우 float형이 1234의 형, int와 크기는 같지만 더 넓은 범위의 값을 표현 할 수 있으므로 문제없이 값을 저장하지만 그 반대의 경우에는 문제가 발생합니다.

int d = 1234f;

 

이 경우 값 손실이 발생할 수 있기 때문에 컴파일러가 이를 막습니다.

 

추가적으로 형변환에 대해 아래와 같은 규칙이 적용됩니다.

  • boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능합니다.
  • 기본형과 참조형은 서로 형변환할 수 없습니다.
  • 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있습니다.
Comments