자바로 개발을 하지만 자바에 대해 많이 모른다고 느껴질 때가 있습니다.
Java의 정석으로 한번 더 학습하면서 간단하게 정리하거나 생각을 기록하려고 합니다.
이 포스트는 자바의 정석을 읽으면서 공부한 내용을 한번 더 정리하며 기록하는 포스트이고, 주관적인 생각이 들어갈 수 있습니다.
자바 공부를 하시는 분들이라면 "자바의 정석" 도서를 추천하고, 학습 시 모르는 부분은 저자 남궁성 님께서 운영하시는 카페를 통해 학습하시면 더 좋은 성과가 있을 거라 기대합니다.
https://cafe.naver.com/javachobostudy
잘못된 내용이나 피드백 및 생각 공유는 언제든 환영입니다. 댓글로 남겨주시면 확인 후 수정하겠습니다.
1-1. 변수(variable)란?
"단 하나의 값을 저장할 수 있는 메모리 공간"
하나의 변수에 단 하나의 값만 저장할 수 있고, 새로운 값을 저장하면 기존의 값은 사라진다.
1-2. 변수의 선언과 초기화
- 변수의 선언
변수의 선언은 "변수타입"과 "변수이름"으로 선언한다.
int age;
변수타입(int)은 변수에 저장될 값이 어떤 타입인지 지정합니다.
변수이름(age)은 말 그대로 변수에 붙인 이름이고, 변수이름을 통해 변수에 저장된 값을 부를 수 있다.
- 변수의 초기화
변수를 선언한 이후부터는 변수를 사용할 수 있으나, 그 전에 반드시 변수를 "초기화"해야한다.
메모리는 공유하므로 전에 다른 프로그램에 의해 저장된 알 수없는 값이 남아있을 수 있기 때문이다.
int age = 25; // 변수 age를 선언하고 25로 초기화 한다
"변수의 초기화란, 변수를 사용하기 전에 처음으로 값을 저장하는 것"
지역변수는 사용되기 전에 반드시 초기화를 해야한다.
대입연산(=)은 우변의 모든 계산이 끝난 후에 제일 마지막에 수행된다.
1-3. 변수의 명명규칙
1. 대소문자가 구분되며 길이에 제한이 없다.
2. 예약어를 사용해서는 안 된다.
3. 숫자로 시작해서는 안 된다.
4. 특수문자는 '_'와 '$'만을 허용한다.
JAVA8 예약어 목록 : https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
필수적인 것은 아니지만 자바 프로그래머들에게 권장하는 규칙들
1. 클래스의 이름의 첫 글자는 항상 대문자로 한다.
2. 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다. (카멜표기법)
3. 상수의 이름은 모두 대분자로한다. 여러 단어로 이루어진 경우 '_'로 구분한다.
변수의 이름은 짧을수록 좋지만, 약간 길더라도 알기 쉬운 "의미있는 이름"으로 하자. (클린코드도 읽자!)
1-4. 변수의 타입
자료형은 크게 "기본형"과 "참조형" 두 가지로 나뉜다.
기본형은 실제 값(data)를 저장하고, 참조형은 값이 저장되어있는 메모리 공간의 주소(address)를 값으로 갖는다.
기본형(primitive type)
- 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)
계산을 위해 실제 값을 저장
참조형(reference type)
- 8개의 기본형을 제외한 나머지 타입, 객체의 주소를 저장
자료형의 종류와 크기 : https://www.w3schools.com/java/java_data_types.asp
1-5. 상수와 리터럴(constatns & literal)
"상수"는 변수와 마찬가지로 값을 저장할 수 있는 공간이지만, 변수와 달리 값을 한 번 저장하면 변경할 수 없다.
// 상수 선언 시 변수타입 앞에 "final"을 붙여주면 된다
final int MAX_SPEED = 10;
상수는 반드시 선언과 동시에 초기화를 하는것을 권장하고, 그 후에는 값을 변경할 수 없다.
"리터럴"은 그 자체로 값을 의미하는 것이고 우리가 기존에 알고 있던 "상수"의 다른 이름일 뿐이다.
변수 : 하나의 값을 저장하기 위한 공간
상수 : 값을 한번만 저장할 수 있는 공간
리터럴 : 그 자체로 값을 의미하는 것
1-6. 타입의 불일치
리터럴의 타입은 저장될 변수의 타입과 일치하는 것이 보통이다.
하지만 타입이 달라도 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용된다.
어떠한 타입과 문자열을 덧셈연산을 하면 그 결과는 무조건 문자열이다.
1-7. 형 변환(캐스팅, casting)
형 변환은 변수 또는 상수(리터럴)의 타입을 다른 타입으로 변환하는 것이다.
서로 타입이 다른 값끼리 연산을 해야할 때 타입을 일치시킨 후 연산을 해야하므로 형 변환이 필요하다.
형 변환의 방법은 아주 간단한데, 형 변환하고자 하는 변수나 리터럴 앞에 타입을 괄호와 함께 붙여주면 된다.
// 형 변환 방법 : 타입(피연산자)
double d = 85.4;
int score = (int)d; // double타입의 변수 d를 int타입으로 변환
위 예제에서 변수 d 자체가 int형으로 형 변환된게 아니라, d의 값을 읽어 형 변환 후 그 결과를 반환하여 대입할 뿐이다.
즉 변수 d의 값은 형변환 후에도 아무런 변화가 없다.
- 기본형에서 boolean을 제외한 모든 타입들은 서로 형 변환이 가능하다.
큰 타입에서 작은 타입으로 변환할 때는 타입의 크기가 작아지기 때문에 크기의 차이만큼 값이 잘려나간다.
그래서 경우에 따라 값 손실이 발생할 수 있으니 고려해야한다.
1-8. 자동 형 변환
서로 다은 타입간의 대입이나 연산을 할 때, 형 변환으로 타입을 일치시키는 것이 원칙이다.
하지만, 경우에 따라 편의성을 위해 형 변환을 생략할 수 있다.
형 변환을 생략 시 형 변환이 이루어지지 않는 것은 아니고, 컴파일러가 자동적으로 추가한다.
범위가 큰 타입에 작은 타입을 저장하려 하는 경우 자동 형 변환이 이루어진다.
반대로 범위가 작은 타입에 큰 타입을 저장하려하면 에러가 발생하는데, 이는 값의 손실이 날 수 있기 때문이다.
double d = 1234; // 에러 X, double d = (float)1234; 와 동일
byte b = 1000; // 에러 O, 1000은 byte 범위(-128~127)을 넘어감
위 byte 예시의 에러를 해결하려면 처음 배운 명시적 형 변환으로 선언하면 해결할 수 있다.
명시적 형 변환은 프로그래머가 의도적으로 변환 한 것이기 때문에 값 손실이 있더라도 에러를 발생시키지 않는다.
연산 시에도 자동 형 변환이 이루어지는데, 연산되는 두 타입 중 더 넓은(큰) 타입으로 형 변환하여 타입을 일치시킨 후 연산한다.
이는 값 손실의 위험이 더 적기 때문에 올바른 결과를 얻을 확률이 높다.
int a = 10;
double b = 1.1 + a; // 형변환을 하지 않아도 더 큰 타입인 double형으로 연산되어 반환
- 자동 형 변환의 규칙
기존의 값을 최대한 보존할 수 있는 타입으로 자동 형 변환한다.
1. boolean을 제외한 나머지 7개의 기본형은 서로 형 변환이 가능하다.
2. 기본형과 참조형은 서로 형 변환할 수 없다.
3. 서로 다른 타입의 변수간에 연산은 형 변환을 하는 것이 원칙이지만,
값의 범위가 작은 타입에서 큰 타입으로의 형 변환은 생략할 수 있다.
'Java' 카테고리의 다른 글
[Java] 오버로딩(overloading) / 오버라이딩(overriding) (0) | 2021.08.28 |
---|---|
[Java] Class(클래스)와 객체(Object) (2) | 2021.08.23 |
[Java의 정석/5강정리] 05. 배열 (0) | 2021.08.06 |
[Java의 정석/3강정리] 03. 연산자 (0) | 2021.08.04 |
[Java의 정석/1강정리] 01. 자바를 시작하기 전에 (0) | 2021.08.01 |
댓글