여기서 나오는 모든 예제는 깃허브에 있다.
📌 변수
변수는 값을 저장하는 공간이다.
📌 변수란?
프로그래밍에서의 변수란, 값을 저장할 수 있는 메모리상의 공간이라고 한다.
이 공간에 저장된 값은 변할 수 있기 때문에, 변수라고 이름이 붙여졌다.
변수란, 단 하나의 값을 저장할 수 있는 메모리 공간
그렇기 때문에, 새로운 값을 저장하면 기존의 값은 날아가게 된다.
📌 변수의 선언과 초기화
📌 변수의 선언
변수의 선언 방법은
public class Class {
int age; // age라는 이름의 변수 선언
// int : 변수 타입
// age : 변수 이름
}
변수 타입
은 변수에 저장될 값이 어떤 타입인지를 지정해주는 것이다.
변수 이름
변수의 이름이다. 이 변수 이름
은 메모리 공간에 이름을 붙여주는 것이다.
int age;
메모리 주소지가 1이라고 가정했을 때,
int 타입의 age 변수를 1 주소지에 할당해라
가 되는 것이다.
📌 변수의 초기화
변수를 선언한 이후에는 변수를 사용할 수 있는데, 그전에 반드시 변수를 초기화
시켜주어야 한다.
메모리는 여러 프로그램이 공유하기 때문에, 다른 프로그램에 의해 그 메모리가 알 수 없는 값이 들어있을 수 있기 때문에
반드시 초기화를 해주어야 한다.
여기서 연산자가 나오는데 바로 대입 연산자(=)
이다.
이 대입연산자로 변수에게 값을 할당해줄 수 있다.
int age = 26
→ 변수 age를 선언하고 26으로 초기화 시켰다.
같은 타입이라면
int a;
int b;
int x = 0;
int y = 0;
//같은 코드
int a, b;
int x = 0, y = 0;
하지만 코딩 컨벤션은 한줄에 하나를 할당하는게 대부분의 규칙처럼 정형화 되어있다.
이 부분에 대해선 협업하는 사람들에 따라 갈리겠지만 보통의 개발자들은 전자를 선호할 것이다.
변수의 초기화란, 변수를 사용하기 전에 처음으로 값을 저장하는 것
@Test
void test() {
int year = 0;
int age = 21;
year = age + 2000; //변수 age + 2000
age += 1; //age 저장된 값 1증가
assertThat(year).isEqualTo(2021);
assertThat(age).isEqualTo(22);
}
대입 연산자는 바로 수행되는 것이 아니라, 우변에 모든 계산이 끝난 후에 할당을 진행한다.
메서드 안에서 변수를 초기화하는 경우엔 명시적으로 int a = 0;
이렇게 초기화를 진행해주지만,
클래스 변수 즉, 전역변수는 int a;
이렇게 선언만 해주더라도 int 타입에 String을 넣는다거나
혹은 String 타입에 int를 넣는
참사를 방지하기 위해 컴파일러에서 아래에 출력한 0, null처럼 자동으로 값을 할당해 준다.
📌 두 변수의 값 교환하기
너무 유명한 swap 예제이다. CallByValue, CallByReference
조금 원초적으로 책에서는 설명되어있는데,
int a = 10;
int b = 20;
두 값을 서로 바꾸려고 할 때, b에 저장된 값을 a에 해버리면 둘다 20이 될 것이다.
그러기에 중간 변수를 하나 두어 스왑을 해주어야 한다.
int a = 10;
int b = 20;
int temp = 0;
temp = a;
a = b;
b = temp;
이렇게 해서 값을 바꿔주어야 한다.
📌 변수의 타입
값은 크게 문자, 숫자 두가지 부류로 나눌 수 있다.
숫자는 또 실수와 정수
로 나뉜다.
이런 값의 종류에 따라서 값이 지정될 공간의 크기, 저장형식을 정의한 것이 자료형이다.
이 자료형에는 문자형(char)
,정수형(byte, short, int, long)
, 실수형(float, double)
등이 있다.
저장하려는 값의 특성에 따라 알맞은 자료형을 맞춰주면 된다.
📌 기본형과 참조형
- 기본형
- 변수는 값을 실제 값을 저장
boolean
,char
,byte
,short
,int
,long
,float
,double
- 참조형
- 값이 저장되어 있는 주소를 값으로 가짐
- 8개의 기본형을 제외한 나머지 타입
변수 타입에 대한 정리는 여기
📌 상수와 리터럴
상수(constant)
는 말 그대로 변하지 않는 값. 그래서 변수 앞에 final
을 붙여주면 된다.
final
은 선언과 동시에 무조건 초기화를 해주어야하며, 그 이후엔 변경할 수 없다.
static
키워드도 같이 붙여주게 되는데,
붙이는 이유는 어떠한 객체에 final
변수가 하나 있다면 그 객체를 생성할 때마다,
final
변수는 생기게 된다. 하지만 static
을 사용해서 메모리에 적재하게 두면 1개의 변수만이 여러개의 클래스에서 공유하게 되는 것이다.
이 상수를 쓰는 이유는 나는 2가지라고 생각한다.
첫째, 메서드안에 연산을 수행할 때, 하드 코딩
으로 숫자를 집어넣게 되면 무슨일을 하는 숫자인지 모를 수 있다.
그렇기에 상수로 떼어내어서 어떤 역할을 하는 변수인지 의미있게 이름을 준다.
둘째, 반복되는 숫자를 상수로 도출하면 반복코드를 제거할 수 있고, 들어가 있던 값을 상수만 바꿔주면
수정작업도 용이하기 때문이라고 본다.
📌 형변환
캐스팅(casting)
이라고도 부르며 서로 다른 타입간의 연산을 수행할 때,
같은 타입으로 변환시켜주는 것이 바로 형변환이다.
변수나 리터럴 앞에 변환하고자 하는 타입을 명시해주면 변환이 된다.
(타입)피연산자
기본형에서 boolean
을 제외한 나머지 타입들은 서로 형변환이 가능하다.
하지만 기본형과 참조형간의 형 변환은 불가능하다.
그리고 기본형 타입에서도 작은 값을 큰값으로 그러니까 int형 변수를 long 자료형에 넣는다고 한다면
자동 형변환
이 일어나게 된다.
2021-11-06 추가 업데이트
자바 공식문서 페이지를 보면서 추가적으로 여러개를 더 정리해보았다.
📌 변수의 종류
📌 인스턴스 변수 (비정적 필드)
static
키워드 없이 선언된 필드에 저장한다.
해당 값이 클래스의 각 인스턴스(각 개체마다)에 고유하기 때문에 인스턴스 변수라고 한다.
📌 클래스 변수(static 필드)
이 변수는 클래스가 인스턴스화 된 횟수에 상관없이 정확히 한개만 있음을 컴파일러에게 알려준다.
static
은 초기화 후에 변경되지 않게 하려고 final
을 같이 붙여서 사용해준다.
📌 지역 변수
객체가 필드에 상태를 저장하는 방식과 유사하게, 메서드는 임시 상태를 지역변수에 저장한다.
지역변수는 선언된 메서드에서만 볼 수 있다. 나머지 클래스에서는 액세스 불가능
📌 매개변수
흔히 보던 main메서드
public static void main(String[] args){}
에서 args가 바로 매개 변수이다.
매개변수는 항상 필드
가 아닌 변수
로 분류된다는 것이다.