자바의 데이터타입,변수 그리고 배열을 알아보자!

학습 목표 : 자바의 variable(변수), primitive type 그리고 배열을 이해해보자.


변수 선언 및 초기화 방법

변수란 ?

값을 저장할 수 있는 메모리상의 공간이다.

선언 및 초기화 방법

  • 선언 : 변수타입에 맞는 크기의 저장공간을 확보하는 것
  • 초기화 : 변수를 사용하기 전에 확보된 저장공간에 값을 처음으로 저장하는 것

      //변수명이 a이고 int타입인 변수를 선언
      int a; 
      //초기화
      a = 20;
    
      //동시에 선언과 초기화를 할 수 있다.
      //변수 b를 선언하고 정수 10이라는 숫자를 담아 초기화
      int b = 10;
    
  • 타입이 같은 경우 콤마’,’를 구분자로 여러 변수를 한 줄에 선언할 수도 있다.

      int a, b;
      int c = 0, d = 1;
    
  • 두 변수의 값 교환하기 x, y

    단순히 x에 y값을, y에 x값을 저장하면 될 것 같지만 아니다.

      int x = 10;
      int y = 20;
    
      int x = y;
      //int x = 20;
      int y = x;
      //int y = 20;
    
    • 위와 같은 방법으로는 원하는 값을 얻을 수 없다. 그렇다면 어떻게 해야할까?

    문제점 : x의 값을 y에 바로 저장하면 원래 x의 값(10)이 덮어씌여져서 x의 원래 값을 알 수가 없다.

    해결책 : x의 값을 저장할 또 다른 변수 하나를 만들어준다.

      int x = 10;
      int y = 20;
      int tmp = 0;
    
      //원래의 x값을 z변수에 저장
      int tmp = x;
      //y값을 x에 저장
      int x = y;
      //z의 값(x의 원래 값이 담긴)을 y에 저장
      int y = tmp;
    

변수의 타입

%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%E1%84%8B%E1%85%B4%20%E1%84%83%E1%85%A6%E1%84%8B%E1%85%B5%E1%84%90%E1%85%A5%E1%84%90%E1%85%A1%E1%84%8B%E1%85%B5%E1%86%B8,%E1%84%87%E1%85%A7%E1%86%AB%E1%84%89%E1%85%AE%20%E1%84%80%E1%85%B3%E1%84%85%E1%85%B5%E1%84%80%E1%85%A9%20%E1%84%87%E1%85%A2%E1%84%8B%E1%85%A7%E1%86%AF%E1%84%8B%E1%85%B3%E1%86%AF%20%E1%84%8B%E1%85%A1%E1%86%AF%E1%84%8B%E1%85%A1%E1%84%87%E1%85%A9%E1%84%8C%E1%85%A1%20a84d04b70b074ee294732d8d6bef1a0f/Untitled.png

1. 기본형 (Primitive type) - 총 8개

계산을 위한 실제 값을 저장한다.

종류

  • 논리형 : boolean
  • 문자형 : char
  • 정수형 : int, short, long, byte
  • 실수형 : float, double

크기(값의 범위) 및 기본값

%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%E1%84%8B%E1%85%B4%20%E1%84%83%E1%85%A6%E1%84%8B%E1%85%B5%E1%84%90%E1%85%A5%E1%84%90%E1%85%A1%E1%84%8B%E1%85%B5%E1%86%B8,%E1%84%87%E1%85%A7%E1%86%AB%E1%84%89%E1%85%AE%20%E1%84%80%E1%85%B3%E1%84%85%E1%85%B5%E1%84%80%E1%85%A9%20%E1%84%87%E1%85%A2%E1%84%8B%E1%85%A7%E1%86%AF%E1%84%8B%E1%85%B3%E1%86%AF%20%E1%84%8B%E1%85%A1%E1%86%AF%E1%84%8B%E1%85%A1%E1%84%87%E1%85%A9%E1%84%8C%E1%85%A1%20a84d04b70b074ee294732d8d6bef1a0f/primitive_table.jpg

  • int타입의 변수는 대략 10자리 수의 값을 저장할 수 있다. 그러므로 7~9자리의 수를 계산할 때는 넉넉하게 long타입(약19자리)으로 변수를 선언하는게 좋다.
  • 정수형과 달리 실수형은 타입 선택시 저장 가능한 값의 범위뿐만 아니라 정밀도도 중요한 기준이된다. 그러므로 높은 정밀도가 필요한 경우는 float대신 double을 선택해야한다.

2. 참조형 (Reference type) - 기본형을 제외한 나머지 타입

null 또는 객체의 주소를 저장한다.

[참고] null : 어떤 객체의 주소도 저장되어 있지 않음을 뜻한다.

  • classes
  • objects
  • Arrays
  • Strings
  • Interfaces

참조변수의 초기화 → 연산자 new를 사용

Person p = new Person();
//Person이라는 객체를 생성해서, 그 주소를 p에 저장함 

리터럴이란?

literal

상수 자체의 값을 의미한다.

constant(상수)

값을 한번만 저장할 수 있는 공간이다.

  • 한 번 값을 저장하면 변경할 수 없다.
  • 변수 타입 앞에 final을 붙여주고 변수명은 대문자로 쓴다.
  • 반드시 선언과 동시에 초기화해야한다.
final int MAX_SPEED = 10;
// 10 -> 리터럴
// MAX_SPEED -> 상수

변수의 scope와 life time

변수의 scope(범위)

그 변수에 접근할 수 있는 범위이다.

자바언어는 블록 스코프를 사용한다.즉, 변수가 선언된 블록 내에서만 접근할 수 있다는 것이다.

(블록은 중괄호 { }를 뜻한다.)

변수를 사용할 때, 먼저 자신과 가까운 블록 스코프에서 찾고 없을 경우 상위 블록 스코프에 존재하는지 찾아본다.

변수의 life time

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

  • 참조형 변수

    참조형 변수의 life time은 GC(Garbage Collector)와 관련이 있다. 힙 영역에 메모리가 부족할 때 GC가 스캔하고 참조되지않은 객체를 메모리에서 제거한다.

    참조형 변수가 더이상 참조되지 않는다면 GC가 제거할 대상이되고 minor GC 또는 major GC가 발생할 때 소멸한다.

  • 런타임 스택 영역에 생성된 변수

    블록 스코프에 의존적이다. 즉, 블록 내에서 선언된 변수는 블록이 종료될 때 런타임 스택 영역에서 함께 소멸한다.


타입 변환

변수 또는 상수의 타입을 다른 타입으로 변환하는 것이다.

형변환하는 이유는 서로 다른 타입끼리 연산하기 위해서 타입을 일치시켜야하기 때문이다.

  • 형변환 방법
    • Type Promotion (자동 형변환)

    값의 범위가 작은 타입에서 큰 타입으로 형변환 하는경우 → 컴파일러가 자동으로 형변환 해준다.

    • Casting (명시적 형변환)

    값의 범위가 큰 타입에서 작은 타입으로 형변환 하는경우 → 강제(명시적)로 형변환 해줘야한다.

    형변환하고자 하는 것 앞에 괄호와 함께 변환할 타입을 붙여준다.

      double d = 35.3;
      int score = (int)d;
    
      //d = 35.3
      //score = 35
    

    [참고] d의 값을 읽어서 int로 변환한 값을 score에 저장했을 뿐, d의 값을 형변환 시킨 것이 아니다. 그러므로 변수 d의 값은 형변환 후에도 아무런 변화가 없다.

  • boolean을 제외한 primitive type의 7개타입은 서로 형변환이 가능하다.
  • 기본형과 참조형은 서로 형변환 할 수 없다.

1차, 2차 배열 선언하기

배열이란?

같은 타입의 여러 변수를 하나의 묶음으로 다루는 참조 타입 자료형이다.

배열의 선언과 생성

//배열을 선언 
int[] score;
int score[];
//배열 선언 & 생성
int[] score= new score[5];

%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%E1%84%8B%E1%85%B4%20%E1%84%83%E1%85%A6%E1%84%8B%E1%85%B5%E1%84%90%E1%85%A5%E1%84%90%E1%85%A1%E1%84%8B%E1%85%B5%E1%86%B8,%E1%84%87%E1%85%A7%E1%86%AB%E1%84%89%E1%85%AE%20%E1%84%80%E1%85%B3%E1%84%85%E1%85%B5%E1%84%80%E1%85%A9%20%E1%84%87%E1%85%A2%E1%84%8B%E1%85%A7%E1%86%AF%E1%84%8B%E1%85%B3%E1%86%AF%20%E1%84%8B%E1%85%A1%E1%86%AF%E1%84%8B%E1%85%A1%E1%84%87%E1%85%A9%E1%84%8C%E1%85%A1%20a84d04b70b074ee294732d8d6bef1a0f/Untitled%201.png

배열의 생성과 초기화

//배열 생성과 초기화를 동시에

int[] score = new int[]{100,90,80,70,60};
int[] score = {100,90,80,70,60};

%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%E1%84%8B%E1%85%B4%20%E1%84%83%E1%85%A6%E1%84%8B%E1%85%B5%E1%84%90%E1%85%A5%E1%84%90%E1%85%A1%E1%84%8B%E1%85%B5%E1%86%B8,%E1%84%87%E1%85%A7%E1%86%AB%E1%84%89%E1%85%AE%20%E1%84%80%E1%85%B3%E1%84%85%E1%85%B5%E1%84%80%E1%85%A9%20%E1%84%87%E1%85%A2%E1%84%8B%E1%85%A7%E1%86%AF%E1%84%8B%E1%85%B3%E1%86%AF%20%E1%84%8B%E1%85%A1%E1%86%AF%E1%84%8B%E1%85%A1%E1%84%87%E1%85%A9%E1%84%8C%E1%85%A1%20a84d04b70b074ee294732d8d6bef1a0f/Untitled%202.png

[주의!] 배열의 선언과 생성을 따로 하는 경우에는 ‘new 타입[]’을 생략할 수 없다.

int[] score;
score = {100,90,80,70,60}; //에러발생. new int[]를생략할 수 없다.

2차원 배열의 선언

2차원 배열의 경우 행렬 형태로 자주 표현하고 주로 테이블 형태의 데이터를 담는데 사용된다.

int[][] score;
int score[][];
int[] score[];

2차원 배열의 생성

int score[][] = new int[5][3];

2차원 배열의 초기화

int[][] score = new int[][]{
	{100,100,100}
		, { 20, 20, 20 }
		, { 30, 30, 30 }
		, { 40, 40, 40 }
		, { 50, 50, 50 }
};

%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%E1%84%8B%E1%85%B4%20%E1%84%83%E1%85%A6%E1%84%8B%E1%85%B5%E1%84%90%E1%85%A5%E1%84%90%E1%85%A1%E1%84%8B%E1%85%B5%E1%86%B8,%E1%84%87%E1%85%A7%E1%86%AB%E1%84%89%E1%85%AE%20%E1%84%80%E1%85%B3%E1%84%85%E1%85%B5%E1%84%80%E1%85%A9%20%E1%84%87%E1%85%A2%E1%84%8B%E1%85%A7%E1%86%AF%E1%84%8B%E1%85%B3%E1%86%AF%20%E1%84%8B%E1%85%A1%E1%86%AF%E1%84%8B%E1%85%A1%E1%84%87%E1%85%A9%E1%84%8C%E1%85%A1%20a84d04b70b074ee294732d8d6bef1a0f/Untitled%203.png

%E1%84%8C%E1%85%A1%E1%84%87%E1%85%A1%E1%84%8B%E1%85%B4%20%E1%84%83%E1%85%A6%E1%84%8B%E1%85%B5%E1%84%90%E1%85%A5%E1%84%90%E1%85%A1%E1%84%8B%E1%85%B5%E1%86%B8,%E1%84%87%E1%85%A7%E1%86%AB%E1%84%89%E1%85%AE%20%E1%84%80%E1%85%B3%E1%84%85%E1%85%B5%E1%84%80%E1%85%A9%20%E1%84%87%E1%85%A2%E1%84%8B%E1%85%A7%E1%86%AF%E1%84%8B%E1%85%B3%E1%86%AF%20%E1%84%8B%E1%85%A1%E1%86%AF%E1%84%8B%E1%85%A1%E1%84%87%E1%85%A9%E1%84%8C%E1%85%A1%20a84d04b70b074ee294732d8d6bef1a0f/Untitled%204.png


var (타입 추론)

컴파일러가 타입이 정해지지 않은 값을 보고 그 타입을 유추하는 것이다.

대표적으로는 제네릭에서 타입 추론을 볼 수 있다.

ArrayList<Person> list = new ArrayList<Person>();

//이처럼 추정이 가능한 경우 타입을 생략할 수 있다. 
ArrayList<Person> list = new ArrayList<>();

ArrayList변수에 담길 데이터 타입이 ArrayList<Person>라는 것을 list변수의 데이터 타입을 바탕으로 추론해 낼 수 있다 .

또는 Javascript에서 모든 변수를 var, let, const 등을 사용해서 선언하는 것도 타입 추론의 예시이다.


[참고]

사이트

https://league-cat.tistory.com/411

https://blog.naver.com/hsm622/222144931396

https://cremazer.github.io/java-Array/

교제

자바의 정석

Categories:

Updated:

Leave a comment