변수(variable)란?
변하는 수 ? // no
프로그래밍에서 변수는 하나의 값을 저장할 수 있는 메모리 공간을 말한다.
메모리 공간은 RAM을 의미한다.
자세히보면 RAM은 여러개의 칩으로 나뉘어져있지만 논리적으로는 하나의 연속된 저장공간인것처럼 다룬다. 그리고 전체 메모리의 저장공간을 1byte 단위로 나누고 각각의 저장공간에 012345..와 같이 연속적인 번호를 붙히는데 이것을 메모리 주소라고 한다. 원래는 메모리의 값을 저장하거나 읽을때 메모리 주소를 이용해야 하는데 메모리 주소는 숫자라서 사람이 기억하기 힘들고 불편하다. 그래서 특정 메모리 영역에 이름을 붙히고 주소 대신에 메모리 이름을 이용해서 메모리의 값을 저장하고 읽을 수 있게한 것이 변수이다. 변수는 하나의 값만 저장할 수 있기 때문에 변수에 새로운 값을 저장하면 기존에 있던 값은 지워지고 새로 저장한 값만 남게 된다.
변수의 선언
메모리에 값을 저장하려면 먼저 변수를 선언해야한다.
변수를 선언하는 이유는 어떤 값(data)을 저장할 수 있는 공간을 마련하기 위해서이다.
변수를 선언하는 방법은 변수타입과 변수이름을 써주면 된다. 변수를 선언하는 것도 하나의 자바 문장이기 때문에 자바의 모든 문장 끝은 세미콜론(;)을 꼭 붙혀주어야한다.
예를 들어 나이를 저장하기 위해서 age라는 이름의 변수를 선언하려고 한다면 먼저 변수의 이름인 age를 써주고 변수의 이름 앞에 변수의 타입을 적어줘야한다. 변수의 타입은 변수에 어떤 값을 저장할 것인가에따라 달라진다. 만일 정수를 저장할 것이라면 변수의 타입을 int(integer)로 해야한다.
변수타입 변수이름;
int age ; // 정수(int)타입의 변수 age를 선언한 것이다. 이 문장이 실행되면 age라는 이름의 저장공간이 마련된다.
변수에 값 저장하기
변수에 값 저장하기
( '=' 는 등호가 아니라 대입 연산자라고 한다. 오른쪽의 값을 왼쪽에 저장하라는 뜻이다.)
int age ; // 정수(int)타입의 변수 age를 선언한다.
age = 25; // 변수 age에 25를 저장한다.
int age = 25; // 위의 두 줄을 간단히 한 줄로 할 수 있다.
변수의 초기화
변수에 처음으로 값을 저장하는 것. 모든 변수는 사용하기 전에 적절한 값으로 초기화하는 것이 좋다.
변수의 선언과 동시에 초기화하는 것이 일반적이다.
int x = 0; // 변수 x를 선언 후, 0으로 초기
int y = y; // 변수 y를 선언 후, 5로 초기화
int x = 0, y = 5; // 변수타입이 같은 경우에는 콤마(,)를 이용해서 한줄에 여러 변수를 선언할 수 있다.
메모리는 여러 프로그램이 함께 공유하는 자원이기때문에 사용하기 전에 새로운 값을 저장함으로써 기존에 저장되어있는 이 알 수없는 값을 지우는 것이 바로 초기화이다.
변수의 종류에는 클래스 변수, 인스턴스 변수, 지역변수 이렇게 세가지가 있다. 다른 변수들과 달리 지역변수는 0으로 자동 초기화되지 않기 때문에 값을 읽기전에 반드시 초기화 해주어야한다. 그렇지 않으면 컴파일할 때 에러가 발생한다. 변수의 종류에 대해서는 객체지향개념에서 자세히 다룬다. 그전까지 사용할 변수는 모두 지역변수이므로 변수의 값을 읽기전에 반드시 초기화 해줘야한다는 것을 꼭 기억하라.
변수의 값 읽어오기
변수의 값을 읽어오려면 변수의 값이 필요한 곳에 변수의 이름을 적기만 하면 된다.
int year = 0, age = 14; // 인티저타입의 변수 year와 age를 선언하고 각각 0과 14로 초기화 하면 각각 0과 14가 저장됨
year = age + 2000;
// 이 문장을 보면 변수 age에 2000을 더하는데 여기서 변수의 이름이 사용된 부분은 변수에 저장된 값으로 바뀐다.
>> year = 14 + 2000; // 변수 age에 저장된 값인 14로 대체된다.
>> year = 2014; // 두 값을 더해 마지막으로 2014가 year에 저장된다. 이처럼 변수의 값을 저장하는 대입연산은 제일 마지막에 수행된다.
age = age + 1; // 변수의 값을 1증가시키는 방법
>> age = 14 + 1; // 변수이름인 age가 age에 저장된 값인 14로 바뀐다.
>> age = 15; // 마지막으로 15가 변수 age에 저장된다. 변수 age의 값이 14에서 15로 바뀐다.
System.out.println(age); // 변수에 저장된 값을 화면에 출력하는 문장
>> System.out.println(15); // 15가 화면에 출력됨
변수의 타입
변수는 하나의 값을 저장하기 위한 메모리 공간입니다. 그러나 하나의 변수에 모든 종류의 값을 저장할 수 있는 것은 아니다. 변수의 타입은 저장할 값의 타입에 의해 결정됩니다.변수는 값을 저장하기 위해 필요한 것이니까요.
저장할 값의 타입과 일치하는 타입으로 변수를 선언
ex. char ch = '가'; // char는 문자타입
double pi = 3.14; // double은 실수 타입
값의 타입(자료형. Data Type)
변수, 상수, 리터럴
변수(variable)는 하나의 값을 저장하기 위한 공간
상수(constant) 값을 한 번만 저장할 수 있는 변수
변수와 상수 모두 값을 하나만 저장할 수 있다는 점은 같으나 변수는 하나의 값을 저장했다고 해도 다른 값으로 몇번이고 바꿀 수 있지만 상수는 값을 처음에 저장하고나면 그 다음에는 다른 값을 저장할 수 없다.
상수를 선언하는 방법은 변수 앞에 final을 써주면 된다.
int score = 100;
score = 200;
final int MAX = 100; // MAX는 상수.
MAX = 200; // 에러. 상수 MAX에는 100이 저장되어 있기때문에 200을 저장할 수 없다.
char ch = 'A';
String str = "abc";
리터럴(literal) - 그 자체로 값을 의미하는 것.
리터럴은 기존의 상수와 같은 개념이다. 자바에서 기존의 상수 대신 리터럴이라는 용어를 사용하는 이유는 자바에서는 상수를 한 번만 값을 저장 가능한 변수라고 정의했기 때문이다. 이를 구분하기위해 어쩔 수 없이 리터럴이라는 용어를 사용한다. 프로그램에서 직접 표현한 값을 의미한다.
리터럴의 접두사와 접미사
모든 값에는 타입이 있다. 모든 리터럴에는 타입이 있다. 리터럴은 위와 같이 논리형, 정수형, 실수형, 문자형, 문자열의 종류가 있다.
정수형과 실수형은 타입이 여러개이기 때문에 그냥 구별이 안된다. 그래서 접미사를 붙혀서 구별한다.
정수형 리터럴 접미사는 L 하나뿐이다. 정수형 리터럴에 L이 붙어있으면 Long타입이다. 접미사가 붙지않은 정수형 리터럴은 int 타입이다. byte 타입과 short 타입의 리터럴은 없다. byte 타입과 short 타입의 변수에 값을 저장할때는 int 타입의 리터럴을 사용한다.
실수형 리터럴에 붙히는 접미사에는 f 와 d가 있다. float 타입에는 f, double 타입에는 d를 붙힌다. 실수형 리터럴에는 타입이 두개뿐이어서 어는 한쪽에만 접미사를 붙혀도 구별이 가능하다. 그래서 d는 생략을 허용한다. 이때문에 d를 잘 안쓴다. 접미사는 정수형의 L과 실수형의 f만 신경쓰면 된다.
접미사는 대소문자를 구분하지 않는다. 하지만 소문자 l은 숫자 1과 혼동하기 쉽기때문에 대문자로 쓰는 것이 좋다.
boolean power = true; // boolean 타입에는 true 또는 false만 저장할 수 있다.
char ch = 'A'; // 캐릭터 타입 변수에는 하나의 문자만 저장할 수 있다.
String str = "ABC"; // 여러 문자를 저장하렴 String 타입의 변수를 사용해야한다.
byte b = 127; // 이 문장은 byte 타입 변수 b에 127을 저장한다 . 리터럴 127이 무엇인가? 정수인데 접미사가 없으니 int 타입이다. byte와 short타입의 리터럴은 없기때문에 byte타입의 변수의 값을 저장할때는 이처럼 int 타입의 리터럴을 사용한다. 대신에 byte 타입의 변수가 저장할 수 있는 범위의 값이어야한다는 제약이 있다. byte 타입의 변수가 저장할 수 있는 값은 -128부터 127까지이다. 그 이상, 이하는 에러가 발생한다.
byte b = 128; // 에러
int i = 100; // 10진수
int oct = 0100; // 8진수
int hex = 0x100; // 16진수
정수형 리터럴은 앞에 접두사를 붙혀서 10진법 외에도 다른 여러가지 진법으로 표현할 수 있다. 접수사가 없으면 10진수. 접두사 0이 앞에 붙으면 8진수 , 0x가 붙으면 16진수, 0b가 붙으면 2진수를 의미한다.
long l = 10_000_000_000L; // 이 값은 0이 10개니까 100억이다. int 값이 대략 20억정도인데 그 이상의 값은 long타입의 변수에 담아야한다. 100억은 int 값의 범위인 20억을 넘기때문에 반드시 접미사 L을 써줘야한다.
ling l = 100; // OK. long타입의 값을 저장할 때 이처럼 int타입의 리터럴을 써도 되기때문에 접미사를 써도되고 안써도된다.
float f =3.14f; // 실수형 float와 double 타입의 변수의 값을 저장할때는 접미사를 타입에 맞게 붙혀야 한다.
double d = 3.14d; // double 타입의 d는 생략할 수 있다. 하지만 f는 생략할 수 없다. .만일 f를 생략하면 3.14가 double타입이 되어버린다. 에러가 발생한다.
변수의 값을 저장할때는 변수의 타입과 리터럴 타입이 일치해야한다.
<Quiz>
10. >>> 10.0 // 실수형 double 타입 리터럴
.10 >>> 0.10 // 실수형 double 타입 리터럴
10f >>> 10.0f // 실수형 리터럴
1e3 >>> 1000.0 // e는 10의 n제곱을 의미한다. 이 리터럴은 실수형이고 접미사가 없으니 double 타입이다.
변수와 리터럴의 타입 불일치
변수에 저장할 리터럴 타입은 변수의 타입과 일치하는게 보통이지만 반드시 일치해야만 하는 것은 아니다.
변수와 리터럴의 타입이 달라도 리터럴의 타입보다 변수의 타입이 저장범위가 더 넓으면 괜찮다.
범위가 '변수>리터럴' // ok. 물건보다 물건을 담는 그릇이 크기때문에 괜찮다.
int i = 'A'; // int > char 문자 A의 문자코드인 65가 변수 i에 저장된다. 저장하려는 캐릭터타입이지만 변수의 타입이 int니까 저장범위가 더 넓어서 가능하다.
long l =123; // long > int
double d = 3.14f; // double > float
반대로 리터럴의 타입보다 변수의 타입의 범위가 좁으면 에러가 발생한다. '변수<리터럴'. 담으려는 물건이 그릇보다 크기 때문에 에러가 발생합니다.
int i = 30_0000_0000; // int의 범위(±20억) 벗어남
long l = 3.14f; // long<float. long 타입이 8byte이고 float 타입이 4byte여서 괜찮을 것 같지만 실수형은 정수형보다 저장범위가 넓기때문에 에러가 발생한다.
float f = 3.14; // float < double ..별 문제 없어보이지만 double 타입의 값을 float 타입의 변수에 저장하는 것이기 때문에 에러가 발생한다. 앞서 설명한 것과 같이 실수형 리터럴에 접미사가 없으면 접미사d가 생략된 것이다.
byte,short 변수에 int리터럴 저장가능, 단 변수의 타입의 범위 이내어야 함
byte b = 100; // ok. byte의 범위 (-128~127)에 속함
byte b = 128; // 에러. byte의 범위를 벗어남
출처 :
'Language > Java' 카테고리의 다른 글
[Java] 기본형과 참조형 (0) | 2023.01.17 |
---|---|
[Java] 두 변수의 값 바꾸기 (0) | 2023.01.11 |
[Java] 변수(Variable)-2 (0) | 2023.01.10 |
[Java] Java API, 이클립스(Eclipse) (0) | 2023.01.01 |
[Java] Java start.. (0) | 2023.01.01 |
댓글