Live-Study

2주차 : Java 데이터 타입, 변수 그리고 배열

WOOKTAE 2021. 3. 7. 16:51

1. 원시 or 기본형 타입  ( Primitive type ) 종류와 값의 범위 그리고 기본 값


  • 기본 값이 있기 때문에 NULL 이 존재하지 않는다. 만약 기본형 타입에 NULL 을 넣고 싶다면 래퍼 클래스를 활용한다.
  • 실제 값을 저장하는 공간으로 스택(Stack) 메모리에 저장된다.
  • 만약 컴파일 시점에 담을 수 있는 크기를 벗어나면 에러를 발생시키는 컴파일 에러가 발생한다. 주로 문법상의 에러가 많다.

종류

출처 :https://gblee1987.tistory.com/176?category=534988

2. 참조 타입 ( Reference Type ) 

  • 기본형 타입을 제외한 타입들이 모두 참조형 타입(Reference Type) 이다.
  • 빈 객체를 의미하는 NULL이 존재 한다
  • 값이 저장되어 있는 곳의 주소 값을 저장하는 공간으로 힙(Heap) 메모리에 저장된다.
  • 문법상으로는 에러가 없지만 실행시켰을 때 에러가 나는 런타임 에러가 발생한다. 예를 들어 객체나 배열을 NULL 값으로 받으면 NullpointException 이 발생하므로 변수값을 넣어야 한다.

출처 :https://gblee1987.tistory.com/176?category=534988


기본형 타입과 참조 타입의 Stack 과 Heap 메모리 영역으로 구분해서 보면 조금더 명확하다.

기본형 타입은 Stack 이라고 불리는 메모리에 영역에 값과 같이 저장 된다. 하지만 참조 타입값이 Heap 영역에 저장되고 Stack 영역에는 해당 데이터의 주소값을 가지고 참조하는 형태로 저장된다.

 

예를 들어 int[] c = {1,2,3,4} 라는 형태로 배열을 선언하면, Stack 에는 c 만 존재하고 실제 값은 Heap 에 저장된다. c 는 해당 배열의 주소값을 가지고 있는 것이다.

 

2. 리터럴 ( Literal ) 이란 ?


리터럴을 공부하기에 상수( Constant ) 와 리터럴 ( Literal ) 을 같이 알아보도록 하자.

 

1. 상수 ( Constant )

상수와 리터럴 둘 다, 변하지 않는 값(데이터)를 의미한다.

코드적으로 말하자면, 상수는 변하지 않는 변수를 뜻한다. 상수는 숫자만 넣어야 한다고 오해하는 사람들이 많은데, 앞서 말했듯이, 상수는 변하지 않는 변수를 뜻하므로 숫자가 아닌 클래스나 구조체 같이 기본형에서 파생된 객체나 유도형같은 데이터를 넣을 수 있다. 

상수는 데이터가 변하지 않아야 한다고 해서 참조변수를 상수로 지정 할 때, 참조변에서 넣은 인스텐스 안의 데이터 까지도 변하지 않는 줄 착각할 수 있지만, 참조변수가 상수 ( 참조변수 메모리의 주소값이 변하지 않는다라는 의미) 지, 그 주소가 가리키는 데이터들끼리 상수라는 의미는 아니다.

 

Java 에서는 Final 제어자를 쓴다.

 

Final Test t1 = new Test();

t1 = new Test(); 는 불가 .   그러나 t1.num = 10; 은 가능 

 

2. 리터럴 ( Literal )

 

리터럴은 프로그램에서 직접 표현한 값을 의미한다. 종류는 정수, 실수, 문자, 논리, 문자열로 나눠 볼 수 있다.

int a = 15;   ( 15  가 리터럴 )

char a = 'L'; (문자 리터럴 L )

String lier = "hello"; ( 'hello' 가 리터럴 )

 

3. 변수 선언 및 초기화 방법

3-1 명시적 초기화 

명시적 초기화란 선언과 동시에 초기화 하는 것을 말함

 

int Oil = 12; // 프리미티브 변수의 초기화

Engine e = new Engine(); // 참조형 변수 의 초기화

 

3-2 생성자 

Car car = new Car (12) // new Car 12 에서 12 로 입력하는게 초기화 입력

 

3-3 초기화 블럭

초기화 블럭은 초기화 작업이 복잡할 때 사용한다. 초기화 블럭 내에 명시적 초기화에서는 쓸 수 없는 조건문, 반복문, 배열, 예외처리 등의 명령문을 통해 복잡한 초기화가 가능하다.

( 초기화 블럭은 생성자 보다 먼저 수행된다 )

4. 변수의 스코프와 라이프 타임 

프로그램상에서 사용되는 변수들은 사용가능한 범위가 존재한다. (스파게티 코드를 피하기 위함이 아닐까?)

해당 범위가 끝나게 되면 메모리에서 해당 변수가 제거 되는 것이 변수의 라이프사이클이라고 할 수 있다.

변수는 2가지 타입으로 나뉠 수 있다.

4-1 전역 변수 

전역 변수는 함수 밖에 선언되어 클래스 전체에서 사용한 변수

 

4-2 지역 변수

지역 변수는 함수 속에 선언하여 해당 함수 속에서만 사용한 변수를 말한다. 

지역 변수 안에 전역 변수와 같은 변수 명으로 선언하고 출력하면 지역변수속 값을 우선시 한다. !

 

5. 타입 변환( 캐스팅 ) 그리고 타입 프로모션

프리미티브 타입에서 Boolean 을 제외한 나머지 7개 타입은 서로 형 변환이 가능하다. 다만, 변수의 바이트가 큰 자료형에서 작은 자료형으로 타입변환을 할때는 데이터의 손실이 발생할 수 있기 때문에 프로그래머가 명시적으로 타입 변환을 수행해야 한다.

값의 범위가 작은 타입에서 큰 타입으로의 변환은 생략이 가능하다. ( 이것이 타입 프로모션 )

 

 

'Live-Study' 카테고리의 다른 글

4 주차 - 클래스 ( Class )  (0) 2021.04.27
3주차 : 연산자  (0) 2021.03.20
1주차 : JDK 와 JRE 차이  (0) 2021.02.28
1주차 : JVM 구성 요소  (0) 2021.02.28
1주차 : JIT 컴파일러란 무엇이며 어떻게 동작하는지  (0) 2021.02.28