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


목표

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

학습할 것

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

프리미티브 타입 

primitive. 단어 그자체로는 원시적인, 초기의 라는 뜻으로 기본적으로 존재하는 자료형 입니다. 
크게 정수, 실수, 논리, 문자로 나뉘며 총 8가지 있습니다. 
기본형은 다음과 같은 특징을 가집니다. 
    ◆ 사용되기 전에 반드시 선언(declared)되어야 합니다.
     null 값을 가질 수 없습니다. (비객체 타입)
    ◆ 실제 값을 저장하는 공간으로 stack메모리에 저장됩니다.

정수
    int형은 가장 많이 사용되는 정수 자료형입니다.
    int 를 기준으로 작은 자료형에는 byte와 short, 큰 자료형에는 long이 있습니다. 
    long형을 사용할 경우 숫자 옆에 L을 써서 나타냅니다.
    이를 표로 나타내면 아래와 같습니다. 
    

실수 
    기본으로 double형과 범위가 더 적은 float형이 있습니다. 
    float형을 사용할 경우 숫자 옆에 f를 써서 나타냅니다.


문자
    char형 하나만 존재하며 단 한글자만 저장가능합니다.


논리   
    boolean형 하나만 존재하며 true와 false로 표현합니다. 

    *모든 표는 직접 만들었습니다.

프리미티브 타입과 레퍼런스 타입
    
reference 참조형 자료형입니다. 프리미티브 타입이 아닌 다른 자료형을 총칭하며 
크게 클래스, 인터페이스, 배열, 열거형 으로 나뉩니다. 
값을 변수에 대입하지만 변수는 실제 값을 가지고 있지 않고 해당 값이 담겨있는 주소값을 저장합니다. 

    ◆ 레퍼런스 변수를 다른 레퍼런수 변수에 대입하면 참조값만 복사됩니다.
    ◆ null값을 가질 수 있으며, 이건 아무것도 참조하지 않는다는 뜻입니다. 
    ◆ null은 공백과 의미가 다릅니다. (null != "")
    ◆ 값을 비교할 때 단순 이퀄(=)이 아닌 .equals 라는 메서드로 비교해야 합니다.
    ◆ 참조 타입 선언 시 변수는 stack 영역에 생성되고, 객체는 heap 영역에 생성됩니다.


리터럴  

literal 이란 변하지 않는 "값" 을 의미합니다. 
변하지 않는 자료를 상수라고 부르는데 이 때 상수는 변수를 초기화 하고 
이후 값을 바꿀 수 없는 "변수"를 의미합니다. 즉 상수는 더 큰 의미인 반면 
리터럴은 상수에 들어있는 값만을 나타냅니다. 

public static final int a = 7;

이렇게 선언한 문장이 있다면 a의 값을 상수 7을 리터럴이라고 부릅니다. 
1, 3, 5 -> 정수 리터럴 
3.14 , 10.1f -> 실수 리터럴 
hello, world -> 문자 리터럴
이렇게 볼 수 있습니다. 


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

변수의 선언이란 자료형과 이름을 써서 '앞으로 이 변수를 사용하겠다.' 하는 것입니다. 

자료형 변수명; 

이렇게 선언 됩니다. 
ex) int num;    float pi;    char alpha;
여기서 num, pi, alpha는 각각 변수명이 됩니다.

변수의 초기화란 선언 이후 사용하기 전에 값을 넣어주는 작업입니다. 
변수에는 인스턴스 변수, 클래스 변수, 지역 변수가 존재하는데 
이 중 인스턴스/클래스 변수는 선언만 해도 자동으로 defalut 값으로 초기화를 해주어 
바로 사용이 가능합니다. 반면 지역 변수는 초기화를 해줘야만 사용이 가능한 특징이 있습니다.

초기화를 하는 방법은 위 예시에 등장한 변수 선언 이후에 진행합니다. 
ex) num = 7;    pi = 3.14;    alpha = 'a'; 

선언과 동시에 초기화 해주는 방법도 있습니다. 이것을 '명시적 초기화'라고 합니다.
ex) int num = 7;    float pi = 3.14;    char alpha = 'a'; 


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

스코프 - 프로그램 내에서 해당 식별자가 이름의 효력을 나타낼 수 있는 범위입니다. 
변수의 스코프는 전역 변수와 지역 변수로 나뉩니다. 

ex) 

전역 변수는 프로그램 어떤 곳도 사용가능 합니다. 위에서 언급했던 인스턴스/클래스 변수중 
인스턴스 변수가 이에 해당합니다.
지역변수는 블록(메서드, 함수)내에서만 선언되고 사용되는 변수 입니다.
해당 지역을 벗어나면 사용이 불가능합니다. 

라이프 타임 - 변수의 수명 입니다. 
멤버 변수에 해당하는 인스턴스/클래스 변수는 프로그램 종료 시까지 유지되는 반면 지역 변수는 해당 함수를 벗어나면서 수명이 다해 회수됩니다. 

그림으로 나타내면 아래와 같습니다.
* 그림은 직접 만들었습니다.


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

기본 타입에서 boolean형을 제외하고 크기를 나열 하자면 

byte < short = char < int < long < float < double 

이렇게 됩니다. 이 때 64bits 인 long 보다 32bits인 float가 더 크기가 크다고 보는 이유는 
표현할 수 있는 숫자의 범위 때문에 그렇습니다.
그럼 short로 선언된 변수를 int를 사용하는 메서드에서 쓰려면 그에 맞는 타입 변환이 필요한데 이때 자동적으로 타입이 변환 되는 것을 바로 프로모션(묵시적 형변환)이라고 합니다.
반대로 더 작은 자료형으로 타입 변환이 필요할 때가 있는데 이 때는 강제로 변환이 필요합니다. 프로모션과는 달리 기존 변수 앞에 작은 자료형을 적어 줌으로써 사용하는 이 변환은 캐스팅(명시적 형변환) 이라고 하며 값이 바뀔 수도 있습니다. 

ex) 
    short a = 3;
    int b = a;    //프로모션 발생 

    long c = 5;
    int d = (int)c; //캐스팅  발생 

하지만 char 형은 16bit 더라도 0~65543 까지의 양수만을 저장하기 때문에 
byte나 short를 char형으로 자동타입 변환 시킬 수 없습니다. 

ex) char ch = 65;
    byte by = ch;      //error


1차 및 2차 배열 선언하기

자바에서 배열은 객체로 선언됩니다. 하지만 단순 선언 뿐만 아니라 크기까지 설정해주어야 그 이후 사용 가능하고 이때 설정한 크기는 고정됩니다. 이후 담긴 정보에 관해서는 수정이 가능하지만 크기는 바꿀 수 없습니다. 

1차원 배열의 선언은 여러 방법이 있습니다. 

int intArr[];
String[] stringArr; 

같은 방법으로 선언할 수 있으며 위 선언방법은 아직 크기가 정해져있지 않기 때문에 메모리공간을 할당해 주어야합니다. 

intArr = new int[8]; 
stringArr = new String[10]; 

이렇게 하면 각각 8과 10의 크기가 있는 배열이 생성되고 초기값은 int는 0 string은 ""로 정해 집니다. 

위 과정을 합쳐서 한번에 해주면 선언과 동시에 초기화가 가능해집니다. 

char charArr = new char[5]; 

또는 특정값을 대입하여 선언하는 방법도 있습니다. 

long longArr = { 10, 9, 8, 7, 6, 5, 4 };

위 경우의 longArr의 크기는 7로 고정됩니다. 

이 외에도 arrays.fill()을 통해 모든 값을 통일된 값으로 넣어주거나 
반복문 for문을 통해 값을 순차적으로 넣어 줄 수 있습니다. 

2차원 배열도 1차원 배열과 비슷합니다. 

int intArr[][];
String[][] stringArr; 

대괄호를 한개씩 더 써주는 것으로 2차원 배열임을 나타내고 
이후 사용을 위해서는 크기를 정해주어야 합니다. 

intArr = new int[4][3];

물론 선언과 동시에 크기를 정해줄 수 있습니다.

String stringArr[][] = new String[2][3]; 

이렇게 크기를 정해준다면 총 넣을 수 있는 크기는 intArr의 경우 12개 stringArr의 경우 6개가 될 것입니다. 내부를 살펴보자면 

stringArr = {{"", "", ""}, {"", "", ""}};

이렇게 공백인 인자를 3개 가지고 있는 배열이 2개 있는 모양입니다. 
 
또 2차원 배열에는 이런 모양도 가능 합니다. 

intArr2 = {{1, 2}, {3, 4, 5, 6}};
 
이런 것을 톱니형 배열이라고 하며 각각 요소를 살펴보면 
intArr2[0] = {1, 2}; 
intArr2[1] = {3, 4, 5, 6}; 이렇게 됩니다.
이렇게 내부 요소끼리 크기가 다르게 생성할 수 있다는것을 알 수 있습니다. 


타입 추론 , var

18년 3월 java 10 버전이 등장하면서 자바에는 var라는 새로운 변수가 생겼습니다. 
기존 다른 언어였던 자바스크립트에 있는 것과 비슷하지만 다른 var 라는 변수는 
local-variable type inference 기능을 위해 만들어 졌습니다. 

기존 자바9까지의 코딩에서는 변수는 이런식으로 선언되었습니다. 

    List<Map> data = new ArrayList<>();
    String a = "Hello world!";

하지만 두 선언 모두 개발자는 우측 부분을 통해서 각각 arraylist와 string이라는 것을 충분 히
알 수 있습니다. 해서 중복성을 제거하고 코드를 더 짧고 간결하게 만들기 위해서 var는 등장했습니다.

    var data = new ArrayList<>();
    var a = "Hello world!";

local-variable type inference를 이용해서 변수를 선언할 수 있는 경우는 아래와 같습니다.

1. 정적/인스턴스 초기화 블록
static {
var x = "Hi";
System.out.println(x);
}

2. 지역 변수

3. foreach 루프의 반복 변수 ( +for문의 변수)
for (var num : arr){
System.out.println(num+", ");
}

4. 메서드의 반환값 
int let(){
var s = 1;
return s;
}

하지만 아래에 상황에는 오류가 발생합니다. 

1.  클래스 필드
class A{
var a; //error
}

2. 초기화 되지 않은 지역변수, 'NULL'로 초기화 된 변수 (타입 유추 불가능)
public static void main(String a[]){
var a; //error
var b = NULL; //error
}

3. 메서드의 매개 변수 
void select(var a){ //error
}

4. 메서드의 반환 유형
public var select (){ //error 
return 0;
}





댓글

이 블로그의 인기 게시물

git-receive-pack not permitted on 깃 허브 로그인 관련 문제