[IT]/JAVA

[Java] 자바 데이터 타입, 변수 그리고 배열 / Primitive / reference / literal

ee2ee2 2020. 12. 6. 17:49
728x90
반응형

목표

 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.

 

학습할 것

 

  • 프리미티브 타입 종류와 값의 범위 그리고 기본 값
  • 프리미티브 타입과 레퍼런스 타입
  • 리터럴
  • 변수 선언 및 초기화하는 방법
  • 변수의 스코프와 라이프타임
  • 타입 변환, 캐스팅 그리고 타입 프로모션
  • 1차 및 2차 배열 선언하기
  • 타입 추론, var

1. 프리미티브(Primitive) 타입 종류와 값의 범위 그리고 기본 값

 

- 기본형(Primitive) 타입 총 8가지로 구성되며, 메모리의 Stack에 저장됨.

기본형 타입 8가지

기본값이 있기 때문에 Null 이 존재하지 않음. 만약 기본형 타입에 Null을 넣고 싶다면 Wrapper 클래스를 사용해야함.


2. 프리미티브 타입(primitive type)과 레퍼런스 타입(reference type)

 

- new 키워드를 이용하여, 객체를 생성하고 데이터가 생성된 주소를 참조하는 타입.

빈 객체를 의미하는 Null 이 존재하고, 참조타입의 데이터 크기가 가변적, 동적이기 때문에 Heap 메모리에 저장됨.

레퍼런스 타입 4가지

더이상 참조하는 변수가 없을 때, Gabage Collector에 의해 메모리 삭제됨.


3. 리터럴(literal)

: 프로그램에서 직접 표현한 값(소스 코드의 고정된 값) / 선언된 변수에 값을 넣어 초기화할 때, 사용하는 값. 

  ex. 정수, 실수, 문자, 논리, 문자열 리터럴이 존재

 

 

+ 추가

상수와 리터럴의 차이


4. 변수 선언 및 초기화하는 방법

: 멤버변수는 초기화 하지 않아고, 변수의 타입에 맞는 기본 값(1번 표 참고)으로 초기화.

  지역 변수는 사용하기 전에 반드시, 초기화가 이뤄져야 함.

 

더보기

- 멤버 변수(인스턴스 변수, 클래스 변수)의 초기화 방법 3가지

1. 명시적 초기화(explicit initialization)

: 변수 선언과 동시에 초기화 하는 것. 변수의 초기화

Class Test {
	int t1= 3; //기본형 변수의 초기화
    Sample s = new Sample(); // 참조형 변수의 초기화
}

 

2. 생성자(constructor)

 

3. 초기화 블럭(initialization block) : 복잡한 초기화 작업을 진행할 때

class initBlock {
   static {} // 클래스 초기화 블럭
    
   {       } //인스턴스 초기화 블럭
}

 1) 클래스 초기화 블럭

      - 클래스를 초기화하는데 사용

      - 클래스가 처음 메모리에 로딩될 때 한 번 만 수행

 

 2) 인스턴스 초기화 블럭

      - 인스턴스 변수를 초기화하는데 사용

      - 생성자와 같이 인스턴스가 생성될 때 수행

      - 인스턴스 초기화 블럭이 생성자보다 먼저 수행

 

 

인스턴스 변수의 초기화는 주로 생성자를 사용. 

인스턴스 초기화 블럭은 모든 생성자에서 공통으로 수행되어야 하는 코드를 넣는데 사용

 

* 예시 (코드 중복)

Test() {
    count++;		//코드 중복
    num = count;	//코드 중복
    
    color = "red";
}


Test(String color){
    count++;		//코드 중복
    num = count;	//코드 중복
    
    this.color = color;
}
//인스턴스 초기화 블럭을 통해 중복 제거
//코드의 간결성 Up!!

{
    count++;		//코드 중복
    num = count;	//코드 중복
}

Test() {    
    color = "red";
}


Test(String color){
    this.color = color;
}

 

- 실행 순서

 : 클래스 초기화 분석 (메모리 로딩시 1번) -> 인스턴스 블럭 -> 생성자


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

- scope란?

 : 프로그램 상에서 변수의 사용가능한 범위. Block scope { } 

 

- 라이프타임?

 : 변수가 메모리에 살아있는 기간

 

더보기

- static 변수

: 메모리에 한 번 할당되어 프로그램이 종료될 때 해제되는 것을 의미.

  일반적으로 Class는 Static영역에 생성되고, new 연산을 통해 생성한 객체는 Heap영역에 생성됨.

  Heap 영역의 메모리는 Garbagr Collector를 통해 수시로 관리됨.

 

* 장점

 static 키워드를 통해 Static 영역에 할당된 메모리는 모든 객체가 공유하는 메모리가 됨.

* 단점

 프로그램 종료시 가지 메모리가 할당된 채로 존재하여 시스템 퍼포먼스 악영향


6. 타입 변환, 캐스팅 그리고 타입 프로모션

 

묵시적 타입 변환(자동 타입 변환) - 타입 프로모션

  • 컴파일러가 자동으로 수행하는 타입 변환
  • 데이터 손실을 최소화하게 노력
  •  
  • 작은 데이터 타입에서 큰 데이터 타입으로의 변한을 의미

 

명시적 타입 변환(강제 타입 변환) - 타입 캐스팅

  • 사용자가 타입캐스트 연산자 ( )를 사용해 강제적으로 수행하는 타입 변환
  • 큰 데이터 타입에서 작은 데이터 타입으로의 변환은 명시적으로 되어야 함.

7. 1차 및 2차 배열 선언하기

 

// 1차 배열 선언
int[] arr;
int []arr;
int arr[];

// 1차 배열 초기화 
int[] arr;
arr = new int[5];

int[] arr = new int[5];
int[] arr = {1,2,3,4,5}  // 배열 크기 5

// 2차 배열 선언
int[][] arr;
int []arr[];
int arr[][];

// 2차 배열 초기화 
int[][] arr;
arr = new int[3][2];

int[][] arr = new int[4][3];
int[][] arr = {{0,1,2},{3,4}}  // 배열 크기 4
// 2차원 배열 생성시, 열의 길이를 명시 안하면, 행마다 길이 다르게 가변배열 생성 가능

참고 @ kils-log-of-develop.tistory.com/311


8. 타입 추론, var

: 타입이 정해지지 않은 변수에 대해서 컴파일러가 변수의 타입을 스스로 찾아낼 수 있도록 하는 것.

지역변수 내에서만 사용해야하고, 선언시 바로 초기화해야함.

 

ex. var a=1;     //'int'로 타입 추론