해당 글은 아래 링크를 참고하여 작성되었습니다.
2. 타입
1. 변수
변수는 데이터를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간이다.
변수는 데이터를 저장할 수 있는 메모리 공간을 의미하고 이렇게 저장한 값은 변경될 수 있다.
Java에서는 변수 뿐 아니라 클래스, 메서드 등의 이름을 지을 때 공통된 규칙이 있다.
1) 변수의 이름은 영문자(대소문자), 숫자, 언더스코어(_), 달러($)로만 구성할 수 있다
2) 변수의 이름은 숫자로 시작할 수 없다
3) 변수의 이름 사이에는 공백을 포함할 수 없다
4) 변수의 이름으로 자바에서 미리 정의된 키워드(keyword)는 사용할 수 없다
변수의 종류는 기본형과 참조형 변수가 있는데 기본형 변수는 실제 연산에 사용되는 변수로 아래의 기본형 변수가 제공된다.
1) 정수형 : byte, short, int, long
2) 실수형 : float, double
3) 문자형 : char
4) 논리형 : boolean
참조형 변수는 8개의 기본형 변수를 사용해 사용자가 직접 만들어 사용하는 변수를 의미한다.
2. 상수
상수는 변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간이지만 차이점은 프로그램이 실행되는 동안 메모리에 저장된 데이터를 변경할 수 없다.
상수는 선언과 동시에 초기화해야하는데 C++에서는 const 키워드를 사용하여 상수를 선언하지만 자바에서는 final 키워드를 사용하여 선언한다.
final int AGES = 30;
상수의 이름은 일반적으로 모두 대문자를 사용하여 선언하고 여러 단어로 이루어진 이름의 경우 언더스코어를 사용해 구분한다.
리터럴은 그 자체로 값을 의미하는 것으로 변수와 상수와 달리 데이터가 저장된 메모리 공간을 가리키는 이름을 가지고 있지 않다.
int var = 30; // 30이 리터럴
final int AGES = 100; // 100이 리터럴
3. 기본 타입
타입은 해당 데이터가 메모리에 어떻게 저장되고 프로그램에서 어떻게 처리되어야 하는지 명시적으로 알려주는 역할을 한다.
자바에서는 여러 형태의 타입을 미리 정의하여 제공하고 있는데, 이것을 기본 타입이라고 한다.
자바의 기본 타입은 모두 8종류가 제공되고 크게는 정수형, 실수형, 문자형 그리고 논리형 타입으로 나눌 수 있다.
1) 정수형 타입 : byte, short, int, long
2) 실수형 타입 : float, double
3) 문자형 타입 : char
컴퓨터는 2진수밖에 인식하지 못하므로 문자도 숫자로 표현해야 인식할 수 있다.
따라서 어떤 문자를 어떤 숫자에 대응시킬 것인가에 대한 약속이 필요하다.
C언어와 C++에서는 아스키코드를 사용하여 문자를 표현한다.
아스키코드는 영문 대소문자를 사용하는 7비트의 문자 인코딩 방식이고 문자 하나를 7비트로 표현하므로, 총 128개의 문자를 표현할 수 있다.
하지만 자바에서는 유니코드를 사용하여 문자를 표현한다.
아스키코드는 영문자와 숫자밖에 표현 못 하지만 유니코드는 각 나라의 모든 언어를 표현할 수 있다.
유니코드는 문자 하나를 16비트로 표현하므로 총 65,536개의 문자를 표현할 수 있다.
4) 논리형타입 : boolean
4. 실수의 표현
컴퓨터로 실수를 표현하는 법은 정수에 비해 복잡하다.
현재는 아래의 두 가지 방법으로 표현하고 있다.
1) 고정 소수점 방식
실수는 보통 정수부와 소수부로 나눌 수 있다.
따라서 실수를 표현하는 가장 간단한 방식은 소수부의 자릿수를 미리 정하여 고정된 자릿수의 소수를 표현하는 것이다.
하지만 이 방식은 정수부와 소수부의 자릿수가 크지 않아 표현할 수 있는 범위가 매우 적다.
2) 부동 소수점 방식
하나의 실수를 정수부와 소수부가 아닌 가수부와 지수부로 나누어 표현한다.
현재 대부분의 시스템에서는 부동 소수점 방식으로 실수를 표현한다.
현재 사용되고 있는 부동 소수점 방식은 대부분 IEEE 754 표준을 따르고 있는데 아래와 같이 표현한다.
부동 소수점 방식에서의 오차는 앞서 살펴본 공식에 의해 발생하는데 표현할 수 있는 범위는 늘어나지만 10진수를 정확하게 표현할 수는 없다.
5. 타입 변환
하나의 타입을 다른 타입으로 바꾸는 것을 타입 변환이라고 한다.
자바에서는 boolean 형을 제외하면 나머지 기본 타입 간의 변환을 자유롭게 할 수 있다.
다른 타입끼리의 연산은 우선 피연산자들을 같은 타입으로 만든 후에 수행된다.
메모리에 할당받은 바이트 크기가 상대적으로 적은 타입에서 큰 타입으로 타입 변환은 생략할 수 있다.
하지만 메모리 할당 큰 바이트 -> 작은 바이트 타입으로 변환 시 자바 컴파일러는 오류를 발생시킨다.
자바에서 타입 변환은 크게 다음과 같이 두 가지 방식으로 나뉜다.
1) 묵시적 타입 변환(자동 타입 변환)
묵시적 타입 변환이란 대입 연산이나 산술 연산에서 컴파일러가 자동으로 수행해주는 타입 변환을 가킨다.
자바에서는 데이터의 손실이 발생하지 않거나 데이터의 손실이 최소화되는 방향으로 묵시적 타입 변환을 진행한다.
따라서 자바에서는 타입의 표현 범위에 따라 다음과 같은 방향으로 자동 타입 변환이 이루어진다.
byte형 → short형 → int형 → long형 → float형 → double형
char형 ↗
2) 명시적 타입 변환(강제 타입 변환)
명시적 타입 변환이란 사용자가 타입 캐스트 연산자(())를 사용하여 강제적으로 수행하는 타입 변환을 가리킨다.
변환시키고자 하는 데이터의 앞에 괄호(())를 넣고, 그 괄호 안에 변환할 타입을 적으면 되는데 자바에서는 이 괄호를 타입 캐스트(type cast) 연산자라고 한다.
3. 연산자
1) 산술 연산자(arithmetic operator)
산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자로 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다.
+ | 왼쪽의 피연산자에 오른쪽의 피연산자를 더함. |
- | 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺌. |
* | 왼쪽의 피연산자에 오른쪽의 피연산자를 곱함. |
/ | 왼쪽의 피연산자를 오른쪽의 피연산자로 나눔. |
% | 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 반환함. |
자바에서 연산자의 우선순위와 결합 방향은 아래의 표를 참고하자.
1 | [] | 첨자 연산자 | 왼쪽에서 오른쪽으로 |
. | 멤버 연산자 | 왼쪽에서 오른쪽으로 | |
2 | ++ | 후위 증가 연산자 | 왼쪽에서 오른쪽으로 |
-- | 후위 감소 연산자 | 왼쪽에서 오른쪽으로 | |
3 | ! | 논리 NOT 연산자 | 오른쪽에서 왼쪽으로 |
~ | 비트 NOT 연산자 | 오른쪽에서 왼쪽으로 | |
+ | 양의 부호 (단항 연산자) | 오른쪽에서 왼쪽으로 | |
- | 음의 부호 (단항 연산자) | 오른쪽에서 왼쪽으로 | |
++ | 전위 증가 연산자 | 오른쪽에서 왼쪽으로 | |
-- | 전위 감소 연산자 | 오른쪽에서 왼쪽으로 | |
(타입) | 타입 캐스트 연산자 | 오른쪽에서 왼쪽으로 | |
4 | * | 곱셈 연산자 | 왼쪽에서 오른쪽으로 |
/ | 나눗셈 연산자 | 왼쪽에서 오른쪽으로 | |
% | 나머지 연산자 | 왼쪽에서 오른쪽으로 | |
5 | + | 덧셈 연산자 (이항 연산자) | 왼쪽에서 오른쪽으로 |
- | 뺄셈 연산자 (이항 연산자) | 왼쪽에서 오른쪽으로 | |
6 | << | 비트 왼쪽 시프트 연산자 | 왼쪽에서 오른쪽으로 |
>> | 부호 비트를 확장하면서 비트 오른쪽 시프트 | 왼쪽에서 오른쪽으로 | |
>>> | 부호 비트까지 모두 비트 오른쪽 시프트 | 왼쪽에서 오른쪽으로 | |
7 | < | 관계 연산자(보다 작은) | 왼쪽에서 오른쪽으로 |
<= | 관계 연산자(보다 작거나 같은) | 왼쪽에서 오른쪽으로 | |
> | 관계 연산자(보다 큰) | 왼쪽에서 오른쪽으로 | |
>= | 관계 연산자(보다 크거나 같은) | 왼쪽에서 오른쪽으로 | |
instanceof | 인스턴스의 실제 타입 반환 | 왼쪽에서 오른쪽으로 | |
8 | == | 관계 연산자(와 같은) | 왼쪽에서 오른쪽으로 |
!= | 관계 연산자(와 같지 않은) | 왼쪽에서 오른쪽으로 | |
9 | & | 비트 AND 연산자 | 왼쪽에서 오른쪽으로 |
10 | ^ | 비트 XOR 연산자 | 왼쪽에서 오른쪽으로 |
11 | | | 비트 OR 연산자 | 왼쪽에서 오른쪽으로 |
12 | && | 논리 AND 연산자 | 왼쪽에서 오른쪽으로 |
13 | || | 논리 OR 연산자 | 왼쪽에서 오른쪽으로 |
14 | ? : | 삼항 조건 연산자 | 오른쪽에서 왼쪽으로 |
15 | = | 대입 연산자 및 복합 대입 연산자 (=, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |=) |
오른쪽에서 왼쪽으로 |
2) 대입 연산자(assignment operator)
대입 연산자는 변수에 값을 대입할 때 사용하는 이항 연산자로 피연산자들의 결합 방향은 오른쪽에서 왼쪽이다.
= | 왼쪽의 피연산자에 오른쪽의 피연산자를 대입함. |
+= | 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
-= | 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
*= | 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
/= | 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
%= | 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입함. |
&= | 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 AND 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
|= | 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 OR 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
^= | 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 XOR 연산한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
<<= | 왼쪽의 피연산자를 오른쪽의 피연산자만큼 왼쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
>>= | 왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호를 유지하며 오른쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
>>>= | 왼쪽의 피연산자를 오른쪽의 피연산자만큼 부호에 상관없이 오른쪽 시프트한 후, 그 결괏값을 왼쪽의 피연산자에 대입함. |
3) 증감 연산자(increment and decrement operators)
증감 연산자는 피연산자를 1씩 증가 혹은 감소시킬 때 사용하는 연산자다.
++x | 먼저 피연산자의 값을 1 증가시킨 후에 해당 연산을 진행함. |
x++ | 먼저 해당 연산을 수행하고 나서, 피연산자의 값을 1 증가시킴. |
--x | 먼저 피연산자의 값을 1 감소시킨 후에 해당 연산을 진행함. |
x-- | 먼저 해당 연산을 수행하고 나서, 피연산자의 값을 1 감소시킴. |
4) 비교 연산자(comparison operator)
비교 연산자는 피연산자 사이의 상대적인 크기를 판단하는 연산자다.
비교 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다.
== | 왼쪽의 피연산자와 오른쪽의 피연산자가 같으면 참을 반환함. |
!= | 왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않으면 참을 반환함. |
> | 왼쪽의 피연산자가 오른쪽의 피연산자보다 크면 참을 반환함. |
>= | 왼쪽의 피연산자가 오른쪽의 피연산자보다 크거나 같으면 참을 반환함. |
< | 왼쪽의 피연산자가 오른쪽의 피연산자보다 작으면 참을 반환함. |
<= | 왼쪽의 피연산자가 오른쪽의 피연산자보다 작거나 같으면 참을 반환함. |
5) 논리 연산자(logical operator)
논리 연산자는 주어진 논리식을 판단하여, 참(true)과 거짓(false)을 결정하는 연산자다.
AND 연산과 OR 연산은 두 개의 피연산자를 가지는 이항 연산자이며 피연산자들의 결합 방향은 왼쪽에서 오른쪽이고 NOT 연산자는 피연산자가 단 하나뿐인 단항 연산자이며 피연산자의 결합 방향은 오른쪽에서 왼쪽이다.
&& | 논리식이 모두 참이면 참을 반환함. (논리 AND 연산) |
|| | 논리식 중에서 하나라도 참이면 참을 반환함. (논리 OR 연산) |
! | 논리식의 결과가 참이면 거짓을, 거짓이면 참을 반환함. (논리 NOT 연산) |
6) 비트 연산자(bitwise operator)
비트 연산자는 논리 연산자와 비슷하지만, 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자다.
비트 단위로 왼쪽이나 오른쪽으로 전체 비트를 이동하거나 1의 보수를 만들 때도 사용된다.
& | 대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산) |
| | 대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산) |
^ | 대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산) |
~ | 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산, 1의 보수) |
<< | 명시된 수만큼 비트들을 전부 왼쪽으로 이동시킴. (left shift 연산) |
>> | 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산) |
>>> | 지정한 수만큼 비트를 전부 오른쪽으로 이동시키며, 새로운 비트는 전부 0이 됨. |
7) 삼항 연산자(ternary operator)
삼항 연산자는 자바에서 유일하게 피연산자를 세 개나 가지는 조건 연산자다.
조건식 ? 반환값1 : 반환값2 의 형태로 조건식의 결과가 참이면 반환값1을, 거짓이면 반환값2를 반환한다.
8) instanceof 연산자
instanceof 연산자는 참조 변수가 참조하고 있는 인스턴스의 실제 타입을 반환한다.
해당 객체가 어떤 클래스나 인터페이스로부터 생성되었는지를 판별해 주는 역할을 한다.
'dev > 기본쌓기' 카테고리의 다른 글
[JAVA] 빠르게 정리하는 자바 문법 (4) (0) | 2024.12.31 |
---|---|
[JAVA] 빠르게 정리하는 자바 문법 (3) (4) | 2024.12.30 |
[JAVA] 빠르게 정리하는 자바 문법 (1) (2) | 2024.12.30 |
[스프링 입문] Spring Boot 입문(3) (6) | 2024.12.18 |
[스프링 입문] Spring Boot 입문(2) (0) | 2024.12.11 |