본문 바로가기

개발 스토리/Java live study

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

목표

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


학습할 것

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

프리미티브 타입 종류와 값의 범위 그리고 기본 값

프리미티브 타입은 기본형이며 기본형에는 모두 8개의 타입이 있으며, 논리형, 문자형, 정수형, 실수형으로 구분된다.

 

분류 타입
논리형 boolean
true와  false 중 하나를 값으로 갖으며, 조건식과 논리식 계산에 사용된다.
문자형 char
문자를 저장하는데 사용되며, 변수에 하나의 문자만 저장할 수 있다.
정수형 byte, short, int, long
정수를 저장하는데 사용되며, 주로 int가 사용된다. byte는 이진 데이터를 다룰 때 사용되며, short은 C언어와의 호환을 위해서 추가되었다.
실수형 float, double
실수를 저장하는데 사용되며, 주로 double이 사용된다.

 

자료형 저장 가능한 값의 범위 bit byte
boolean false, true 8 1
char '\u0000' ~ '\uffff' (0~2^16 -1, 0~65535) 16 2
byte -128 ~ 127 8 1
short -32,768 ~ 32,767 16 2
int -2,147,483,648 ~ 2,147,483,647 32 4
long -9,223,372,063,854,775,808 ~ 9,223,372,036,854,775,807 64 8
float 14.E-45 ~ 3.4E38 32 4
double 4.9E-324 ~ 1.8E308 64 8

 

자료형 기본값
boolean false
char '\u0000'
byte 0
short 0
int 0
long 0L
float 0.0d
double 0.0d

레퍼런스 타입

java에서 참조 타입(reference type)이란 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입을 말한다. 기본 타입과 참조 타입의 차이는 저장되는 값이 무엇인가이다. 기본 타입으로 선언된 변수는 실제 값을 변수에 저장하지만 참조 타입은 메모리에 번지를 값으로 갖게 된다. 즉 번지를 통해 객체를 참조한다는 뜻으로 참조 타입이라 부른다.

출처 : https://kingpodo.tistory.com/54

또한 기본 데이터 타입과 참조 타입은 데이터가 생성되고 저장되는 위치가 다르다. 기본 데이터 타입은 스택 영역에 생성되고 참조 데이터 타입은 힙 영역에 생성된다.


리터럴

리터럴은 데이터 그 자체를 뜻 하며 변수에 넣는 변하지 않는 데이터를 의미한다.

 

// int 타입의 정수 리터럴
int num1 = 100;

// long 타입의 정수 리터럴
long num2 = 100L;

// float 타입의 부동 소수점 리터럴
float num3 = 3.14f	// 맨 끝에 f 또는 F를 붙인다.

// double 타입의 부동 소수점 리터럴
double num4 = 3.14;	// d 또는 D를 생략해도 된다.

// 논리 리터럴
boolean b = true;

// 문자 리터럴
char a = 'A';

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

변수란?

프로그래밍언어에서의 변수란, 값을 저장할 수 있는 메모리 상의 공간을 의미한다. 이 공간에 저장된 값은 변경될 수 있기 때문에 '변수'라는 이름을 쓴다.

하나의 변수에 단 하나의 값만 저장할 수 있으므로, 새로운 값을 저장하면 기존의 값은 사라진다.

변수의 선언

변수의 선언방법은 아래와 같다.

'변수 타입'을 입력하고 '변수의 이름'을 선언해 준다.

 

int age;	// age라는 이름의 변수 선언

'변수타입'은 변수에 저장될 값이 어떤 '타입(type)'인지를 지정하는 것이다.

'변수이름'은 변수에 붙인 이름이다.

변수를 선언하면, 메모리의 빈 공간에 '변수타입'에 알맞은 크기의 저장공간이 확보되고, 앞으로 이 저장공간은 '변수이름'을 통해 사용할 수 있게 된다.

변수의 초기화

변수를 선언한 이후부터는 변수를 사용할 수 있으나, 그 전에 반드시 변수를 '초기화'해야 한다. 

변수에 값을 저장할 때는 대입 연산자 '='를 이용한다. 대입연산자의 왼쪽에는 반드시 변수가 와야 한다.

 

int age = 25;	// 변수 age를 선언하고 25로 초기화 한다.

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

스코프란 영역이라는 뜻입니다. 자바에서 말하는 스코프란 변수에 대한 접근과 변수가 존재할 수 있는 영역을 의미합니다.

자바에서 중괄호 {}로 한 영역이 생성된다면 그 영역에 관한 스코프를 형성하게 됩니다.

스코프가 있기 때문에 각각 다른 메서드에서 같은 이름의 변수 선언이 가능합니다.

만약 변수의 스코프가 없다면 아래와 같은 소스코드는 불가능합니다.

 

class JavaScope {
	public static void main(String[] args) {
    	
        int num1 = 5;
        int num2 = 10;
        
        System.out.println(num1+num2);
    	
        add();
    }
	
    public static void add() {
    	int num1 = 10;
        int num2 = 20;
        System.out.println(num1+num2);
    }
}

// 출력
// 15
// 30

 

변수의 라이프타임

인스턴스 변수

클래스 내부에서 선언되었지만 메서드 및 블록 외부에서 선언된 변수를 인스턴스 변수라고 합니다.

클래스 변수

클래스 내부, 모든 블록 외부에서 선언되고 staic으로 선언 된 변수를 클래스 변수라고 합니다.

지역 변수

인스턴스 또는 클래스 변수가 아닌 모든 변수를 지역변수라고 합니다.

 

변수의 종류 선언위치 생성시기 라이프타임 범위(scope)
인스턴스 변수 클래스 영역 인스턴스가 생성되었을 때 객체가 메모리에서 활용될때까지 static method를 제외한 클래스 모든 영역
클래스 변수 클래스 영역 클래스가 메모리에 올라갈 때 프로그램이 끝날때까지 클래스 모든 영역
지역변수 클래스 영역 이외의 영역
(메서드, 생성자,초기화 블럭 내부)
변수 선언문이 수행되었을 때 블록을 벗어났을때까지 클래스 의외의 영역

 

class Variables {

	int iv;	// 인스턴스 변수
    static int cv;	// 클래스 변수
    
    void mehtod() {
    	int lv = 0;	// 지역변수
    }
}

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

배열(array)이란?

배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 '배열'이라고 한다. 많은 양의 데이터를 저장하기 위해서 그 데이터의 숫자만큼 변수를 선언해야 한다면 매우 혼란스러울 것이다. 이런 경우에 배열을 사용하면 많은 양의 데이터를 손쉽게 다룰 수 있다.

 

1차 배열의 선언

1차 배열을 선언하는 방법은 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호[]를 붙이면 된다.

 

선언방법 선언 예
타입[] 변수이름; int[] scroe;
String[] name;
타입 변수이름[]; int score[];
String name[];

 

1차 배열의 생성

배열을 선언한 다음에는 배열을 생성해야한다. 배열을 선언하는 것은 단지 생성된 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐이고, 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어지는 것이다. 배열을 생성하기 위해서는 연산자 'new'와 함께 배열의 타입과 길이를 지정해 주어야 한다.

 

생성방법 생성 예
타입[] 변수이름;
변수이름 = new 타입[길이];
int[] score;
score = new int[5];
타입[] 변수이름 = new 타입[길이]; int[] score = new int[5];

 

배열의 선언과 생성과정을 단계별로 살펴보면 아래와 같다.

 

1. int[] score;

int형 배열 참조변수 score를 선언한다. 데이터를 저장할 수 있는 공간은 아직 마련되지 않았다.

 

2. score = new int[5];

연산자 'new'에 의해서 메모리의 빈 공간에 5개의 int형 데이터를 저장할 수 있는 공간이 마련된다.

그리고 각 배열요소는 자동족으로 int의 기본값인 0으로 초기화 된다.

 

 

끝으로 대입 연산자'='에 의해 배열의 주소가 int형 배열 참조변수 score에 저장된다.

 

 

 

2차원 배열 선언

2차원 배열을 선언하는 방법은 1차원 배열과 같은데 괄호[]가 하나 더 들어간다.

 

선언 방법 선언 예
타입[][] 변수이름; int[][] score;
타입 변수이름[][]; int score[][];
타입[]변수이름[]; int[] score[];

 

2차원 배열 생성

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

 

위 문장이 수행되면 4행 3열의 데이터, 12개의 int값을 저장할 수 있는 공간이 마련된다.

 

score[0][0] score[0][1] score[0][2]
score[1][0] score[1][1] score[1][2]
score[2][0] score[2][1] score[2][2]
score[3][0]
score[3][1] score[3][2]

 

2차원 배열의 초기화

2차원 배열도 괄호{}를 사용해서 생성과 초기화를 동시에 할 수 있다. 다만, 1차원 배열보다 괄호{}를 한번 더 써서 행별로 구분해 준다.

 

int[][] arr = { {1, 2, 3}, {4, 5, 6} };

 


타입추론, var

타입추론은 개발자가 변수의 타입을 명시적으로 적지 않고 컴파일러가 알아서 변수의 타입을 대입된 리털럴로 추론하는 것이다.

 

@Test
public void test() {
	var message = "Hello, Java 10";
    assertTrue(message instanceof String);
}

 

 

- 참고 자료

kingpodo.tistory.com/54

Java의 정석

www.learningjournal.guru/article/programming-in-java/scope-and-lifetime-of-a-variable/

www.baeldung.com/java-10-local-variable-type-inference