Java/STUDY HALLE

[Java] 데이터타입, 변수, 배열

무토(MUTO) 2020. 11. 21. 21:53

목표

자바의 원시타입, 변수, 배열을 사용하는 방법을 학습한다.

 

 

 

WHY?

 

프로그래밍이란 결국 값을 메모리 위에 올리고, 그 값을 변경하는 것이 전부다. 따라서 이번 과제에서는 그 두가지 행위중의 50%에 해당하는 "값이 메모리 위에 어떻게 올라가 있는가" 에 대한 것과, 그 사용법에 대해서 익히기 위함인 것 같다.

 

 

 

 

1. 원시타입의 종류와 값의 범위, 그리고 기본 값

 

출처 : https://jdm.kr/blog/213

정수 표현형: byte, short, int, long 

부동소수 표현형 : float, double

문자형 : char

논리형 : boolean

 

정수 표현형은 int가 기본형이다.

부동소수 표현형은 double이 기본 표현형이다.

 

 

 

2.원시타입과 참조타입

 

원시타입은 해당 값을 비트에 직접 저장한다. 그래서 그값이 적힌 메모리의 위치를 찾으면 바로 값을 찾을 수 있다.

그러나 참조타입은 객체의 주소값을 저장한다. 그래서 그 값이 적힌 메모리의 위치를 찾아가면 해당 값이 저장되어 있는 다른 메모리의 주소가 있다. 자바에서는 위에 적혀있는 원시 표현형을 제외하고는 모두 참조타입이라고 보면 된다.

 

 

 

 

3.리터럴

 

리터럴이란 프로그램에서 직접 표현할 수 있는 값의 형태를 말한다.

 

정수 리터럴은  10진수, 16진수 8진수 2진수 를 표현할 수 있다. 기본 형태가 int형이기 때문에 int 형까지 표현할 수 있는 데이터는 정수 표현형 그대로 표현한다. 그러나 long타입 정수 표현형은 숫자의 끝에 l 혹은 L을 붙여서 표현할 수 있다.

 

실수 리터럴은 소수점 형태나 지수의 상태를 표현한다. 기본 형태가 double이기 때문에 double 형태는 실수 그대로 표현하고 float 형태는 숫자의 끝에 f나 F를 붙여서 표현한다.

 

문자 리터럴은 표현하고자 하는 문자 1개를 ' '로 감싸서 표현하거나 " "로 감싸서 표현하거나. 정수로 표현할 수 있다.

그 외에도 특수문자 리터럴과 유티코드의 값을 사용하여 문자 리터럴을 표현할 수 있다.

 

문자열 리터럴

문자열은 원시타입이 아니지만 리터럴로 표현할 수 있다. " "로 값을 감싸서 표현한다.

 

논리 리터럴

논리 리터럴은 true, false 혹은 조건문의 형태를 리터럴로 사용한다.

 

null 리터럴

null 리터럴은 참조타입의 모든 자료형에 null을 대입하여 사용할 수 있다. 원시자료형에는 표현히 불가능하다.

 

 

 

 

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

 

보통의 상황에서

(자료형) (이름); 이라고 작성하면 변수가 선언된다.

ex)  int number;

 

한꺼번에 같은 자료형을 여러개 선언하고 싶은 경우에는

(자료형) (이름), (이름), (이름); 과 같은 방식으로 선언할 수도 있다.

ex) int number1, number2, number3;

 

원시타입의 경우에는 변수의 선언과 초기화를 동시에 진행할 수 있다.

int number = 0;

위의 상황과 같은 방식으로 여러개의 값을 초기화 할 수 있다.

int number1, number2, number3 = 0;

 

원시타입의 경우에는 각각 초기화되는 값이 있다.

정수 표현형은 초기화하면 0이 기본값이다.

부동소수 표현형도 초기화하면 0.0이 기본값이다.

문자형은 초기화하면 0이 기본값이다.

논리형은 초기화하면 false가 기본값이다.

 

참조타입은 값을 초기화하지 않으면 기본형은 null이다.

 

참조타입 또한 각각의 변수의 값에 해당하는 객체를 연결하여 초기화 할 수 있다.

 

 

 

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

 

원시타입의 경우에는 변수가 선언된 블록 내에서만 변수가 살아있다. 해당 범위를 벗어나면 stack 영역에서 값이 해제된다. 단 static 이라는 예약어를 사용하면 변수의 스코프가 전역으로 변경되며 프로그램이 시작할 때부터 끝날 때 까지 변수가 살아있게 된다.

 

참조타입의 경우에는 변수가 선언된 블록내에서만 살아있는것은 같다. 그러나 해당 범위를 벗어나면 GC가 heap 영역에서 unreachable 여부를 판단하고 메모리를 반납한다. static 을 사용하면 변수의 스코프가 전역으로 변경되며 프로그램의 시작부터 끝까지 살아있게 되는것은 같다.

 

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

 

원시 자료형

-> 데이터의 사이즈가 작은것이 큰것에 들어갈 때는 아무런 문제가 되지 않기 때문에 자동으로 처리되지만, 데이터의 사이즈가 큰것이 작은것에 들어가려고 하면 몸에 맞지 않게되므로 강제적으로 변환시켜주어야 데이터의 사이즈가 작을것에 들어갈 수 있다.

-> 95사이즈의 티셔츠를 입는 사람은 110사이즈를 입으면 오버핏으로 옷을 입을 수 있지만 110 사이즈의 옷을 입는 사람이 95 사이즈의 옷을 입으면, 오버핏의 옷을 입던사람이면 괜찮지만, 뚱뚱한 경우 옷이 터지거나 늘어날 수 있는것과 같은 이유다.

 

타입 프로모션

:크기가 작은 자료형이 크기가 큰 자료형에 저장될 때 자동으로 크기가 큰 자료형의 타입으로 변환되는 현상이다.

 

타입 캐스팅

:크기가 큰 자료형을 크기가 작은 자료형에 저장하려고 할 때 사용하는 방법이다. 크기가 큰 자료형이 크기가 작은 자료형에 들어가려고 할 때 당연히 데이터의 손실이나 변형이 발생할 수 있다는 것을 생각해야한다.

 

참조 자료형

->상속관계에 있는 클래스간에서만 타입 캐스팅이 가능하다. 원시 자료형과는 정반대의 성향을 지닌다. 자식은 부모객체가 무엇을 가지고 있는지 모두 알 수 있기 때문에 자신이 가진것을 버려 타입을 똑같이 맞출 수 있지만, 부모객체는 자식객체가 자신이 가진것 이외에 무엇을 추가로 가지고있는지 알 수 없기 때문에 타입을 맞출 수 없다. 다만 자식이 부모객체가 되었던 것을 다시 자식의 상태로 되돌아가려고 할 때는 자신의 원래의 값을 기억하고 있기 때문에 타입 캐스팅이 가능하다.

 

업캐스팅

:부모 클래스가 명시적인 타입캐스팅 없이 자식 객체와 연결될 수 있다.

 

다운캐스팅

:자식클래스가 명시적인 타입캐스팅을 통해 부모객체와 연결할 수 있다. 

 

 

 

7. 1차원 배열, 2차원 배열 선언하기

 

배열

:동일한 자료형의 데이터를 한데모아 효율적으로 저장하기 위한 자료구조이다.

 

1차원 배열의 선언

1) String[] strings = {"11","22","33"};

2) String[] strings = new String[]{"11","22","33"};

 

위의 방법을 사용하면 배열의 선언과 지정해둔 값으로 초기화가 동시에 이루어진다.

 

3) String[] strings = new String[5];

 

이 방법을 사용하면 배열이 선언되고, 해당 자료형의 기본값으로 초기화가 이루어진다.

 

2차원 배열의 선언

1) int[][] ints = {{1,2},{2,4},{3,4,5}};

2) int[][] ints = new int[][]{{1,2},{2,4},{3,4,5}};

 

위의 방법을 사용하면 배열의 선언과 지정해둔 값으로 초기화가 동시에 이루어진다.

 

3) int[][] ints = new int[5][5];

 

위의 방법을 사용하면 해당 범위에 존재하는 모든 값들이 선언되며, 해당 자료형의 기본값으로 초기화된다.

 

8. 타입추론, var

 

타입추론

: 제네릭을 사용하는 경우에, 코드 작성 당시 타입이 정해지지 않았지만 컴파일러가 컴파일 하는 도중에 그 타입을 유추하는것.

ex) List<Integer> list = new ArrayList<>();

ArrayList의 자료형이 앞에 있는 Integer로 타입이 추론되어 작성할 필요가 없다. 작성할 코드의 양이 줄어들어 코드의 가독성이 높아질 수 있는 장점이 있다.

 

var

: 자바 10버전에 새로 생긴 타입추론 기능인데 원시타입도 타입 추론이 가능하다.

int a = 1; 와 같이 사용했다면

앞으로는

var a =1;로도 사용이 가능하다.

 

->질문사항: var를 왜 써야하는지 이유를 모르겠다. 괜히 사용하다가 타입오류 발생하고 문제점이 더 많을것 같다.

 

'Java > STUDY HALLE' 카테고리의 다른 글

[Java] GitHub Library 사용법  (0) 2020.12.06
[Java] JUnit5  (0) 2020.12.05
[Java] 제어문  (0) 2020.12.05
[Java] 연산자  (1) 2020.11.27
[Java]JVM 기술 스택의 구조 이해하기  (0) 2020.11.14