Java

[JAVA 기초] 자바 데이터 타입, 변수 그리고 배열

simba 2021. 6. 15. 01:20

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

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

3. 리터널

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

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

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

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

8. 타입 추론, var

 


 

 

1. 기본형 타입 (Primitive type)

- 총 8가지의 기본형 타입 (Primitive type)을 미리 정의하여 제공

- 기본 값이 있기 때문에 Null이 존재하지 않고, 기본형 타입에 Null을 넣고 싶으면 래퍼 클래스를 활용

- 실제 값을 저장하는 공간으로 Stack 메모리에 저장

출처 w3schools

- 기본값

   boolean - false

   long - 0L

   float - 0.0F

   double - 0.0

   char - '\u0000'

   나머지는 0 

 

2. 참조형 타입 (Reference type)

- 기본형 타입을 제외한 타입들이 모두 참조형 타입(Reference type)

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

- 값이 저장되어 있는 주소값을 저장하는 곳으로 힙(Heap)메모리에 저장

 

 

3. 리터럴

- 고정된 값을 나타내는 소스코드상에서의 표현, null도 리터럴이며 특수 리터럴로 분리

 

 

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

자바의 변수

- 인스턴스 변수 : 클래스 선언시 static 키워드 없이 선언된 필드. 인스턴스 별로 다른 값을 가질수 있기 때문에 인스턴스 변수라고 불린다

- 클래스 변수 : 클래스 선언시 static 키워드와 함꼐 선언된 필드. 모든 인스턴스들이 공유하는 값으로, 클래스 명으로 접근이 가능하고 클래스 하나에 한값이기떄문에 클래스 변수라고도 함

- 매개 변수 : 매개 변수는 메서드의 인자로 전달되는 변수

- 로컬 변수 : 메서드 선언 사이에 등장하는 변수로 다른 클래스에서 접근할 수 없는 변수. 메서드 영역에서만 입시로 사용되는 변수

 

순서대로 

public class VariableTypes{
    int instanceVariable;
    static int classVariable;
    public void method(int parameter){
    int localVariable;
    }
 }

 

 

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

변수의 스코프(영역) : 변수가 접근하거나 접근할 수 있는 유효 범위/영역

변수의 라이프타임 : 변수가 메모리에서 살아있는 기간

 

- Instance Variable

scope : 정적 메서드를 제외한 클래스 전체

lifetime : 객체가 메모리에 남아있을때까지

 

- Class Variable

scope : 클래스 전체

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

 

- Local Variable

scope : 선언된 블록 내에 있음

lifetime : 컨트롤이 선언 된 블록을 떠날때 까지

 

 

6. 타입 변환

타입 변환 (type conversion) : 하나의 타입을 다른 타입으로 바꾸는 것을 타입 변환(type conversion)이라고 한다. 

 

자바에서는 boolean 형을 제외한 나머지 기본 타입간의 타입 변환을 자유롭게 할 수 있다. 메모리에 할당 받은 바이트의 크기가 상대적으로 작은 타입에서 큰 타입으로의 타입 변환은 생략할 수 있다.

 

하지만 메모리에 할당받은 바이트의 크기가 큰 타입에서 작은 타입으로 타입 변환은 데이터의 손실이 발생하므로, 상대적으로 바이트의 크기가 작은 타입으로 타입 변환을 할 경우 자바 컴파일러는 오류를 발생시킨다.

 

타입 변환의 종류

 

1. Promotion(자동 타입 변환, 묵시적 형변환)

 대입 연산이나 산술 연산에서 컴파일러가 자동으로 수행해주는 타입 변환

자바에서는 데이터의 손실이 발생하지 않거나, 데이터의 손실이 최소화 되는 방향으로 묵시적 타입 변환을 진행한다.

① double num1 = 10;

② // int num2 = 3.14;

③ double num3 = 7.0f + 3.14;

System.out.println(num1);

System.out.println(num3);

//실행 결과
10.0
10.14

1. int형 데이터가 double형으로 자동 타입 변환 됩니다.

2. 데이터의 손실이 발생(int형 변수가 표현할 수 있는 범위보다 큰 double형을 대입하므로) , 컴파일러 오류 발생

3. float형 데이터와 double형, float형 데이터가 double로 자동 타입 변환

 

변수가 표현될 수 있는 점위를 벗어난 데이터는 타입 변환을 하지 못하고 오류를 발생기키므로 주의

 

byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)

 

 

2. Casting(강제 타입 변환, 명시적 형변환)

사용자가 타입 캐스트 연산자(())를 사용하여 강제적으로 수행하는 타입 변환

 

문법

(변환할타입) 변환할 데이터 

 

변환시키고자 하는 데이터의 앞에 (())괄호를 넣고 그안에 타입을 적으면된다.

자바에서는 이 괄호를 타입 캐스트(type cast)연산자라고 한다.

 

int num1 = 1, num2 = 4;

① double result1 = num1 / num2;

② double result2 = (double) num1 / num2;

System.out.println(result1);

System.out.println(result2);

//실행 결과
0.0
0.25

자바에서 산술 연산을 수행하고 얻는 결과값의 타입은 언제나 피연산자의 타입과 일치해야한다. 

 

 

7. 캐스팅 그리고 타입 프로모션

Casting(캐스팅) 이란?

: 타입을 변환 하는 것( = 형변환)

상속 관계에 있는 부모와 자식 클래스간에는 형변환이 가능하다.

 

- 업캐스팅 : 자식클래스가 부모 클래스의 타입으로 캐스팅 되는것(서브클래스가 슈퍼클래스의 모든 특성을 상속받는것)

즉, 자식 클래스가 부모 클래스가 되는것을 업 캐스팅이라고 함

class Person{
	String name;
	String id;

	public Person(String name){
		this.name = name;
	}
}

class Student extends Person{
	String grade;
	String department;

	public Student(String name){
		super(name);
	}
}

public class UpcastingEx{
	public static void main(String[] args){
		Person p;
		Student s = new Student("이재문");
		p = s; //업 캐스팅 발생

		System.out.println(p.name); //정상 컴파일
		Ststem.out.println(p.grade); //컴파일 오류
	}
}

 

- 다운 캐스팅 : 부모 클래스가 자식 클래스 타입으로 캐스팅 되는것 (서브 클래스가 슈퍼클래스로 변했을 때 , 서브 클래스의 인스턴스는 잠시 가려져 있을뿐 사라지지 않는다. 서브 클래스의 원래 특성으로 돌려놓는것이 다운 캐스팅인데 업 캐스팅과달리 명시적으로 타입을 지정해야한다

 

public class DowncastingEx{
	public static void main(String[] args){
		Person p = new Student("이재문"); //업 캐스팅 발생
		Student s;

		s = (Student)p; //다운 캐스팅

		System.out.println(s.name); //정상 작동
		s.grade = "A"; //컴파일 오류
	}
}

 

업 캐스팅을 한 경우 객체의 진짜 타입 구분이 어려운데, 이럴 경우 instanceof 연산자를 사용하면 된다.

 

 

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

// 1차 배열 선언하기, {0,0,0,0,0,0,0,0,0,0}
int[] array = new int[10];
int[] array2 = {1,2,3};
int[] array3 = new int[]{1,2,3};

// 1차 배열에 값 넣기
int[] array = new int[3];
array[0] = 1;
array[1] = 2;
array[3] = 3;

// 2차 배열 선언하기
int[][] array = new int[5][5];
int[][] array2 = {{1,2,3},{4,5,6}};

// 2차 배열에 값 넣기
int[][] array = new int[5][5];
array[0][0]=1;
array[0][1]=2;
...

배열의 크기는 length 속성으로 알 수 있다.

 

 

9. 타입 추론, var

java 10부터 지원하는 기능, var는 지역변수를 선언할 때 초기값을 통해 데이터 타입을 추론한다. 

예약된 타입 이름으로 키워드가 아니기 때문에 식별자로 사용가능

공식문서

 

JEP 286: Local-Variable Type Inference

JEP 286: Local-Variable Type Inference Summary Enhance the Java Language to extend type inference to declarations of local variables with initializers. Goals We seek to improve the developer experience by reducing the ceremony associated with writing Java

openjdk.java.net

 

- 지역변수에서만 사용가능

- , 와 함께 사용 불가능

- var 타입 변수는 null 값이 들어갈 수 없다.

- 초기화를 바로해야하고 초기화 없이는 사용할 수 었음 (타입 추론이 불가능함으로)

- 메소드의 인수타입은 지역 변수여도 var 사용 불가

- 배열을 선언할 때, var 대신 타입을 명시해줘야 한다