Java study Day 2 - TIL

Topics

  • 변수
  • 타입 변환

변수

컴퓨터 메모리(RAM)는 값을 저장할 수 있는 수많은 번지 (주소) 들로 구성되어있다. 메모리의 어디에 저장하고, 어떤 방식으로 저장할지 정해놓기 위해 변수라는 개념을 사용한다.

 

변수라는 것은 값을 저장할 수 있는 메모리의 특정 번지에 붙이는 이름으로, 프로그램은 변수를 통해 메모리의 특정 번지에 값을 저장하고 읽을 수 있다. 메모리의 어디에 저장하고, 어떤 방식으로 저장할지는 프로그래밍 언어와 운영체제가 정한다. Java의 경우, JVM 이 정한다.

 

Java의 변수는 다양한 타입의 값을 저장하지 않는다 (Python 과는 다른 부분이다. C, C++과 비슷하다). 타입에 따라 변수가 들어갈 수 있는 종류가 다르고, 하나의 변수에는 하나의 값만 저장이 가능하다.

 

 

변수 선언

변수를 사용하기 위해서는 먼저 변수를 선언해야 함. 변수 선언은 어떤 타입의 데이터를 저장할 것인지, 변수 이름은 무엇으로 정할 것인지 결정한다. 변수 이름에 대한 많은 규칙이 존재하지만, 다른 언어들과의 차별점이 있을만한 규칙은 "영어 대소문자를 구분한다" 이다. 그리고, 중요한 규칙 중 하나는 예약어로 된 이름은 변수 이름으로 사용할 수 없다는 것이다. 여기서 말하는 예약어는 이미 해당 프로그래밍 언어에서 의미를 가지고 사용되고 있는 단어라는 의미이다.

 

개발자는 변수가 어떤 값을 저장하고 있는지 쉽게 알 수 있도록 의미 있는 이름을 지어주는 것이 좋다.

 

값 저장

변수 값 저장은 타 언어와 비슷하므로, 기본적인 내용은 간략하게 설명하겠다. 변수에 최초로 값이 저장될 때 변수가 생성되는 것을 "변수 초기화" 라고 하고, 그 값을 "초기값" 이라 한다.

int score = 90;

 

90을 score 라는 변수에 저장한다.

 

변수 사용 범위

자바의 모든 변수는 중괄호 {} 블록 내부에서 선언되고 사용된다. 메소드 블록 내에서 선언된 변수를 Local variable (지역 변수)

라고 부른다. 이 변수는 메소드 블록 내부에서만 사용되고, 메소드 실행이 끝나면 메모리에서 자동적으로 없어진다.

public class variableExample { // 클래스 블록
	public static void main(String[] args) { // 메소드 블록
     	int value = 10; // local variable value
        int sum = value + 20; // local variable sum
        System.out.println(sum);
        }
    }
}

 

변수는 블록 내 어디에서든 선언할 수 있지만, 변수 사용에는 제한이 따른다. 변수는 자신이 선언된 위치로부터 자신이 속한 블록 내부에서만 사용 가능하다.

 

따라서, 변수를 선언할 때는 다음과 같은 주의사항이 존재한다.

  1. 변수가 어떤 범위에서 사용될 것인지를 생각하고, 선언 위치를 결정해야 한다.
  2. 메소드 블록 전체에서 사용하고 싶다면 메소드 블록 첫머리에 선언한다.
  3. 특정 블록 내부에서만 사용된다면 해당 블록 내에 선언한다.

기본 타입

 

정수 리터럴(Literal) 에서 리터럴은 소스 코드에서 프로그래머에 의해 직접 입력된 값이다. long 타입은 수치가 큰 데이터를 다루는 프로그램에서 자주 사용되는데, 은행이나 과학과 관련된 프로그램에서 자주 사용된다.

기본적으로 컴파일러는 정수 리터럴을 Int 타입으로 간주하여 Int 타입의 허용 범위를 초과할 경우, long 타입임을 컴파일러에게 알려주어야 한다. 이를 대문자 L을 사용하여 알려준다.

 

char 타입

하나의 문자를 작은따옴표 (' ')로 감싼 것을 문자 리터럴이라고 한다. 문자 리터럴은 "Unicode" 로 변환되어 저장된다. Unicode 는 정수이므로 char 타입도 정수 타입에 속한다. 그래서 char 변수에 10진수나 16진수 형태로 저장이 가능하다. 문자 리터럴은 Unicode 로 변환되기 때문에 int 타입 변수에도 저장이 가능하다. int 타입에 저장하면 Unicode 자체가 출력된다.

 

String 타입

큰따옴표 (" ")로 감싼 문자 (문자열) 또는 여러 개의 문자들은 Unicode 로 변환되지 않는다. 따라서, 작은 따옴표 (' ')와 큰따옴표 (" ")는 컴파일러가 문자 리터럴과 문자열 리터럴을 구별하는 기호로 사용된다.

 

Escape (이스케이프) 문자

문자열 내부에 특정 문자를 포함시킬 수 있는 문자

 

 

실수 타입

자바는 실수 리터럴을 기본적으로 double 타입으로 해석하기 때문에 double 타입 변수에 저장해야 한다. 실수 리터럴을 float 타입으로 저장하고 싶다면 리터럴 뒤에 소문자 f나 대문자 F를 붙여 컴파일러가 float 타입임을 알 수 있도록 해야 한다. 

double 타입은 float 타입보다 2배 정도 정밀도가 높기 때문에 좀 더 정확한 데이터 저장이 가능하므로 메모리에 여유가 있고 특별한 이유가 없는 한 실수 리터럴을 저장할 때에는 double 타입을 사용하는 것이 좋다.

 

논리 타입 

참과 거짓을 의미하는 논리 리터럴로, True/False 를 사용한다. 1 Byte 크기의 Boolean 타입 변수에 저장할 수 있으며, 이 변수는 주로 두 가지 상태값에 따라 조건문과 제어문의 실행 흐름을 변경하는 데 사용한다.

 

타입 변환

두 변수의 타입이 다를 때, 한쪽 변수의 값을 다른 쪽 변수에 복사해서 저장하는 것을 타입 변환이라고 한다. 

 

자동 타입 변환

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

  • 허용 범위 크기 순으로 정리한 기본 타입
byte < short < int < long < float < double

 

예외는 byte 타입에서 char 타입으로는 자동 타입 변환될 수 없다는 것인데, 그 이유는 char 타입의 허용 범위는 음수를 허용하지 않지만, byte 타입은 음수를 허용하기 때문이다.

 

강제 타입 변환

큰 허용 범위 타입은 작은 허용 범위 타입으로 자동 타입 변환될 수 없음. 그래서 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장하는 것을 강제 타입 변환 (casting) 이라고 한다. 강제 타입 변환은 캐스팅 연산자 괄호 () 를 사용하는데, 안에 들어가는 타입은 나누는 단위이다.

 

정수 연산에서의 자동 타입 변환

정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환되어 연산을 수행한다. 

  • byte 타입 변수가 피연산자로 사용되는 경우
byte x = 10;
byte y = 20;
// byte result = x + y; 컴파일 에러
int result = x + y;

 

  • int 타입 변수가 피연산자로 사용되는 경우
int x = 10;
int y = 20;
int result = x + y;

 

 

정수 연산에서 사용되는 변수는 int 타입으로 선언하는 것이 타입 변환을 줄이는 방법이다. 타입 변환이 줄면, 실행 성능이 향상된다.

단, 정수 연산식에서 모든 변수가 int 타입으로 변환되는 것은 아니고, 두 피연산자 중 허용범위가 큰 타입으로 변환되어 연산을 수행한다.

 

실수 연산에서의 자동 타입 변환

피연산자 중 하나가 double 타입이면 연산 결과는 double 타입이 된다.

 

+ 연산에서의 문자열 자동 타입 변환

피연산자가 모두 숫자인 경우, 덧셈 연산을 수행하지만, 하나라도 문자열인 경우 나머지 하나도 문자열로 변환시켜 문자열 연산을 수행한다.

그리고, 앞에서부터 차례대로 '+' 연산을 수행한다.

 

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

변환 타입 사용 예
String → byte String str = "10";
byte value = Byte.parseByte(str);
String → short String str = "10";
short value = Short.parseShort(str);
String → int String str = "10";
int value = Integer.parseInt(str);
String → long String str = "10";
long value = Long.parseLong(str);
String → float String str = "10";
float value = Float.parseFloat(str);
String → double String str = "10";
double value = Double.parseDouble(str);
String → boolean String str = "10";
boolean value = Boolean.parseBoolean(str);

 

문자열이 숫자가 아닌 알파벳이나 특수문자, 한글 등을 포함하고 있을 경우, 숫자 타입으로 변환을 시도하면 숫자 형식 예외 (NumberFormatException) 가 발생한다. 기본 타입의 값을 문자열로 변환할 때는 String.valueOf() method 를 사용한다.

 

변수와 시스템 입출력

프로그래밍 언어에는 표준 입력 장치 (키보드)와 표준 출력 장치 (모니터)가 존재한다. 키보드와 모니터는 일반적인 경우를 의미한다.

 

모니터로 변수 값 출력

 

println(내용) 괄호 안의 내용을 출력하고 행을 바꾼다.
print(내용) 괄호 안의 내용을 출력만 한다.
printf("형식 문자열" , 값!, 값2, ...) 괄호 안의 첫 번째 문자열 형식대로 출력된다.

 

printf() method 는 개발자가 원하는 format string 을 출력할 수 있다.

 

  • 자주 사용되는 형식 문자열 (format string)
정수 %d
%6d
%-6d
%06d
정수
6자리 정수, 왼쪽 빈 자리 공백
6자리 정수, 오른쪽 빈 자리 공백
6자리 정수, 왼쪽 빈 자리 0 채움
123
___123
123___
000123
실수 %10.2f
%-10.2f
%010.2f
소수점 이상 7자리, 소수점 이하 2자리, 왼쪽 빈 자리 공백
소수점 이상 7자리, 소수점 이하 2자리, 오른쪽 빈 자리 공백
소수점 이상 7자리, 소수점 이하 2자리, 왼쪽 빈 자리 0 채움
____123.45
123.45____
0000123.45
문자열 %s
%6s
%-6s
문자열
6자리 문자열, 왼쪽 빈 자리 공백
6자리 문자열, 오른쪽 빈 자리 공백
abc
___abc
abc___
특수문자 \t
\n
%%
탭(tab)
줄 바꿈
%


%

 

 

위 그림에 존재하는 값들은 생략 가능하다. 단, %와 conversion 은 필수적으로 필요하다.

  • argument_index : 값의 순번. format string 에 포함될 값이 2개 이상인 경우, 값의 순번을 알려주어야 한다.
  • flag : 빈 자리를 채우는 방법으로 생략되면 왼쪽이 공백으로 채워지고, - 가 오면 오른쪽이 공백으로 채워지고, 0은 공백을 0으로 채워준다.
  • conversion : 변환 문자 (%d, %f 등)
  • Width : 전체 자릿수
  • .precison : 소수 자릿수

키보드에서 입력된 내용을 변수에 저장

  • Java keycode 표

 

System.in.read() method 의 단점은 keyCode 를 하나씩 읽기 떄문에 2개 이상의 키가 조합된 한글을 읽을 수 없어 키보드로부터 입력된 내용을 통 문자열로 읽지 못한다. 이 단점을 보완하고자 Scanner class 를 사용한다.

 

Scanner class 를 사용하기 위해서는 Java.util 에 존재하는 Scanner 를 사용할 수 있도록 Import 문을 작성하여야 한다. 

또한, java 에서는 문자열이 동일한지 비교할 때에는 equal() method 를 사용한다.

'Java' 카테고리의 다른 글

Java study Day 5 - TIL  (3) 2024.04.30
Java study Day 4 - TIL  (0) 2024.04.05
Java study Day 3 - TIL  (0) 2024.03.29
Java study Day 1 - TIL  (1) 2024.03.08