자바의 정석 Chapter 02 변수

변수(variable)란?

  • 변수란 값을 저장할 수 있는 메모리상의 공간을 의미한다.
  • 하나의 변수에 단 하나의 값만 저장할 수 있으므로, 새로운 값을 저장하면 기존의 값은 사라진다.
  • 변수를 선언한 이후부터는 변수를 사용할 수 있으나, 그 전에 반드시 변수를 '초기화' 해야한다.

변수의 이름짓기 규칙

필수 규칙

  • 대소문자가 구분되며 길이에 제한은 없다.
  • 예약어(프로그램에서 따로 빼둔 키워드)를 사용해서는 안된다.
  • 숫자로 시작해서는 안된다.
  • 특수문자는 '_'와 '$'만을 허용한다.

권장 규칙

  • 클래스 이름의 첫 글자는 항상 대문자로 한다.
    (변수와 메서드의 이름의 첫 글자는 항상 소문자로 한다.)
  • 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다.
  • 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_' 로 구분한다.

변수의 타입

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

기본형 변수는 실제 값을 저장하는 것이고
참조형 변수는 값이 저장되어 있는 주소를 값으로 가진다.
(C언어와 비교하면 기본형 변수는 값 자체를 변화 시킬 수 있는 것이고, 참조형은 변수의 주솟값을 넘겨주는 것과 비슷하다.)

단, 자바는 C언어와 달리 참조형 변수간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수 이다.

참조변수를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 이름이 참조변수의 타입이 된다. 그래서 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 셈이다.

참조 변수 선언 하는 법

클래스이름 변수이름;
// 변수의 타입이 기본형이 아닌 것들은 모두 참조변수이다.

참조 변수 초기화 법

Data today = new Data();
// Data 객체를 생성해서, 그 주소를 today 변수에 저장한다.

기본형(primitive type)

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

  • 논리형 (boolean) : true와 false를 하나의 값으로 가지며, 조건식과 논리적 계산에 사용된다.
  • 문자형 (char) : 문자를 저장하는데 사용되며, 변수에 하나의 문자만 저장 할 수 있다.
  • 정수형 (byte, short, int ,long) : 정수를 저장하는데 사용되며, 주로 int가 사용된다.
  • 실수형 (float, double) : 실수를 저장하는데 사용되며, 주로 double이 사용된다.


▲ 기본형의 종류와 크기

상수와 리터럴 (Constant & literal)

상수는 변수와 마찬가지로 '값을 저장할 수 있는 공간'이지만, 변수와 달리 한 번 값을 저장하면 다른 값으로 변경 할 수 없다.
선언 방법은 변수와 동일하며 타입 앞에 'final'을 붙여주기만 하면 된다.

final int MAX_SPEED = 10;

//상수 MAX_SPEED를 선언과 동시에 초기화

리터럴은 단지 우리가 기존에 알고 있던 '상수'의 다른 이름일 뿐이다. '상수'는 저장공간이고 '리터럴'은 그 수 자체라고 생각하면 편할 것이다.

리터럴의 타입과 접미사

변수에 타입이 있는 것 처럼 리터럴에도 타입이 있다.

정수형의 경우 long 타입의 리터럴에 접미사 'L'을 붙이고, 접미사가 없으면 int 타입의 리터럴로 간주한다. byte와 short 타입의 리터럴은 별도 존재하지 않으며 int 타입의 리터럴을 사용한다.

실수형의 경우 float 타입에 'f' or 'F'를 붙이고 double 타입의 리터럴에는 'd' or 'D'를 붙인다.
정수형에서 int가 기본 자료형인 것처럼 실수형에서는 double이 기본 자료형이라서 접미사 'd'는 생략이 가능하다. 실수형 리터럴인데 접미사가 없다면 double타입 리터럴인 것이다.

문자 리터럴과 문자열 리터럴

'A'와 같이 작은 따옴표로 문자 하나를 감싼 것을 '문자 리터럴' , 두 문자 이상을 큰 따옴표로 감싼 것을 '문자열 리터럴' 이라고 한다.

char 타입의 변수는 단 하나의 문자만 저장할 수 있으므로, 여러 문자(문자열)을 저장하기 위해서는 String타입 을 사용해야 한다.

문자열 리터럴은 "" 안이 빈, 빈 문자열을 허용하지만, 문자 리터럴은 반드시 '' 안에 하나의 문자가 있어야 한다.

덧셈 연산자는 피 연산자가 모두 숫자일 때 두 수를 더한다.
하지만 어느 한 쪽이 String 이라면 나머지 한 쪽을 String으로 변환한 다음 두 String을 결합한다.
-> 어떤 타입의 변수도 문자열과 덧셈연산을 수행하면 그 결과 문자열이 되는 것이다.

printf() 출력

지금까지는 화면에 출력할 때 println()을 써왔다.
자동개행이 된다는 장점이 있지만 값을 변환하지 않고서는 다른 형식으로 출력 할 수 없다.
이럴 때 사용하는 것이 printf() 이다.

    System.out.printf("age: %d", age);
 -> System.out.prinf("age: %d", 14);
 -> System.out.printf("age: 14");

위 코드처럼 %d 지시자를 사용해서 출력가능하다.

화면에서 입력받기 - Scanner

Scanner는 클래스 사용을 위한 문장을 선언해줘야 한다.

import java.util.*;

그 다음 Scanner 클래스의 객체를 생성한다.

Scanner scanner = new Scanner(System.in);

그리고 nextLinr()이라는 메서드를 호출하면, 입력대기 상태에 있다가 입력을 마치고 엔터키를 누르면 입력한 내용이 문자열로 반환된다.

정수를 입력받는 메서드는 이와 같다.
int num = Scanner.nextInt();
//정수를 입력받아서 변수num에 저장

오버플로우

연산과정에서 해당 타입이 표현할 수 있는 값의 범위를 넘어서는 것을 오버플로우(overflow)라고 한다. 오버플로우가 발생했다고 해서 에러가 반드시 발생하는 것은 아니지만 애초에 발생하지 않게 충분한 크기의 타입을 선택해서 사용하는 것이 중요하다.

각 자료형의 최대크기를 인지하고 그에 맞는 타입을 적절하게 사용하자.

형변환

'형변환' 이란 서로 다른 타입간의 연산을 수행해야 하는 경우 타입을 일치시키는 것을 말한다.

형변환 방법

형변환하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙여주기만 하면 된다.

(타입)피연산자

double d = 85.4;
int score = (int)d; 
//double 타입의 변수 d를 int타입으로 형변환

이 연산과정을 단계 별로 살펴보면 다음과 같다.

int score = (int)d;
int score = (int)85.4; // 변수 d의 값을 읽어와서 형변환
int score = 85; // 형변환의 결과인 85을 변수 score에 저장

이 과정에서 알 수 있듯이, 형변환 연산자는 그저 피연산자의 값을 읽어서 지정된 타입으로 형변환하고 그 결과를 반환할 뿐이다. 그래서 피연산자인 변수 d의 값은 형변환 후에도 아무런 변화가 없다.

형변환에서 주의할 점은 큰 타입에서 작은 타입으로 형변환할 때 값 손실이 일어날 수 있다는 점이다.
큰 그릇에 있던 물을 작은 그릇에 옮기는 것과 같다고 생각하면 쉽다.

좋은 웹페이지 즐겨찾기