데이터를 저장할 수 있는 메모리 공간이다. 변수 하나당 데이터 타입에 해당되는 하나의 값만 저장할 수 있다. 프로그램은 변수를 통해 특정 주소에 값을 저장하고 읽는다.
1) 영어, 숫자, _, $로 구성
2) 첫글자 숫자 작성 불가
3) 대소문자 구분
4) 길이제한 없음
5) 특수기호는 _, $ 제외 사용 불가
6) 공백 포함 불가
7) 예약어 사용 불가
변수명은 식별하기 쉽도록 성격을 담아 작성하는 것이 좋다.
변수의 종류는 선언 위치에 따라 전역변수와 지역변수로 구분된다.
변수는 선언 위치에 따라 전역변수와 지역변수로 나뉘어진다.
1) 전역변수
2) 지역변수
public class Main {
int a = 20; // 전역변수
public static void main(String[] args) {
int a = 10; // 지역변수
System.out.println(a)
}
}
출력
10
같은 타입과 같은 변수명의 전역변수와 지역변수가 있을 때 에러가 일어나지 않는다. 프로그램은 전역변수 a와 지역변수 a를 각각 다른 객체로 보고있다.
이런경우 지역변수가 우선적으로 처리되어 지역변수 a에 저장된 10이 출력된다.
변수에 저장할 수 있는 데이터의 형태이다. 변수 선언 시 변수명 앞에 자료형 정의하여 사용한다.
변수에는 무조건 자료형이 필요하다.
int a = 5;
char i = "문자열";
| 형태 | 예약어 | 크기 | 기본값 |
|---|---|---|---|
| 논리값 | boolean | 1byte | false |
| 문자열 | char | 2byte | '\u0000' |
| 정수형 | byte | 1byte | 0 |
| 정수형 | short | 2byte | 0 |
| 정수형 | int | 4byte | 0 |
| 정수형 | long | 8byte | 0l |
| 실수형 | float | 4byte | 0.0f |
| 실수형 | double | 8byte | 0.0 |
float 선언float a = 11.1f;
double 선언double a = 11.1;
기본자료형의 크기와 타입, 기본값은 외워두는 것이 좋다.
📌 업데이트 : 실수 자료형의 계산 오차
1. 자동 타입 변환
작은 타입이 큰 타입으로 저장될 때는 별도 지시 없이 자동으로 타입이 변환된다.
byte < short < int < long < float < double
short snum = 3;
double dnum = snum;
byte a = 1;
byte b = 2;
int i = a + b; // a와 b의 타입이 int로 변환
2. 강제 타입 변환
1) 큰 타입을 작은 타입으로 변환
double dnum = 3.14;
int inum = (int) dnum; // 정수에 해당하는 3만 저장
2) 문자열 타입 변환
// 문자열 - > 숫자 : parse()
String s = "100";
int inum = Integer.parseInt(a);
// 숫자 -> 문자열 : valueOf()
short snum = 15;
String s = String.valueOf(snum);
캐스팅에 대해 더 자세히 정리해서 아래에 첨부한다.
캐스팅
참조형은 위에서 언급한 기본형 8가지를 제외한 모든 타입이다.
실제 값을 갖는 것이 아닌 데이터가 저장된 메모리의 주소값을 가지는 자료형이다.

renumer에 분자1 * 분모2 + 분자2 * 분모1을 계산하여 저장한다.redenom에 분모1 * 분모2을 계산하여 저장한다.i는 2부터 분모까지 증가한다. (최대공약수를 구하기 위함이니 분자를 적어도 상관없다.)i가 증가하다가 분자와 분모의 공약수면 answer에 분자와 분모를 순서대로 저장한다.answer[0]에 저장된 값이 없다면// 프로그래머스 분수의 덧셈
class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) { //1
int[] answer = new int[2]; // 2
int renumer = numer1 * denom2 + numer2 * denom1; // 3-1
int redenom = denom1 * denom2; // 3-2
for(int i = 2; i <= redenom; i++){ // 4-1
if(renumer % i == 0 && redenom % i == 0){ //4-2
answer[0] = renumer / i; // 4-3
answer[1] = redenom / i;; // 4-3
}
}
if(answer[0] == null){ // 5
answer[0] = renumer; // 6
answer[1] = redenom;
}
return answer;
}
}
/Solution.java:13: error: bad operand types for binary operator '=='
if(answer[0] == null){
^
first type: int
second type: <null>
// if(answer[0] == null) 문장에서 first type은 int고 second type은 <null>이다.
배열은 참조타입이니까 참조타입의 기본값인 null이 저장되어 있을 것이라고 생각했는데, 타입이 맞지 않는다고 한다.
if문만 떼어서 보자
if(answer[0] == 0){ // 여기
answer[0] = renumer;
answer[1] = redenom;
}
null을 0으로 수정했더니 통과됐다.
배열은 참조형이지만 배열의 요소는 int의 자료형을 갖기 때문에 기본값 0으로 초기화된다.
그렇다면 null상태인 배열은 어떤 상태를 말하는 걸까
String [] answer; // 선언만 한 상태
System.out.println(answer[0]); // 오류발생
즉 배열변수만 생성 했을 때, 변수 자체가 null상태 인 것이다. 이 때 answer[0]에 접근하려고 하면 NullPointerException 오류가 발생한다.
String [] answer = new String[크기]
System.out.println(answer[0]);
출력
null
예시코드 2는 String배열을 선언하고 new String[크기]로 초기화 해준 상태다.
String배열의 요소는 참조타입인 String이다. 그래서, 배열 요소는 기본값으로 null값을 갖게 된다. 실제로 출력해보면 null이 출력된다.
문제를 풀기 위해 알고리즘을 구상하는 것도 어려웠는데 작은 요소까지 어려운 문제였다. null일 때 오류가 나서 Null로도 고쳐봤는데 그건 해결이 되지 않아 자료를 많이 찾아봤다...
참고 자료