JAVA STUDY(with whiteship) 2주차

hwk·2020년 11월 21일
0

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

목표

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

목차

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

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

프리미티브 타입. 직역하면 기본형 타입이다.
기본값이 있기 때문에 Null 값이 존재하지 않고 각각 기본 값이 있다.
값의 범위와 기본 값은 아래와 같다.

(출처 : https://gbsb.tistory.com/6)

데이터 표현 범위는 할당되는 메모리 크기와 연관지어 생각할 수 있다.

우선 정수형일 경우,
1bit는 2진수 한 자리를 표현할 수 있는 크기이다.
1byte는 8bit이고 2진수 여덟 자리를 표현할 수 있다.
즉 2의 8제곱으로 계산하여 256가짓수를 표현할 수 있다.
8비트 중 맨 앞자리 비트는 0이면 양수, 1이면 음수로 나타내어 부호를 표현하고 나머지 7자리를 숫자로 표현한다.
즉 1바이트 기준일 때의 데이터 표현 범위는 '-128 ~ 127'이 되는 것이다.

실수형일 경우,
float타입(4byte)과 double타입(8byte)을 부동소수점 방식으로 표현하고 있다.
부동소수점이란 지수를 10의 제곱으로 하여 소수점을 표현하는 방식이다.

float타입은 맨 앞자리 비트는 정수형과 마찬가지로 양수, 음수를 나타내는 부호(1비트)를 표현하고
지수(10의 제곱수) 8비트, 가수(숫자) 23비트로 표현한다.

double타입은 부호는 마찬가지로 당연히 1비트.
지수 11비트, 가수 52비트로 표현한다.

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


(출처 : https://m.blog.naver.com/PostView.nhn?blogId=highkrs&logNo=220242895539&proxyReferer=https:%2F%2Fwww.google.com%2F)

(1) Primitive Type

  • Primitive Type의 종류는 byte, short, char, int, float, double, boolean이 있다.
  • Primitive Type의 크기가 작고 고정적이기 때문에 메모리의 Stack에 저장이 된다.
  • 기본 값이 있고 null 값이 없음.
  • 변수가 사용된 메서드가 종료되거나 사용된 객체가 사라질 때 자동으로 파괴된다.

(2) Reference Type

  • Reference type의 종류는 class, array, interface, Enumeration 이 있다.
  • new 키워드를 이용하여 객체를 생성하여 데이터가 생성된 주소를 참조하는 타입이다.
    String과 배열은 참조 타입과 달리 new 없이 생성이 가능하지만 Primitive Type이 아닌 Reference Type이다.
  • primitive type과 달리 변수에 값을 저장하는 것이 아니라 값이 저장된 메모리 주소(Heap 영역)를 가리킨다.
  • 기본 값이 없고 null 값이 있음
  • 더 이상 참조하는 변수가 없을 때 가비지 컬렉션에 의해 파괴된다.

3. 리터럴

long count = 10000L;

float f1 = 2.3F;

double d1 = 5.6D;

char c1 = 'A'

literal은 위의 10000L, 2.3F, 5.6D, 'A' 와 같이 변수에 할당시키는 data를 리터럴이라고 표현한다.

이 리터럴을 최소한으로 사용하기 위해 상수로 선언하고 상수 변수를 사용해서 프로그램을 작성한다면 코드를 고치는데 비용을 최소화 할 수 있고 코드가 깔끔해진다.

리터럴의 타입은 값 뒤에 l, f, d를 붙임으로 정의할 수 있다.

long age = 50L 이런식으로 50을 long 타입 리터널로 나타낼 수 있다. float는 f double은 d를 리터럴 뒤에 붙일 수 있다.
리터럴 뒤에 아무런 접미사가 붙지 않을 경우 정수형은 int 타입, 실수형은 double 타입이다.

그래서 float 타입의 변수에 기본 리터럴 3.14를 넣게 된다면 더 큰 정밀도를 가진 리터럴이 낮은 타입에 들어가게 되어 에러가 난다. 그러므로 float 타입에 실수 리터럴을 넣을 땐 f접미사를 붙여야 한다.

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

int num;
char c;
float f1 = 3.14f;
double f2 = 3.14;
String str = "hi"

5개의 변수를 선언한 것이다.
[자료형 변수이름;] 으로 선언할 수 있고
[자료형 변수이름 = 변수값;] 으로 선언과 동시에 초기화를 할 수 있다.

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

변수를 어느 위치에서 명시하여 사용할 수 있고 어느 위치까지 변수가 메모리에 남아있는 지가 중요하다. 이것을 변수의 스코프와 라이프타임으로 알 수 있다.

클래스의 안에 선언 되었는지, static 키워드가 포함되었는지, block의 내부에 있는지 여부에 따라

크게 세가지로 나눌 수 있다.

  • Instance Variables
  1. 클래스 안에서 선언
  2. 다른 메소드나 block에서 선언되어 있지 않음
    Scope : 스태틱 메소드를 제외한 클래스 전체
    Lifetime : 객체가 메모리 안에 남아있는 동안
  • Class Variables
  1. 위 Instance Variables 조건에 추가로 static 키워드가 포함되어 선언된 변수
    Scope :클래스 전체
    Lifetime : 프로그램이 끝날 때 까지 or 클래스가 메모리에 남아있는 동안
  • Local Variables
    Instance Variables, Class Variables가 변수
    Scope : 변수가 속한 블럭 내부
    Lifetime : 변수가 선언된 블럭을 벗어나고 더 이상 그 변수를 조작할 수 없는 시점

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

  • 타입 변환
    데이터가 서로 다른 타입으로 사용되었을때 그 데이터의 표현 방식을 다른 타입으로 변환하는 것
    타입 프로모션(자동 형 변환)과 캐스팅(명시적 형 변환)으로 나뉜다.

  • 타입 프로모션

    ex)
    int i = 'A';
    double d = 10;
    char c = 1.23;
    int ii = -1.23;

    대입연산자(=) 기준으로 좌항과 우항의 자료형이 일치하지 않을 때, 컴파일러에 의해 자동으로 형변환이 발생한다.
    기존의 자료형 보다 범위가 큰 자료형으로 자동 변환되며 자료형의 우선순위는 다음과 같다.
    byte -> short,char -> int -> long -> float -> double
    우선순위를 거스르게 되면 데이터 손실이 되어 컴파일 오류가 발생한다.

  • 캐스팅
    형 변환 연산자를 사용해 의도적으로 명시하며 타입을 변환하는 방법. 강제 타입 변환이라고도 한다.
    위의 타입 프로모션과 다른 점은 코드에 타입 변환에 대한 가시성이 있다.
    캐스팅 방식으로 변환시키려 한다면 변환시키고자 하는 데이터 앞에 괄호( )를 입력 후 이 괄호 안에 변환하고자 하는 타입을 지정해준다.

    ex)
    int i = (int)12.345;
    float f = (float)12;

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

  • 크기할당, 초기화 없이 배열 참조 변수만 선언
int[] arr;
int arr[];
  • 선언 & 배열 크기 할당
int[] arr = new int[5];
String[] arr = new String[5];
  • 기존 선언된 배열의 참조 변수를 이용하여 초기화
int[] arr;
arr = new int[5]; // 5의 크기, 초기값은 0으로 채워진 배열이다.
int[] arr = {1,2,3,4,5}; // 마찬가지로 자동으로 5의 크기를 가짐
  • 선언과 동시에 배열 크기 지정 및 초기화
int[] arr = new int[]{1,2,3,4,5};
int[] arr2 = {1,2,3,4,5};
String[] fireWeekend = {"금","토","일"};
  • 2차원 배열
int[][] arr = new int[4][3]; //3의 크기를 4개 가지는 2차원 배열
int[][] arr = { {1,2,3}, {2,3,4}, {3,4,5,}, {4,5,6} };
// arr[0] >> {1,2,3}
// arr[1] >> {2,3,4}
// arr[2] >> {3,4,5}
// arr[3] >> {4,5,6}
  • 객체 배열
    Primitive type의 배열인 경우 초기값(int = 0 / String = "")을 가지고 있는 반면에
    Reference type의 배열을 선언했을 경우 배열내 엘리먼트의 초기값이 null임을 주의해야 한다.

이것은 위의 목차 2. 의 내용 중
primitive type의 변수는 기본 값이 있고, Reference type의 변수는 기본 값이 없기 때문에 null값이 있다고 언급한 부분과 일맥상통하다.

// 객체(Class) 배열 선언
Student[] StudentArr = new Student[5];     //Student Class의 인스턴스 최대 5개 할당할 수 있는 배열
//StudentArr[0] >> null
//StudentArr[1] >> null
//StudentArr[2] >> null

8. 타입 추론, var

  • 데이터 타입을 자동할당하는 자료형
  • 지역변수이면서 초기화가 필수.
  • 자바 10부터 지원

자바스크립트에서 타입스크립트로 넘어가는 시점에서 왜 var 키워드를 자바에서 추가했는지 자료조사를 해보니...
첫 번째로는 자바 개발진이 하위 호환성의 목적으로 추가한 것이라고 한다.

그리고 자바와 비슷한 C#의 경우 var 키워드가 유용하게 쓰이는 경우가 있는데
anonymous class와 linq라고 한다.

자바에 적용하려면 뒤에 스터디가 예정되어 있는 제네릭과 인터페이스의 개념이 필요한 것 같다.

profile
Elegant Dev

0개의 댓글