이 내용은 남궁성 자바의 정석을 토대로 작성 되었습니다.
<순서>
1. 변수란?
1.2 변수의 명명 규칙
2. 변수의 타입과 자료형(primitive , reference)
3. 변수의 타입과 자료형에 따른 stream API 제약 (primitive type 의 박싱, 언박싱)
1. 변수란?
"변수란, 단 하나의 값을저장할 수 있는 메모리 공간"
하나의 변수에 단 하나의 값만 저장 할 수 있으므로, 새로운 값을 저장하면 기존의 값은 사라진다.
변수를 선언하면, 메모리의 빈 공간에 "변수 타입" 에 알맞은 크기의 저장 공간이 확보 되고 앞으로 이 저장 공간은 "변수 이름" 을 통해 사용할 수 있게 된다.
변수의 초기화
변수를 선언한 이후 부터는 변수를 사용할 수 있으나, 그 전에 반드시 변수를 초기화(Initialization) 해야한다.
메모리는 여러 프로그램이 공유하는 자원이므로 전에 다른 프로그램에 의해 저장된 알수 없는 값(쓰레기 값, garbage value) 이 남아있을 수 있기 때문이다.
int a;
int b
int x = 0;
int y = 0;
한줄로 선언 가능하다.
int a,b;
int x =0, y=0;
"변수의 초기화란, 변수를 사용하기 전에 처음으로 값을 저장하는것"
1.2 변수의 명명 규칙
'변수의 이름' 처럼 프로그래밍에서 사용하는 모든 이름을 '식별자' 라고 하며, 식별자는 같은 영역 내에서 서로 구분(식별) 될 수 있어야 한다. 그리고 식별자를 만들 때는 다음과 같은 규칙을 지켜야 한다.
1. 대소문자가 구분이 되며 길이에 제한이 없다.
- True 와 true 는 다른것으로 간주된다.
2. 예약어를 사용해서는 안된다.
- true 는 예약어라서 사용할 수 없지만 True 는 가능하다.
3. 숫자로 시작해서는 안 된다.
- top10 은 허용하지만 , 7up 은 허용되지 않는다.
4. 특수문자는 '_' 와 '$' 만을 허용한다.
- $harp은 허용되지만, S#arp 는 혀용되지 않는다.
예약어는 키워드(keyword) 또는 '리져브드 워드(reserved word)' 하는데 프로그래밍 구문에 사용되는 단어를 뜻한다. 그래서 에약어는 클래스나 변수 메서드의 이름으로 사용할 수 없다.
* 책 추천 : 읽기 좋은 코드가 좋은 코드다
2. 변수의 타입
우리가 주로 사용하는 값(data)의 종류(type)는 크게 '문자와 숫자' 로 나눌수 있으며 숫자는 다시 '정수와 실수' 로 나눌 수 있다.
이러한 값(data)의 종류(type) 에 따라 값이 저장될 공간의 크기와 저장 형식을 정의한 것이 자료형(data type) 이다.
자료형에는 문자형(char) , 정수형(byte, short, int, long), 실수형(float, double) 등이있으며 번수를 선언 할 때는 저장하려는 값의 특성을 고려하여 가장 알맞은 자료형을 변수의 타입으로 선택하면된다.
기본형과 참조형
자료형은 크게 '기본형' 과 '참조형' 두 가지로 나눌 수 있는데. 기본형 변수는 실제 값(data) 을 저장하는 반면, 참조형 변수는 어떤 값이 저장되어 있는 주소(memory address) 를 값으로 가진다. 자바는 C언어와 달리 참조형 변수 간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수 이다.
기본형(primitive type)
- 논리형(boolean), 문자형(char) , 정수형(byte, short, int, long) , 실수형 (float, double)
계산을 위한 실제 값을 저장한다. 모두 8개
참조형(reference type)
- 객체의 주소를 저장한다. 8개의 기본형을 제외한 나머지 타입
참조형 변수 (또는 참조 변수) 를 선언 할때는 변수의 타입으로 클래스 이름을 사용하므로 클래스의 이름이 참조 변수의 타입이 된다. 그래서 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 셈이다.
다음은 Date 클래스 타입의 참조 변수 today 를 선언한 것이다. 참조변수는 null 또는 객체의 주소를 값으로 갖으며 참조 변수의 초기화는 다음과 같이 한다.
Date today = new Date; // Date 객체를 생성해서, 그 주소를 today 에 저장
리터럴 타입의 접미사
논리형 : 없음
정수형 : L
실수형 : f, d
문자형 : 없음
문자열 : 없음
+
스트림 API 는 데이터가 객체라는 것을 기본 전제로 설계되어있다.
문자열이나 클래스 타입은 객체이지만 기본형 데이터인 Int, long, double 등의 값을 처리하게 되면
기술적으로는 문제가 없으나 이 데이터는 객체가 아니기 때문에 Stream 내부적으로 오토박싱과 언박싱이 빈번하게 발생한다. 이는 처리 시간의 급격한 증가를 가져온다.
- 스트림 API 에서는 기본형으로 많이 사용하는 Int, long, double 을 위해 별도의 인터페이스를 제공한다.
- 별도의 인터페이스 사용
List<Integer> evenInts = IntStream.rangeClosed(1, 10)
.filter(i -> i % 2 == 0)
.boxed()
.collect(Collectors.toList());
- 제너릭 처리로 박싱이 일어나는 경우
// returns 78
int sum = Arrays.asList(33,45)
.stream()
.mapToInt(i -> i)
.sum();
* 박싱, 언박싱이란?
- 래퍼 클래스(Wrapper Class) 제너릭 타입에는 자료형을 지정할 수 있는데 기본 자료형인 원시형은 넣을 수 없다.
제네릭 타입에 넣기 위해서는 원시형(기본형)을 담을 수 있는 클래스를 넣어야 한다.
즉 원시형(Primitive Type) 을 객체화 한것을 넣어야 하는데 이를 래퍼 클래스(Wrapper Class) 라고 한다.
- boolean 래퍼 클래스는 boolean 자료형을 객체화 한것이고 나머지도 이와 동일하다.
- 박싱 : 박싱(Boxing)은 원시형(Primitive Type) 을 래퍼 클래스로 바꾸는것이다.
- 언박싱 : 래퍼 클래스를 원시형(Primitive Type) 으로 바꾸는 것이다.
[출처 : https://cbw1030.tistory.com/285]
출처:
https://truehong.tistory.com/27
https://futurecreator.github.io/2018/08/26/java-8-streams/
https://cbw1030.tistory.com/285
'java' 카테고리의 다른 글
SOLID(객체지향설계) - 코드 예제, 리팩토링 (0) | 2021.09.11 |
---|---|
[JAVA] AtomicInteger, 쓰레드 동기화(synchronization) , Atomic, CAS 알고리즘 이해하기 (0) | 2021.08.28 |
[JAVA] 객체 메모리 할당 - Stack, Heap, GC (1) | 2021.08.14 |
[JAVA]Garbage Collection 실행 과정 (0) | 2021.08.07 |
[자바 병렬 처리 - 포크/ 조인 프레임 워크] (0) | 2021.04.17 |