
public class WsJavaLiveStudy | |
{ | |
public static final GITHUB_URL = "https://github.com/whiteship/live-study"; | |
public static final YOUTUBE_URL = "https://www.youtube.com/user/whiteship2000"; | |
public static void main(String[] args) | |
{ | |
System.out.println("아래 내용은 백기선님과 함께하는 Java 라이브 스터디 과제 내용입니다."); | |
System.out.println("Github 에서 주차별 과제 내용을 확인하실 수 있으며, 매주 토요일 오후 10시30분 Youtube에서 라이브로 피드백 받고있습니다."); | |
System.out.println("깃허브 주소 : %s", GITHUB_URL); | |
System.out.println("유튜브 주소 : %s", YOUTUBE_URL); | |
} | |
} |
목표
자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
학습할 것
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
프리미티브 타입과 레퍼런스 타입
Java는 정적 타입의 언어로, 모든 변수들은 사용되기 전에 반드시 자료형과 함께 선언해주어야만 합니다.
예를 들어, int 자료형 변수 test는 아래와 같이 선언된 이후에 사용 가능합니다.
1
|
int test = 123;
|
cs |
그리고 변수를 선언할때 사용되는 자료형은 기본형(Primitive type)과 참조형(Reference type) 두 가지로 나뉘는데, 기본형은 변수에 실제 값을 저장하고 참조형은 값이 저장되어있는 주소 값을 저장하는 것이 가장 큰 차이입니다.
- 기본형 (Primitive type)
- 실제 값을 저장
- 기본형 변수간의 연산이 가능
- 참조형 (Reference type)
- 주소 값을 저장
- 참조형 변수간의 연산이 불가능
프리미티브 타입 종류와 값의 범위 그리고 기본 값
기본형 자료형에는 모두 8가지 타입이 있는데, 크게 논리형, 문자형, 정수형, 실수형 4가지로 분류할 수 있습니다.
분류 | 타입 | 설명 |
논리형 | boolean | true 와 false 둘 중 하나만의 값을 갖는 논리형 자료형입니다. 8 bit, 1 byte 의 크기를 가지며, 기본값은 false 입니다. |
문자형 | char | 16 bit, 2 byte 의 크기를 가지는 문자형 자료형입니다. 유니코드 값을 가지며 '\u0000' (0) ~ '\uffff' (65,535) 사이의 값을 가집니다. 기본값은 '\u0000' 입니다. |
정수형 | byte | 8 bit, 1 byte 의 크기를 가지는 자료형입니다. -128 ~ 127 사이의 값을 가집니다. 기본값은 0 입니다. |
short | 16 bit, 2 byte 의 크기를 가지는 자료형입니다. -32,768 ~ 32,767 사이의 값을 가집니다. 기본값은 0 입니다. |
|
int | 32 bit, 4 byte 의 크기를 가지는 자료형입니다. -2^31 ~ 2^31 -1 사이의 값을 가집니다. 기본값은 0입니다. Java 8 부터는 Integer 클래스에서 Unsigned 관련 메서드를 통해 오버플로우 등으로 인한 unsigned 변수와의 연산을 지원합니다.(예: compareUnsigned, divideUnsigned) |
|
long | 64 bit, 8 byte 의 크기를 가지는 자료형입니다. -2^63 ~ 2^63 -1 사이의 값을 가집니다. 기본값은 0L입니다. Java 8 부터는 Long 클래스에서 Unsigned 관련 메서드를 통해 오버플로우 등으로 인한 unsigned 변수와의 연산을 지원합니다.(예: compareUnsigned, divideUnsigned) |
|
실수형 | float | 32 bit, 4 byte 의 크기를 가지는 실수형 자료형입니다. 실수값을 부동소수점 방식으로 저장합니다. 기본값은 0.0f 입니다. 7자리의 정밀도를 제공하며, 이는 10진수 기준 7자리의 수를 오차없이 저장할 수 있음을 의미합니다. Oracle의 Java tutorial 문서에서는 정확도가 중요한 경우에는 이 자료형 대신 java.math.BigDecimal 을 사용할 것을 권장하고 있습니다. |
double | 64 bit, 8 byte 의 크기를 가지는 실수형 자료형입니다. float 보다 두 배의 크기를 가져 double 이라고 한다네요. 기본값은 0.0d 입니다. 15자리의 정밀도를 제공합니다. |
리터럴
리터럴을 이해하기 위해서는 Java에서 상수의 개념을 먼저 알아야합니다.
Java에서는 상수는 절대불변의 값을 저장하는 공간을 의미하는데, final 키워드를 사용해 변수와 상수를 구분하고 있습니다.
상수는 반드시 선언과 동시에 초기화해야하고, 그 이후에는 값을 변경하는 것이 허용되지 않습니다.
하지만, JDK 1.6 이후부터는 선언과 동시에 초기화하지 않아도 되며, 사용하기 전에만 초기화해도 됩니다.
1
2
3
4
5
|
// 변수 선언
int test = 123;
// 상수 선언 및 초기화
final int MAX_VALUE = 50;
|
cs |
이렇게 Java에서 상수라는게 존재하는데, 위에서 선언한 MAX_VALUE 외에도 1, 99, 'H' 라는 값 역시 상수입니다.
그러나 위에서 상수를 '값을 한 번 저장하면 변경할 수 없는 저장 공간' 으로 정의하였기 때문에, 이를 구분짓기위해 상수를 리터럴 이라는 용어로 부르게 되었습니다.
변수의 스코프와 라이프타임
변수들은 선언된 위치에 따라 사용 가능한 범위를 가지는데, 그 범위를 스코프(Scope)라고 합니다.
그리고 변수의 스코프에 따라 다른 라이프 타임을 갖게됩니다.
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
32
33
34
35
36
|
public class TestClass
{
/**
* 클래스 변수
*
* Life Time : 클래스 처음 호출시점 ~ 프로그램 종료시점
* Scope : 클래스가 인스턴스화 되지 않아도 사용 가능
*/
public static int classVariable = 0;
/**
* 인스턴스 변수
*
* Life Time : 인스턴스 생성시점 ~ 본 객체를 참조하는 객체가 없어지는 시점
* Scope : 클래스 내부 전체
*/
public boolean instanceVariable = false;
/**
* 메서드의 매개변수
*
* Life Time : 메서드 호출시점 ~ 메서드 종료시점
* Scope : 메서드 내부 전체
*/
public void method (String parameter)
{
/**
* 지역 변수
*
* Life Time : 중괄호 시작 ~ 중괄호 종료
* Scope : 중괄호 내부
*/
String localVariable = "";
}
}
|
cs |
타입 변환, 캐스팅 그리고 타입 프로모션
서로 다른 타입간의 연산을 수행하려면 연산을 수행하기 전에 서로의 타입을 일치시켜야 합니다.
이 때, 변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 형변환 이라고 합니다.
그리고 형변환에는 캐스팅과 프로모션이 있는데, 설명에 앞서 기본형 자료형을 표현할 수 있는 숫자의 크기 순으로 나열하겠습니다.
byte | short | int | long | float | double | String |
- 캐스팅(Casting) : 명시적 형변환
- 크기가 더 큰 자료형을 작은 자료형에 대입할 때, 작은 자료형을 명시해 강제로 변환하는 것을 의미
-
12long a = 100;int b = (int) a;
cs - 위 코드를 수행하면, 더 큰 자료형의 값을 작은 자료형에 넣는 것이기 때문에 명시적으로 형변환을 해주어야합니다.
- 프로모션(Promotion) : 자동 형변환
- 크기가 작은 자료형을 더 큰 자료형에 대입할 때, 작은 자료형이 큰 자료형으로 자동으로 변환되는 것을 의미
-
12int a = 100;long b = a;
cs - 위 코드를 수행하면, 별도의 캐스팅 없이도 형변환이 이루어져 a와 b는 각각 10, 10이 됩니다.
1차 및 2차 배열 선언하기
Java에서 배열은 선언 후 초기화 OR 생성을 해야하며 255차원까지 생성할 수 있습니다.
- 선언 후 초기화
- 배열의 크기를 지정할 수 없습니다.
-
12345// 1차원 배열 선언 후 초기화int[] intArr = {1, 2, 3};// 2차원 배열 선언 후 초기화int[][] 2dArr = {{1, 2, 3}, {4, 5, 6}};
cs
- 생성
- 배열의 크기를 지정할 수 있습니다.
-
12345// 1차원 배열 생성int[] intArr = new int[3];// 2차원 배열 생성int[][] 2dArr = new int[2][3];
cs
타입 추론, var
타입 추론
타입 추론은 컴파일러가 데이터의 타입이 무엇인지 추론하는 것을 의미하며, 대표적인 케이스로 제네릭(Generics)이 있습니다.
1
2
3
4
5
6
7
|
public class Test
{
public static void main (String[] args)
{
Map<String, Object> map = new HashMap<>();
}
}
|
cs |
위 코드에서 map 인스턴스를 생성할 때, Map의 제네릭으로 String과 Object를 제공해 이후 코드에서 이 map 인스턴스에 값을 넣을 때 String-Object 타입이 올 수 있음을 추론하게 해줍니다. 만약, 설정된 제네릭에 맞지 않는 타입을 넣게되면 오류가 발생하게 됩니다.
var
Java 10 부터 자바에서도 var 를 사용할 수 있게 되었습니다. Javascript의 var 와 동일한 역할을 합니다.
개인적으로 자바의 장점 중 정적 언어가 항상 꼽혔는데, var 도입은 약간 아쉬운 부분이 있습니다.
Java에서 var 를 사용할땐 아래 제약사항을 준수해야합니다.
- 로컬 변수여야만 합니다.
- 선언과 동시에 초기화해야합니다.
1
2
3
4
5
6
|
var a = 1; // Legal
var b = 2, c = 3.0; // Illegal: multiple declarators
var d[] = new int[4]; // Illegal: extra bracket pairs
var e; // Illegal: no initializer
var f = { 6 }; // Illegal: array initializer
var g = (g = 7); // Illegal: self reference in initializer
|
cs |
1
2
3
4
5
6
7
8
9
|
var a = 1; // a has type 'int'
var b = java.util.List.of(1, 2); // b has type 'List<Integer>'
var c = "x".getClass(); // c has type 'Class<? extends String>'
// (see JLS 15.12.2.6)
var d = new Object() {}; // d has the type of the anonymous class
var e = (CharSequence & Comparable<String>) "x";
// e has type CharSequence & Comparable<String>
var f = () -> "hello"; // Illegal: lambda not in an assignment context
var g = null; // Illegal: null type
|
cs |
참고 자료 :: Primitive Data Types (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)
참고 자료 :: Java 10 Spec (https://docs.oracle.com/javase/specs/jls/se10/html/jls-14.html#jls-14.4)
참고 자료 :: Java 10 에서 var 제대로 사용하기 (https://dev.to/composite/java-10-var-3o67)
참고 자료 :: Java 10 에서 var 제대로 사용하기 2탄 (https://dev.to/composite/java-10-var-2-4f8a)
'☕️ JAVA > WhiteShip Java LIVE Study' 카테고리의 다른 글
[WhiteShip Java LIVE Study] 6주차 : 상속 (0) | 2021.02.17 |
---|---|
[WhiteShip Java LIVE Study] 5주차 : 클래스 (1) | 2020.12.25 |
[WhiteShip Java LIVE Study] 4주차 : 제어문 (0) | 2020.12.11 |
[WhiteShip Java LIVE Study] 3주차 : 연산자 (0) | 2020.11.30 |
[WhiteShip Java LIVE Study] 1주차 : JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가 (0) | 2020.11.15 |