일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 주간회고
- SQL 실행순서
- db
- BalancedTree
- 회고
- useMutation
- 우테코
- 월간회고
- InnoDB 버퍼 풀
- Blue-Green
- ci/cd
- 카카오 2차 코딩테스트
- 계층별 구조
- Jenkins
- useQuery
- java
- 어댑티브 해시 인덱스
- mysql
- 블로그 병행
- N+1
- DeleteAll
- 기능별 구조
- B+TREE
- jacoco
- 도커
- 메서드명
- 백기선 스터디
- 멀티쓰레드 프로그래밍
- 클래스
- 프리코스
- Today
- Total
Haneul's Blog
[Java] 자바 데이터 타입, 변수 그리고 배열 본문
백기선님 자바 스터디 2주차의 주제인 자바 데이터 타입, 변수 그리고 배열에 대해서 자세하게 정리해보려고 합니다.
이번 주제 같은 경우는 자바를 공부 해 보신 분들이라면 "나는 다 아는건데 다시 공부해야 하나"라는 생각을 하실 수 있습니다.
하지만 1주차를 공부하면서 느낀 것이 내가 알고 있다고 생각한 것이라도 다시 공부하면서 생각을 정리할 수 있고, 잘못 생각하고 있던 부분도 있을 수 있기 때문에 다시 한 번 복습하는 차원에서 정리해보겠습니다.
목표 [백기선님 2주차 자바 스터디]
자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
학습할 것
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
프리미티브 타입 종류와 값의 범위 그리고 기본 값
자바의 기본 자료형인 프리미티브 타입은 값을 할당할 때 변수의 주소값에 값이 그 자체로 저장되는 데이터 타입입니다.
이 데이터 타입은 값이 할당되면 JVM의 Runtime Data Area 중 Stack 영역에 값이 저장됩니다.
아래는 프리미티브 타입의 종류와 값의 범위 및 데이터 사이즈를 나타낸 것입니다.
type | byte 크기 | 범위 |
boolean | 1byte | true or false |
char | 2byte | '\u0000'(0) to '\uffff'(65535) |
byte | 1byte | -128 to 127 |
short | 2byte | -32,768 to 32,767 |
int | 4byte | -231 to -231-1 |
long | 8byte | -263 to -263-1 |
float | 4byte | (6~7자리 정밀도) |
double | 8byte | (15자리 정밀도) |
프리미티브 타입과 레퍼런스 타입
프리미티브 타입은 위에서 정의를 내렸기에 여기서는 레퍼런스 타입만 다루겠습니다.
참조자료형이라 불리우는 레퍼런스 타입은 프리미티브 타입을 제외한 모든 타입들이 해당됩니다.(Ex: 배열, 컬렉션, 객체)
레퍼런트 타입은 변수 선언 시에 변수에 값이 저장되는 것이 아닌 객체에 대한 힙 영역의 참조를 저장하게 됩니다.
그렇기 때문에 프리미티브 타입과 레퍼런스 타입을 각각 메서드나 생성자 파라미터에 넘겼을 경우에 동작하는 방식이 다릅니다.
자바는 Pass By Value으로 복사된 데이터를 전달하여 구성하고 값을 수정하여도 원본의 데이터에는 영향을 주지 않는 방식을 사용하고 있습니다.
이 때 자바에서는 프리미티브 타입과 레퍼런스 타입을 파라미터로 각각 넘겼을 때 동작하는 방식이 다릅니다.
프리미티브 타입은 위에서 설명한 것과 같이 값을 복사하여 파라미터로 넘겨주기 때문에 그 값을 변경해도 이전의 값에는 영향이 없습니다.
하지만 레퍼런스 타입은 복사 후에 전달되는 값이 실제 메모리를 가리키는 참조값 주소이기 때문에 파라미터로 넘겨서 값을 변경하게 된다면 이전의 값이 함께 변경이 됩니다.
위와 같은 차이점 이외에도 프리미티브 타입은 null 값을 가질 수 없고 레퍼런스 타입은 null 값을 가질 수 있다는 것이 다릅니다.
리터럴
리터럴은 데이터 그 자체를 의미합니다.
예를 들어서 age = 27 이 있으면 여기서 27부분이 리터럴인 것입니다.
상수와 많이 헷갈리지만 상수의 경우에는 한 번만 값을 저장 가능한 변수를 의미하고 리터럴은 데이터 그 자체를 의미하기 때문에 차이점이 있습니다.
변수 선언 및 초기화하는 방법
변수를 선언하겠다는 것은 데이터를 위한 저장 공간을 확보하겠다는 의미로 해석할 수 있고, 변수를 초기화 하겠다는 것은 확보한 저장공간에 원하는 값을 저장하는 것을 의미합니다.
아래는 변수 선언과 초기화 예제입니다.
int a; // 변수 선언
a = 12; // 변수 초기화
// 선언과 동시에 초기화 할 수도 있습니다.
int a = 12;
변수를 선언할 당시에 해당 공간에는 아무런 의미가 없는 쓰레기 값이 들어가게 되고, 그 상태에서 사용하려고 한다면 Error가 발생할 수 있습니다.
그렇기 때문에 변수를 선언하면 꼭 초기화를 해주어야 합니다.
변수의 스코프와 라이프타임
스코프란 변수가 유효한 범위를 나타내고 라이프타임은 해당 변수가 메모리에 언제까지 살아있는지를 의미합니다.
변수의 경우 스코프에 따라서 Instance Variables, Class Variables, Local Variables 로 나눌 수 있습니다.
Instance Variables(인스턴스 변수)
클래스 안에 선언되었고 어떠한 메서드나 블럭 안에서 선언되지 않은 변수로 유효한 범위(스코프)는 static method를 제외한 클래스 전체이고 lifetime은 클래스를 인스턴스화한 객체가 메모리에서 사라질 때 까지 입니다.
Class Variables(클래스 변수)
클래스 안에서 선언되었고 어떠한 메서드나 블럭안에서 선언되지 않았으며 static 키워드가 포함되어 선언된 변수로 유효한 범위(스코프)는 클래스 전체이고 lifetime은 프로그램이 종료할 때 까지입니다.
Local Variables(지역 변수)
인스턴스 변수 및 클래스 변수가 아닌 모든 변수로 유효한 범위(스코프)는 변수가 선언된 block 내부이고 lifetime은 변수가 선언된 block 내부에 있는 동안입니다.
타입 변환, 캐스팅 그리고 타입 프로모션
타입 변환(캐스팅)은 어떤 값이나 변수의 타입을 다른 타입으로 변경하는 것을 의미합니다.
이 때 타입 변환은 자동으로 변환되는 자동 형변환, 명시적으로 변환시켜주는 명시적 변환으로 나누어집니다.
여기서 자동으로 형변환이 일어나는 것을 타입 프로모션이라고 합니다.
그리고 타입 변환을 할 시에 조건이 존재합니다.
두 데이터 타입은 호환이 되어야 한다는 것이고, 더 작은 데이터 타입의 값을 더 큰 범위의 타입에 할당할 때만 존재한다는 것입니다.
예를 들면 자바의 숫자 타입에서는 byte -> short -> int -> long -> float -> double 처럼 한 방향으로만 타입 변환을 할 수 있습니다.
반대 방향으로 변환이 되기는 하지만 표현할 수 있는 값의 범위를 넘어가게 된다면 데이터의 손실이나 변형이 올 수 있습니다.
1차 및 2차 배열 선언하기
먼저 배열이 먼저 짚고 넘어가겠습니다.
배열은 동일한 타입의 데이터를 연속된 공간에 저장하기 위한 자료구조로 연속된 공간에 저장하기 때문에 임의접근이 가능하여 검색을 할 때 O(1)의 시간복잡도를 가집니다.
또한 배열은 맨 처음 초기화 할 때 길이를 정해주어야 한다는 제약이 있습니다.
이러한 배열을 선언하기 위해서는 []를 사용해야 하는데 예를 들면 아래와 같습니다.
int[] intArr1; // int 1차원 배열 선언
intArr1 = new int[3]; // 1차원 배열 초기화
intArr1[0] = 1;
intArr1[1] = 2;
intArr1[2] = 3;
int[] intArr2 = new int[원하는 배열 길이] // 선언과 동시에 초기화
intArr2[0] = 1;
intArr2[1] = 2;
intArr3[2] = 3;
int[] intArr3 = {1,2,3} // 바로 값을 넣으면서 초기화
int[] intArr4 = new int[]{1,2,3} // 위와 비슷한 방법
// 여기까지 1차원 배열(위의 방법은 모두 {1,2,3} 배열을 초기화 하는 방법)
int[][] intArr5;
intArr5 = new int[2][2];
intArr5[0][0] = 1;
intArr5[0][1] = 2;
intArr5[1][0] = 3;
intArr5[1][1] = 4;
int[][] intArr6 = {{1,2},{3,4}};
// 여기까지 2차원 배열(위의 방법은 모두 {{1,2},{3,4}} 배열을 초기화 하는 방법)
타입 추론, var
타입 추론이란 데이터 타입을 소스코드에 명시하지 않아도 컴파일 단계에서 컴파일러가 타입을 유추하여 정해주는 것을 의미합니다.
var 키워드는 자바 10에서 추가된 기능으로, 로컬 변수의 타입 추론입니다.
var 키워드의 사용은 반복되는 타입 선언을 줄여주고, 코드의 가독성을 높여줍니다.
var haneul = "haneul"; // String haneul = "haneul";
var age = 27; // int age = 27;
'Java' 카테고리의 다른 글
[Java] 상속 (0) | 2022.10.17 |
---|---|
[Java] 클래스 (0) | 2022.10.16 |
[Java] 제어문 (0) | 2022.10.15 |
[Java] 연산자 (1) | 2022.10.13 |
[Java] JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2022.10.11 |