본문 바로가기

java

[JAVA] - 변수(Variable)

 이 내용은 남궁성 자바의 정석을 토대로 작성 되었습니다.

 <순서>

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)' 하는데 프로그래밍 구문에 사용되는 단어를 뜻한다. 그래서 에약어는 클래스나 변수 메서드의 이름으로 사용할 수 없다. 

 

 

 

* 책 추천 : 읽기 좋은 코드가 좋은 코드다

 

https://search.naver.com/search.naver?where=nexearch&sm=top_sug.pre&fbm=1&acr=1&acq=%EC%9D%BD%EA%B8%B0+%EC%A2%8B%EC%9D%80+%EC%BD%94%EB%93%9C%EA%B0%80+%E3%85%88&qdt=0&ie=utf8&query=%EC%9D%BD%EA%B8%B0+%EC%A2%8B%EC%9D%80+%EC%BD%94%EB%93%9C%EA%B0%80+%EC%A2%8B%EC%9D%80+%EC%BD%94%EB%93%9C%EB%8B%A4 

 

읽기 좋은 코드가 좋은 코드다 : 네이버 통합검색

'읽기 좋은 코드가 좋은 코드다'의 네이버 통합검색 결과입니다.

search.naver.com

 

 

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

 

반응형