-
자바 스터디(2주차)CS지식/java 2020. 11. 21. 21:58
▶︎ 프리미티브 타입 종류와 값의 범위 그리고 기본 값
Primitive type종류
1. 총 8가지의 기본형타입을 정의하여 제공함
2. 기본값이 있기 때문에 Null이 존재하지 않는다. 기본형 타입에 Null을 넣고 싶으면 래퍼클래스 활용(Byte, Long, Integer, Double 등등…)
3. 1주차에 스터디 자료에 쓴 것 처럼 스택 메모리에 저장
4. 컴파일 시점에 담을 수 없는 크기를 벗어나면 에러를 발생 시키는 컴파일 에러 발생(개인적인 경험 중 코딩테스트에서 많이 겪었습니다… ㅎㅎ)
이렇게 8개로 구성되어 있다!
▶︎ 프리미티브 타입과 레퍼런스 타입
무슨 차이가 있고 장단점이 뭔지 쓰면 좋을거 같다고 생각이 든다.
Primitive Type : 위에 말한 논리, 정수, 실수, 문자형 타입을 말한다.
Reference Type : 8개의 타입을 제외한 모든 것이 Reference Type이고 모두 기본값을 Null값을 가지고 있습니다. 만약 여기에 변수값을 넣지 않고 기본값으로 로직을 실행시킬 때 NullPointException을 발생시키게 되고 약 오류 80%가 이 오류라고 한다.
여러 타입 중 일부만 소개한다면..
이렇게 총 4개가 존재한다.
▶︎ 리터럴
리터럴을 알기전 상수에 대해 알 필요가 있다.
상수는 변하지 않는 변수를 뜻한다.
리터럴은 그 변수에 들어갈 변하지 않는 데이터를 의미한다.
상수의 예시로는 final int a = 10에서 a가 상수를 의미하고 10은 리터럴을 의미한다.
즉 상수는 변하지 않는 수이기 때문에 메모리 값을 바꿀 수 없다.
리터럴의 경우 변하지 않는 데이터를 의미하고 즉 이것은 메모리 위치 안에 있는 값을 의미한다.
또한 리터럴은 타입별로 다양하게 있어 실수, 문자, 문자열, 논리 등 다양한 리터럴이 존재한다.
▶︎ 변수 선언 및 초기화하는 방법
변수를 선언하려면 두가지의 전제 조건이 필요하다.
1. 바로 변수를 담을 타입을 지정하고 그 타입에 맞는 이름을 설정해야한다.
2. 변수와 이름을 지정한 후 타입에 맞는 리터럴 데이터를 대입연산자를 통해 초기화를 시키면 모든게 해결된다!
★ 변수의 이름 규칙
1. 대소문자가 구분되며 길이에 제한이 없다.
2. 숫자로 시작하는건 안되지만 숫자로 끝내는건 가능하다(숫자외의 알파벳이 먼저 들아간다고 가정한다음에) ex) a1,a2 등..
3. 변수명이 한글은 안됩니다.
4. 이름 사이에 공백 안됩니다.
5. 특수문자는 _ 와 $만 가능합니다..
6. 예약어를 사용하면 안됩니다. ex) int int (x)
· 변수의 스코프와 라이프타임
스코프라는 의미는 변수의 사용가능한 범위를 의미합니다.
범위의 경우 1주차의 JVM의 예시를 보면 이해가 가능한데 스택에 저장되어 있는 것의 경우 {}내에 선언한 변수명이 있는 것은 닫힌 이후에 해당 변수명을 호출해도 오류메시지가 나온다. 이유는 중괄호가 닫힌 이후에 해당 변수명의 타입 데이터를 반납했기 때문이다.
이러한 경우를 벗어나기 위해서는 간단하다. JVM의 상황을 보고 자신이 원하는 경우에 맞게 스코프를 고려하고 타입을 선언해야 한다.
저 같은 경우 코딩테스트를 할 때를 예를 들면 배열 관련 된 타입은 대부분 static로 선언해서 프로그램이 종료될 때까지 메모리에 남게끔 설정하는 편이다..
▶︎ 타입 변환, 캐스팅 그리고 타입 프로모션
타입변환은 총 2가지가 존재한다.
1. 명시적 타입변환
명시적 타입변환은 사용자에 의해 임의로 바꾸는 것을 의미한다.
코딩테스트를 할 때 정말 많이 쓰는 건데
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.ReadLine);
Int N = Integer.parseInt(st.nextToken());
이런식으로 보통 쓸 때 StringTokenizer는 String으로 데이터가 되어있기 때문에 Int로 변경을 해서 데이터를 받게 만들어 코딩테스트 문제를 푸는 경우가 많다..
2. 묵시적 타입변환
특정 리터럴이 선언한 타입에 의해 변수에 데이터로 들어갈 경우 선언한 타입에 맞게 데이터가 들어가는 것을 의미한다.
Double a = 5; 를 예를 들면
5는 분명 int타입의 리터럴임에도 불구하고 a가 double타입이어서 a에 저장될때는 double타입 리터럴로 바뀌게 된다.
▶︎ 1차 및 2차 배열 선언하기
배열을 선언할 때는
int arr = new int[10] 이런식으로 1차 배열을 선언하고
int arr = new int[10][10] 이런식으로 2차 배열을 선언한다.
배열을 선언한 주소는 힙에 저장되게 된다.
하지만 예외가 하나 있는데 2차 배열의 리터럴 데이터를 선언하며 행과 열을 결정 시킬 수도 있다.
Int[][] arr = new int[][]{10,20,30},{20,30,40};
또한 가변 배열을 설정할 수 있는데
이것은 첫번째 배열에 있는 데이터에 인덱스에 따라 2차원 배열 각각을 다르게 설정할 때 효과가 있는 것이다.
예를 들어
Int[][] arr = new int[10][]; 이런 식으로 선언하고
arr[0] = new int[3];
arr[1] = new int[4];
arr[2] = new int[5];
이런 식으로 인덱스 마다 각각 다른 배열을 나타내게 한다.
▶︎ 타입 추론, var
일단 타입 추론의 경우 Java 10이상에서 나오게 된 것이다.. (지금까지 Java 8에서만 이용을 한 저로선.. 처음 보는 개념..)
var의 경우 js를 사용할 때는 많이 썻지만.. 자바에서는 js와 다르게 무조건 초기화를 꼭 해야한다!
Js와 마찬가지로 따로 타입을 int, double, String 등을 쓸 필요 없이 타입을 리터럴 데이터에 따라 결정(타입추론을 통해)을 지을 수 있어, 상당히 좋은 키워드라고 생각합니다.
ex) var data = “Hello”;
Var ArrayList = new ArrayList<>(); 이런식으로 다이아몬드 연산자와의 혼용은 불가능하다..
참고자료
https://jhnyang.tistory.com/189
https://velog.io/@bk_log/Java-%ED%83%80%EC%9E%85-%EC%B6%94%EB%A1%A0
'CS지식 > java' 카테고리의 다른 글
자바 스터디(3주차) (0) 2021.01.30 자바 스터디(1주차) (0) 2020.11.21