-
[Study] 자바 2주차 과제JAVA 2020. 11. 21. 19:24반응형
2주차 과제입니다.
프리미티브 타입 종류와 값의 범위 그리고 기본 값
타입 종류 기본 값 값 범위 메모리 사용 크기 Wrapper Class 정수형 byte 0 -128 ~ 127 1byte Byte short 0 -32,768 ~ 32,767 2byte Short int 0 -2,147,483,648 ~ -2,147,483,647 4byte Integer long 0L -9,223,372,036,854,775,808 ~
9,223,372,036,854,775,8078byte Long 실수형 float 0.0F (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값 4byte Float double 0.0 (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값 8byte Double 문자형 char '\u0000' 0 ~ 65,535 2byte Character 논리형 boolean false True or False 1byte Boolean 프리미티브 타입과 레퍼런스 타입
프리미티브 타입 (기본형 타입, 원시 타입)
- 프리미티브 타입(Primitive Type)은 기본형 타입, 원시 타입으로 부르며 자바에서는 총 8가지를 미리 정의하여 제공합니다.
- 비객체 타입이며 기본값이 존재하기 때문에 Null 값은 가질 수 없습니다.
- 만약 Null 값을 넣고 싶다면 Wrapper Class를 활용하여 넣을 수 있습니다.
- Stack 메모리에 저장됩니다.
레퍼런스 타입 (참조형 타입)
- 레퍼런스 타입(Reference Type)은 참조형 타입이라 부르며 기본형 타입을 제외한 타입들 모두입니다.
- 빈 객체를 의미하는 Null이 존재합니다.
- 프리미티브 타입과는 달리 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로 Heap 메모리에 저장됩니다.
- 종류로는 클래스(class), 인터페이스(interface), 배열(array), 열거(enum) 타입이 있습니다.
리터럴 (literal)
리터럴은 해석하자면 '문자 그대로 정확한' 이라는 뜻입니다.
즉, 뜻 그대로 소스 코드의 고정된 값을 뜻합니다.
//정수형 리터럴 int val1 = 123; long val2 = 2000000000l; //long의 경우 l, L을 뒤에 붙여줘야한다 //실수형 리터럴 float val3 = 0.12f; //float의 경우 f, F를 뒤에 붙여줘야한다 double val4 = 0.34; //double은 뒤에 d,D 를 생략이 가능하다 //문자 리터럴 //단일 인용부호('')로 문자를 표현한다 char c = 'A'; //문자열 리터럴 //문자열은 ("")로 표현한다 String s = "ABC"; //논리 리터럴 //true, false로 표현한다 boolean b = true;
위 코드에서와 같이 각각의 변수 뒤에 선언된 변하지 않는 데이터(값)을 리터럴이라고 합니다.
종류로는 정수, 실수, 문자, 문자열, 논리 리터럴이 있습니다.
변수 선언 및 초기화하는 방법
우선, 변수 선언과 초기화를 하기 전에 변수에 대해 알아보겠습니다.
더보기변수란?
변수란 값을 저장할 수 있는 메모리 공간에 붙여진 이름입니다.
변수를 선언하면 메모리 공간이 할당되고 할당된 메모리 공간에 이름이 붙습니다.
메모리는 타입 크기에 맞게 메모리가 할당됩니다.변수 선언 및 초기화
여기서 초기화는 변수에 처음 값을 넣어주는 것을 초기화라고 합니다.
선언과 초기화는 아래 코드를 참고하시면 됩니다.
//변수 선언 및 초기화 int val; //변수타입 변수이름; int val = 10; //변수타입 변수이름 = 초기화 값 //같은 타입의 변수 여러개 선언 및 초기화 int val1, val2, val3, val4; int val1 = 1, val2 = 2, val3 = 3, val4 = 4;
변수의 스코프와 라이프 타임
스코프란 변수를 사용할 수 있는 범위를 의미하는데 {} 안에서 변수를 선언했을 경우 영역이 끝나기 전까지는 어디서든 사용이 가능합니다.
간단하게 코드 예제를 보면서 알아보겠습니다.
public class Example { //클래스 영역 String instanceVal = "인스턴스 변수"; static String classVal = "클래스 변수"; public void method() { //메소드 영역 String localVal = "지역 변수"; System.out.println(localVal); } public static void main(String[] args) { // System.out.println(instanceVal); //에러 // System.out.println(localVal); //에러 System.out.println(Example.classVal); //같은 클래스 내에서 사용을 할 경우 Example. 생략 가능 Example e = new Example(); System.out.println(e.instanceVal); e.method(); for(int i=0; i<10; i++) { //i는 지역 변수 System.out.print(i+" "); } } }
- 인스턴스 변수(instance variable)
위 코드에서는 instanceVal 변수로 클래스 영역에 선언됩니다. Example e = new Example()과 같이 인스턴스를 생성할 때 만들어지므로 생성을 하지않고 사용을 하게되면 에러가 발생하게 됩니다. - 클래스 변수(class variable)
위 코드에서는 classVal 변수로 마찬가지로 클래스 영역에 선언됩니다. 선언하는 방법은 앞에 static을 붙이면 됩니다. 클래스 변수는 모든 인스턴스가 공통된 저장공간(변수)를 공유하게 됩니다.
인스턴스 변수와는 달리 인스턴스를 생성하지 않고 언제라도 바로 사용 가능하며 '클래스 이름.변수 명'와 같은 형식으로 사용합니다. - 지역 변수(local variable)
메소드 내에서만 사용 가능하며, 메소드가 종료되면 소멸되어 사용할 수 없게 됩니다.
for문 또는 while문 블럭 내에서 선언된 변수도 지역 변수라 하며 선언된 블럭 {} 내에서만 사용 가능하고 블럭을 벗어나게 되면 소멸되어 사용할 수 없게 됩니다.
타입 변환, 캐스팅 그리고 타입 프로모션
프로그램을 작성하다 보면 같은 타입뿐만 아니라 서로 다른 타입 간의 연산을 수행해야 하는 경우도 있습니다.
이럴 때는 연산을 수행하기 전에 타입을 일치시켜야 하는데. 변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 '형변환'이라고 합니다.
형변환의 종류로 프로모션 (자동 형변환, 암시적 형변환, Promotion) 과 캐스팅 (명시적 형변환, Casting) 이 있습니다.
- 프로모션 (Promotion)
메모리 사용 크기가 더 작은 자료형을 더 큰 자료형에 대입할 때, 자동으로 작은 자료형이 큰 자료형으로 변환되는 현상을 의미합니다. - 캐스팅 (Casting)
메모리 사용 크기가 더 큰 자료형을 더 작은 자료형에 대입할 때, 자료형을 명시해서 강제로 집어넣는 것을 의미합니다.
'(타입) 피연산자' 의 형태로 사용되며 여기에서 괄호는 '캐스트 연산자' 또는 '형변환 연산자'라고 합니다.
int val1 = 1000; float val2 = val1; byte val3 = (byte)val1; System.out.println(val2); //1000.0 System.out.println(val3); //-24 큰 데이터를 작은 공간에 넣으려고 하니 손실이 발생
1차 및 2차 배열 선언하기
배열을 선언하기에 앞서 배열이란 무엇인가에 대해 알아봅시다.
더보기배열이란?
'같은 타입'의 여러 변수를 하나의 묶음으로 다루는 것을 배열이라고 합니다.
1차원 배열 선언하기
배열 선언은 간단하게 원하는 타입의 변수를 선언하고 변수 또는 타입에 배열임을 의미하는 대괄호[]를 붙이면 됩니다.
//배열 선언 //타입[] 변수이름 int[] arr1; //타입 변수이름[] String arr2[]; //배열 생성 //변수이름 = new 타입[길이] arr1 = new int[10]; arr2 = new String[5];
2차원 배열 선언하기
1차원 배열과 동일한데 대괄호[] 하나만 더 추가하면 됩니다.
//배열 선언 //타입[] 변수이름 int[][] arr1; //타입 변수이름[] String arr2[][]; //배열 생성 //변수이름 = new 타입[길이] arr1 = new int[10][5]; arr2 = new String[5][10];
타입 추론, var
var이란 Java 10부터 추가된 기능으로 지역 변수로 var을 선언하여 초기값을 통해 데이터 타입을 추론하는 것입니다.
var i = 1; //int로 추론 var s = "문자열"; //String으로 추론 var list = new ArrayList<String>(); //ArrayList<String>으로 추론 //for문에서도 사용이 가능하며 이런식으로 같은 코드의 길이를 줄일 수 있다. Map<String, List<Integer>> map = new HashMap<>(); for(Map.Entry<String, List<Integer>> m : map.entrySet()) { List<Integer> list1 = m.getValue(); } var map = new HashMap<String, List<Integer>>(); for(var m : map.entrySet()) { List<Integer> list1 = m.getValue(); }
주의사항
- 지역 변수에서만 사용이 가능합니다.
- var a = 1, b = 2 와 같이 ','와 함께 사용이 가능하지 않습니다.
- 기본형 타입은 null이 사용이 불가능하므로 타입 추론을 위해 null은 사용할 수 없습니다.
- 초기값이 있어야 합니다.
- 배열이 될 수 없습니다.
- 람다식에서 사용할 수 없습니다.
- 메소드 파라미터값으로는 사용할 수 없습니다.
- 가독성을 위해 변수에 타입을 명시해주는 등 네이밍에 신경을 써 가독성을 높여주는 것이 좋습니다.
References
-자바의 정석 (남궁석 지음)
728x90'JAVA' 카테고리의 다른 글
[Study] 자바 4주차 과제 (1) 2020.12.08 [Study] 자바 3주차 과제 (0) 2020.11.28 [Study] 자바 1주차 과제 (0) 2020.11.17 [JAVA] 제네릭(Generic) 이란? (0) 2020.11.15 [JAVA] StringTokenizer (0) 2020.10.28