본문 바로가기
Study/Java_study

Java_study_2 (자바 데이터 타입, 변수 그리고 배열)

by hjshims 2021. 7. 26.

♨학습내용

더보기

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

☞ 프리미티브 타입과 레퍼런스 타입

☞ 리터럴

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

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

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

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

☞ 타입 추론, var

 

  • 프리미티브 타입 종류와 값의 범위 그리고 기본 값
  • Primitive Type이란?

- 간단하게 말하면, 여러 형태의 타입미리 정의하여 제공하는데, 이것을 Primitive Type(기본타입)이라고 한다.

 

  • Primitive Type의 종류와 값의 범위

<Primitive Type의 종류>

 1. 논리형 (boolean)

- 참/거짓판별하는데 주로 사용하는 것이 논리형 변수이다.

- 어떤 조건을 주어서 그 조건이 참이면 true를 저장, 거짓이면 false를 저장한다.

- boolean Type의 기본값은 false다.

 

 2. 문자형 (char)

- char는 한 글자의 문자를 저장한다.

- char형은 ASCII 코드에 의거하여 숫자로 저장된다.

- char Type의 기본값은 '\u0000'이다.

 

 3. 정수형 (byte, short, int, long)

- int는 컴파일러는 기본적으로 정수 리터럴을 int 타입으로 간주한다.

- long 타입의 값에는 접미사 'L' 또는 'l'을 반드시 붙여야한다. 그렇지 않으면 int 타입으로 간주한다.

- 정수형의 기본값은 순서대로 (0, 0, 0, 0L)이다.

 

 4. 실수형 (float, double)

- float의 Type 기본값은 0.0f / double Type의 기본값은 0.0이다.

 


 

  • 프리미티브 타입과 레퍼런스 타입

- 자료형은 크게 Pritive Type과(기본형) Reference Type(참조형)으로 나뉜다.

- 기본형은 실제 값을 저장하는 반면, 참조형은 값이 저장되어 있는 주소으로 가진다.

- 자바는 C언어와는 달리 참조형 변수 간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수이다.

 

  • 프리미티브 타입

- 총 8가지 의 기본형 타입을 미리 정의하여 제공한다.

- 기본값이 있기 때문에 Null이 존재하지 않는다.

- 실제 값을 저장하는 공간으로 스택(Stack) 메모리에 저장된다.

- 만약 컴파일 시점에 담을 수 있는 크기를 벗어난다면 에러를 발생시키는 컴파일 에러가 발생한다.

 

  • 레퍼런스 타입

- 기본형 타입을 제외한 타입들이 모두 참조형 타입이다. (개발자 마음대로!)

- 빈 객체를 의미하는 Null이 존재한다.

- 값이 저장되어 있는 곳의 주소값을 젖아하는 공간으로 힙(heap) 메모리에 저장된다.

- 문법상으로는 에러가 없을수도 있지만 실행시켰을 때 런타임 에러가 발생한다.

 

 


 

  • 리터럴

- 우선, 상수를 먼저 알아보자. 상수란 변하지 않는 값이다.

- 상수는 숫자뿐만 아니라 문자, 클래스나 구조체 같이 기본형에 파생된 객체나 유도형 같은 데이터 등을 데이터로 넣을 수 있다.

- 참조변수를 상수로 지정할 때는 참조 변수의 메모리의 주소값이 변하지 않는다는 의미이지, 그 주소가 가르키는 데이터들까지 변하지 않는다는 것을 의미하는 것은 아니다.

 

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

 

final int a = 100;

 여기서 a는 상수, 100리터럴이다. 즉, 리터럴은 boolean, char, double, long, int등을 말한다.


 

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

- 변수를 선언한다는 것은, 저장 공간을 확보하겠다는 의미로 해석 가능하다.

 

int a;

 

  int 타입의 값을 저장할 수 있는 4byte의 공간을 확보하여 그 공간의 이름은 a이다. 라고 볼 수 있다.

 

-변수를 초기화한다는 것은, 저장공간에 값을 저장하겠다는 의미로 해석 가능하다.

 

int a;	//변수선언
a = 2;	//변수 초기화

int b = 5;	//변수 선언과 동시에 초기화

//위에 두개 다 같은 의미 (변수이름만 다름)

 

  변수를 선언하고 나면 해당 공간에는 아무 의미가 없는 가비지 값들이 들어가있다.

  그리고 그 상태에서 컴파일을 시도하면, 'java: variable a might not have been initialized'와 같은 컴파일 에러가 발생한다. 그러므로 변수 선언 후에는 초기화를 해야한다.

  참고) 자바의 에러 메세지는 약 20여개밖에 안 된다고 교수님께서 말씀해주셨다. 그래서 싹 다 외우는게 좋다고 말씀하시던데... ㅋㄷㅋㄷ


  • 변수의 스코프와 라이프타임
  • 변수의 스코프: 변수에 접근할 수 있는 유효 범위와 영역을 의미한다.
  • 변수의 라이프타임: 변수가 메모리에 살아있는 기간이다.

- Intance Variable (인스턴스 변수)

정의 : 클래스 내부와 모든 메소드 및 블록 외부에서 선언된 변수

라이프타임 : 객체가 메모리에 남아있을 때 까지.

예시) x와 y의 scope

 

public class Test {
//	여기서
	int x,y; //인스턴스 변수
	static int result;
	
	void add(int a, int b) { //a와 b는 로컬변수
		x = a;
		y = b;
		int sum = x + y;	//sum
		System.out.println("sum = " + sum);
	}
//	여기까지
	public static void main(String[] args) {
		Test obj = new Test();
		obj.add(10, 20);

	}

}

 

class Variables (클래스 변수)

정의 : 클래스 내부, 모든 블록 외부에서 선언되고 static으로 표시된 변수

scope : 클래스 전체

라이프타임 : 프로그램이 끝날 때 까지 또는, 클래스가 메모리에 로드 되는 동안.

예시) result(class variable)의 scope

 

public class Test {
//	여기서
	int x,y; //인스턴스 변수
	static int result;
	
	void add(int a, int b) { //a와 b는 로컬변수
		x = a;
		y = b;
		int sum = x + y;	//sum
		System.out.println("sum = " + sum);
	}
	
	public static void main(String[] args) {
		Test obj = new Test();
		obj.add(10, 20);

	}
//	여기까지
}

 

- Local Variable (지역변수)

정의 : 인스턴스 및 클래스 변수가 아닌 모든 변수

scope : 선언된 블록 내에 있음

라이프타임 : 컨트롤이 선언된 블록을 떠날 때 까지.

예시) a, b (local variable)의 scope

 

public class Test {
	int x,y; //인스턴스 변수
	static int result;
//	여기서
	void add(int a, int b) { //a와 b는 로컬변수
		x = a;
		y = b;
		int sum = x + y;	//sum
		System.out.println("sum = " + sum);
	}
//	여기까지	
	public static void main(String[] args) {
		Test obj = new Test();
		obj.add(10, 20);

	}

}

 

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

- 자바의 연산은 동일한 타입에서만 가능하다.

- 하지만 개발을 하다보면 다른 타입간의 연산이 필요한 경우가 생긴다. 이러한 경우에 타입 변환을 해줄 수 있다.

- 타입변환에는 2가지 방법이 있다.

 

  1. 캐스팅 (강제 변환)

- 큰 메모리 데이터 타입을 → 작은 메모리 타입으로 변환

- (이때는 데이터의 손실이나 변형이 생길 수 있다.)

- 아래의 코드는 바이트의 범위 내에서 형변환을 시도한 것이다. (바이트의 범위 -128 ~ 127)

 

public static void main(String[]args){
    int a = 5;
    byte b = (byte)a;
    System.out.println(b);  // 5   
}

- 아래의 코드는 바이트의 범위 외에서 형변환을 시도한 것이다.

 

public static void main(String[]args){
    int a = 128;
    byte b = (byte)a;
    System.out.println(b);  // -128       
}

 

  바이트의 범위는 127까지인데 128을 변환하려고 하니 오버플로우가 발생했다.

  오버플로우는 범위를 넘어갔을 때 발생한다. 범위를 잘 고려해서 캐스팅 (강제 변환)을 해줘야한다.

 

  2. 타입 프로모션 (자동 형변환)

- 작은 메모리 크기의 데이터 타입을 → 큰 메모리 타입으로 변환

- (이때는 데이터의 손실이나 변형이 생기지 않음으로 자동으로 형변환이 된다.

 

public static void main(String[]args){
    byte a = 5;
    int b = a;
    System.out.println(b); // 5
}

 


 

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

- 배열 : 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것.

- 배열을 선언하기 위해선 [] 기호를 사용한다.

- 공간의 크기가 정해져있기 때문에 new 연산자로 배열의 크기를 지정해줘야한다.

 

  • 1차원 배열
public static void main(String[]args){
    // 배열 선언 
    int[] arr1;
    int arr2[];
    
    // 크기가 10인 배열을 생성
    arr1 = new int[10];
    
    // 크기가 5인 배열을 선언과 동시에 생성
    int[] arr3 = new int[5];

    // 크기가 5인 배열을 선언과 생성, 초기화를 동시에 함
    int[] arr4 = new int[5] {1, 2, 3, 4, 5};
    
    // arr4의 경우 아래와 같이 new int 생략 가능
    int[] arr5 = {1, 2, 3, 4, 5};
}

 

  • 2차원 배열
public static void main(String[]args){
    // 5행 4열의 2차원 배열 생성
    int[][] arr = new int[5][4];
    
    // 생성과 동시에 초기화
    int[][] arr2 = new int[][]{ {1, 2, 3}, {4, 5, 6} };
    
    // arr2의 경우 아래와 같이 new int는 생략 가능
    int[][] arr3 = { {1, 2, 3}, {4, 5, 6} };
    
}

 

 


 

  • 타입 추론, var

- 데이터 타입을 소스코드에 명시하지 않아도, 컴파일 단계에서 컴파일러가 타입을 유추해 정해주는 것을 뜻한다.

- 지역변수로만 사용 가능하고, 선언과 동시에 초기화 해야한다. (초기화 값이 있는 지역변수로만 선언 가능)

- 1.5버전부터 추가된 Generic이나 자바 8버전에서 추가된 lamda에서 타입추론이 사용된다.

- 자바 10에서는 이러한 타입추론을 사용하는 var이라는 Local Variable Type-Inference가 추가되었다.

 

var x; // (X) 
var x = null; // (X) 
private var x = "hello"; // (X) 
var x = "hello"; // (O)

 

'Study > Java_study' 카테고리의 다른 글

Java_study_6 (상속)  (0) 2021.08.09
Java_study_5 (클래스)  (0) 2021.08.04
Java_study_4 (제어문)  (0) 2021.08.01
Java_study_3 (연산자)  (0) 2021.07.26
Java_study_1 (JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가)  (0) 2021.07.18