IT/Java

[JAVA 스터디][2주차_2] 변수 선언 및 초기화, 배열, 타입변환, 캐스팅, 타입추론 정리

jaewon_sss 2020. 11. 21. 17:19
반응형

2주차(1) 에 이어서...



2주차(2) - 목차


1. 변수 선언 및 초기화


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


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


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


5. 타입 추론, var






1. 변수 선언 및 초기화


변수란? 값을 저장할 수 있는 메모리 공간에 붙여진 이름이다. 변수라는 것을 선언하면 메모리 공간이 할당되고 할당된 메모리 공간에 이름이 붙는다.

변수의 종류

    인스턴스 변수: 인스턴스가 생성될때 생성된다. 인스턴스 변수의 값을 읽거나 저장하려면 인스턴스를 먼저 생성해야하고 인스턴스별로 다른값을 가질수있다. 각각의 인스턴스마다 고유의 값을 가져가야할때는 인스턴스 변수로 선언을 한다.

    클래스 변수: 인스턴스 변수에 static만 붙여주면 된다. 인스턴스 변수는 각각 고유한 값을 가지지만 클래스 변수는 모든 인스턴스가 공통된 값을 공유하게 된다. 한 클래스의 모든 인스턴스들이 공통으로 가져야할 때 클래스 변수로 선언한다. 클래스가 로딩될때 생성 (메모리에 딱 한번만 올라간다.)되고 종료 될 때 까지 유지되는 클래스 변수는 public을 붙이면 같은 프로그램 내에서 어디서든 접근할 수 있는 전역 변수가 된다.  또한 인스턴스가 변수의 접근법과 다르게 인스턴스를 생성하지 않고 클래스이름.클래스변수명 을 통해서 접근가능하다.

    지역변수: 메서드 내에서 선언되고 메서드 내에서만 사용 가능하다. 메서드가 실행될때 메모리를 할당 받고 메서드가 끝나면 소멸되므로 사용이 불가능하다.

변수선언

int num; // 변수형식 변수이름
int num = 20; // 변수형식 변수이름 = 초기화값
int num1, num2, num3, num4; // 변수형식 변수이름1, 변수이름2, 변수이름3, 변수이름4
int num1 = 10, num2 = 20, num3 = 30, num4 = 40; // 변수형식 변수이름1 = 초기화값, 변수이름2 = 초기화값, 변수이름3 = 초기화값, 변수이름4 = 초기화값;


변수의 초기화

변수를 선언하고 값을 저장하는 것을 변수 초기화라고 합니다.

변수의 초기화는 선언과 동시에 적절값으로 초기화하는게 좋습니다.

멤버 변수는 초기화 하지 않아도 변수의 타입에 맞는 기본값으로 초기화가 이루어지지만, 지역변수는 사용하기 전에 반드시 초기화가 이루어져야합니다.


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


변수 스코프, 라이프타임 : 변수를 사용할수있는 유효범위를 의미합니다.


변수의 스코프는 일반적으로{}사이에서 동작합니다. 즉, {}범위를 넘어서는 순간 그 변수는 사용이 불가합니다.

그 범위를 벗어난 위치에서의 접근은 컴파일 에러를 일으킵니다.


class Main {
  int a;
  int b;
  int c;
}


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


타입변환(캐스팅)은 타입을 변환시켜주는 것을 의미합니다.

int a = 10;
long b = a;

 하지만 값의 손실의 위험이 있습니다.

따라서, 아래와 같이 캐스팅을 사용합니다.

캐스팅은  큰 데이터 타입에서 작은 데이터 타입으로 형 변환하는것을 의미합니다.

int a = (int)b;



Primitive 타입들은 타입캐스팅이 모두 가능하게 되어있습니다. 

문제가 생길경우는 큰 데이터형을 작은 데이터형으로 변환하게되면 테이터 손실이 있지만 캐스팅이 실패하지는 않습니다.



또 다른 예로 프로모션이 있습니다.

프로모션이란 크기가 더 작은 자료형을 더 큰 자료형에 대입할 때, 자동으로 작은 자료형이 큰 자료형으로 변환되는 현상입니다. 

문제없이 자동 변환됩니다. (e.g. int -> float) 크기가 더 큰 자료형에 더 작은 자료형을 자연스럽게 넣을 수 있는것이라고 생각하면 된다.

 int a = 10;

long b = a;


 

클래스에서도 타입 변환(캐스팅)이 존재한다. 

하지만, 기본적으로 클래스 타입들은 타입 캐스팅이 불가능하지만, 다형성이라는 성질을 통해서 두 클래스가 상속 관계일 경우에 타입 변환이 가능합니다.

    부모클래스는 명시적인 타입캐스팅 없이 자식과 연결 할 수 있다. 이를 업캐스팅(Up-casting)이라 한다. 

    자식클래스는 명시적인 타입캐스팅이 있다면 부모와 연결 할 수 있다. 이를 다운캐스팅(Donw-Casting)이라 한다.

    상속관계가 아니면 타입캐스팅은 불가능하다. 


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


변수는 하나의 데이터를 저장하지만, 배열은 여러개의 데이터들을 인덱스구조에 저장을 합니다

배열의 길이는 한번 생성하면 줄이거나 늘릴수없고 같은 타입들만이 배열의 원소로 사용됩니다.


 int[] a = new int[5]; // 1차 배열 선언

 int[][] a = new int[2][3]; // 2차 배열 선언

아래 구체적으로 예시가 있습니다.

1차원 배열

// 1. 배열 선언, 생성, 할당을 동시에 (2가지 방법)
// <자료형>[] 배열이름 = {원소들} 
// <자료형> 배열이름[] = {원소들}

int[] score = {10, 11, 12}; // or
int score[] = {10, 11, 12};


// 2. 배열 선언후에 생성과 할당을 하는방법

int score[];
string name[]; // 배열 선언

score = new int[] {10, 50, 100};
name = new string[] {"white", "ship}; // 생성과 할당

// 3. 배열 선언 후 -> 생성 후 -> 할당
int score[]; // 선언
score = new int[3]; // 생성
score[0] = 10;
score[1] = 50;
score[2] = 100; // 할당

 

 

2차원 배열

배열의 배열입니다.

int[][] array1 = new int[2][3]; // 정수를 3개씩 저장할수있는 배열이 2개가 생성된다.
int[][] array2 = new int[4][]; // array2는 4개짜리 배열을 참조한다. 그리고 4개짜리의 배열 각각은 아직 참조하는 배열이 없다.

array2[0] = new int[1]; // 정수 하나를 저장할 수 있는 배열을 생성 array2의 0 번째 요소가된다.
array2[1] = new int[2]; // 정수 두개를 저장할 수 있는 배열을 생성 array2의 1 번째 요소가된다.
array2[2] = new int[3]; // 정수 세개를 저장할 수 있는 배열을 생성 array2의 2 번째 요소가된다.

int[][] array2 = {{0}, {1, 2}, {3, 4, 5}}; // 선언과 동시에 초기화

 


5. 타입 추론, var

 

타입추론이란 자바 컴파일러가 자체적으로 어떤 타입인지 예측하고, 그것을 사용하는 것을 말합니다.

타입 추론은 대표적으로 제네릭에서 사용됩니다. 

기존에는 int a = 5; 라고 작성했습니다.



var 는 자바 10부터 타입추론을 가능할수있는 키워드로 추가되었습니다.

 이 키워드는 지역변수이면서 선언과 동시에 초기화가 반드시 되어야합니다

msg는 컴파일되는 과정에서 컴파일러가 String으로 추론이 가능합니다.

var a = 5;



 이것의 최고의 장점은 프로그래머가 타입이 어떤것인지 신경을 쓸 필요가 없습니다. 

하지만 동적 타입 언어의 문제점 중하나가 예상치 못한 에러에 대처하지 못한다는 점입니다. 

왜냐하면 런타임시 타입이 결정되기 때문입니다.

반응형