자료형은 아주 기초적인 개념이라 넘어가려고 했지만, 새로이 자바를 공부하면서 생각보다 모르는 부분이 많았기에 따로 정리해두려고 한다.
자료형(Data Type)
숫자(Number), 부울(Boolean), 문자(Character, 작은 따옴표로 만듦(' '), 유니코드(2byte) 문자체계 사용)(여기까지 기본형), 문자열(String, 큰 따옴표로 만듦(" ")) 등등이 있다.
primitive type(기본 자료형)으로는 boolean | byte, int, short, long | float, double | char 의 8개가 있다. 나머지는 reference type이다.
그 외 자료 형태와 자료에 대한 연산을 정의하고, 구체적인 구현 방법은 명시하지 않은 것을 추상 자료형(Abstract Data Type = ADT)이라고 한다. 추상클래스, 인터페이스를 참고하면 된다.
숫자(Number)
숫자에는 정수(byte, short, int, long(l, L을 붙임)), 실수(float(7자리 정밀도), double(d, D를 붙임, 15자리 정밀도)), 2진수(0b), 8진수(0), 16진수(0x)가 있다.
int는 약 +-20억까지 표현할 수 있다.
각 타입이 표현가능한 최대 최솟값은 Integer.MIN_VALUE, Integer.MAX_VALUE 로 확인할 수 있다.
(앞에 Integer만 바꾸면 가능)
int num1=0b1110;같이 사용한다. 이를 출력하면 10진수로 나오는데 이걸 2진수인 채로 보여주고 싶다면 System.out.println("0b"+Integer.toBinaryString(num1));같이 출력해주면 된다.
(8진수는 Integer.toOctalString(), 16진수는 Integer.toHexString()을 사용한다.)
표현을 이쁘게 해주기 위해서 int num1=0b1110_0001; int num2=0xff_ff_ff_ff;같이 _를 사용할 수 있다.
double num1=1.234567E2; => 123.4567 같이 지수표현도 가능하다.(e 혹은 E, 16진수는 p 혹은 P)
유니코드값은 char a = '\u유니코드값‘같이 입력하면 쓸 수 있다.
byte, short형은 자동으로 int로 형변환되어 계산된다.
** 자바의 Boolean 타입은 true, false다.(대문자 없음) **
문자열(String)
여러 문자열로 이루어진 집합이다. 큰 따옴표로 만든다.
만드는 방법은 2가지가 있다.
- String s1 = "test for study"; String s2 = "test for study";
- String s3 = new String("test for study");
2가지 방법의 차이점은
방법 1은 s1과 s2가 같은 객체를 가리키게 되지만, 방법 2는 새로운 객체를 만드는 방법이다. 그래서 비교연산자 '=='은 객체를 비교하는 것이므로 s2==s3에서 false를 반환하지만, equals 함수는 값을 비교하는 것이므로 s2.equals(s3)는 true를 반환하게 된다.
new를 이용할 경우 힙 영역에, 문자열을 바로 할당할 경우 스택 영역에 존재한다. 불변 객체이다.
주로 사용하는 메소드
예시로 사용하는 변수 => String s1 = "test for study", String s2 = "test for study", String s3 = new String("test for study")
** s1.substring(1,3), s1.toUpperCase()같이 사용한다고 해서 원래 s1이 변하는건 아니다.(s1은 그대로 출력된다.) **
메소드 이름 | 사용 예시 | 설명 |
equals | s1.equals(s2) | 값을 비교하는 함수 |
indexOf | s1.indexOf("s") -> 1이 나온다. |
해당 인덱스(0부터 시작)의 값을 찾는 함수. 처음으로 찾는 인덱스를 반환. |
replace | s1.replace("test", "bye") -> "bye for study"가 나온다. |
해당 부분을 바꾸는 함수. 해당 단어가 여러개 있으면 죄다 바꾼다. |
replaceAll | s1.replaceAll("[abcde]", "") -> by for stuy가 나온다. |
해당 부분을 바꾸는 함수. 해당 단어가 여러개 있으면 죄다 바꾼다. 정규 표현식을 사용할 수 있다. |
substring | s1.substring(1,3) -> "es"가 나온다. |
부분문자열을 뽑는 함수. substring(1,3)이면 1번 인덱스부터 3번 인덱스 전까지 뽑는다. 원래 s1을 변경하는건 아니다. |
toUppercase | s1.toUpperCase() -> "TEST FOR STUDY"가 나온다. |
대문자로 바꿔주는 함수. |
format | String str = "abc" str = String.format("%5s",str); -> " abc"가 나온다. |
서식문자(%d, %s 등)를 이용해 format(형식)에 맞춰 문자열을 만들 때 사용한다. |
String s1 + s2로 합치거나, s1.append(s2)를 사용할 수 있다.
""" """을 사용하면 멀티라인 입력이 가능하다고 한다.(Java 1.7부터 가능, 파이썬에는 있는 문법?)
문자열(StringBuffer)
문자열을 자주 추가하거나 변경할 때 사용하는 자료형이다. append함수로 추가한다. (String도 append 함수를 쓸 수 있지만, 데이터에 변화가 일어날때마다 새롭게 만들어서 하므로 잦은 데이터 변경이 있을경우 Stringbuffer를 쓴다.)
String같이 String s = "test"로 초기화할 수 없고, new를 이용해야 한다.
주로 사용하는 메소드
예시로 사용하는 변수 => StringBuffer s1 = new StringBuffer("test for study")
메소드 이름 | 사용 예시 | 설명 |
append | s1.append("123") -> "test for study123"이 나온다. |
문자열 뒤에 문자열을 추가하는 함수. |
자료구조(Data Structure)
자바에서 기본적으로 사용하는 배열, List, Map을 말한다.
배열(Array)
배열은 엄밀히는 자료구조이다. 여러 자료들을 담을 수 있다. 요소(index)와 위치(element)로 구성된다. 배열을 효과적으로 다루라고 자바에서는 Arrays라는 클래스를 제공해준다고 한다.
만드는 방법은 여러가지가 있다.
- int[] arr1 = {1, 5, 4, 3, 2}; String arr2 = {"Hi", "123", "Developer"};
- char[] arr3 = new char[3]; -> 배열 size는 있으나 무얼 넣을지 정하지 않았을 경우 사용.
- char[] arr4 = new char[]{'a', 'c', 't'}; 같이 사용도 가능.
다차원배열
다차원 배열도 배열과 마찬가지로 만들 수 있다.
2차원인데 행, 열 각각 다른 타입을 지정하는건 불가능하다. 마찬가지로 new를 통한 방법과 초기화하는 방법이 있다.
** 2차원 배열의 경우 for each 문을 사용할 때 1차원 배열을 하나 떼오는 것이기 때문에 for(int[] arr : arr2)같이 써줘야한다.(대충 int[] 타입의 1차원 배열을 떼온다고 생각하면 된다) **
2차원 배열의 경우, 각 행마다 길이가 다른 가변 배열을 만들수도 있다.
주로 사용하는 메소드
예시로 사용하는 변수 => int[] arr1 = {1, 5, 4, 3, 2};
메소드 이름 | 사용 예시 | 설명 |
length | arr1.length | 배열길이 출력함수 다차원배열에서는 맨 앞의 수를 출력한다.(arr[2][3]이면 2) |
리스트(List)
배열과 비슷하게 여러 데이터를 담을 수 있는 자료형이다.
ArrayList l1 = new ArrayList();
ArrayList l2 = new ArrayList(4); // 4=initialCapacity, 초기용량(이것보다 많이 들어가는건 상관없음)
ArrayList<String> l3 = new ArrayList<>(); // <>는 앞의 String과 동일하게 암묵적으로 인정된다.
같이 만들 수 있다.
주로 사용하는 메소드
예시로 사용하는 변수 => ArrayList l1 = new ArrayList()
메소드 이름 | 사용 예시 | 설명 |
add | l1.add(2); l1.add("test"); l1.add(0, 56); [56, 2, "test"]가 나온다. |
리스트 마지막에 해당 데이터 추가 add(추가할 데이터값), add(추가할 위치(인덱스), 값) 같이 사용가능 |
get | l1.get(0); 2가 나온다. |
get(인덱스번호)로 해당 인덱스의 값을 가져온다. 리스트 자체에 영향은 없다. 리스트 바깥의 인덱스번호 입력시 에러. |
size | l1.size() | 리스트 크기를 반환 |
remove | l1.remove(1); l1.remove(Integer.valueOf(2); l1.remove("test"); |
remove(인덱스번호)로 해당 인덱스의 값을 지우거나, Integer.valueOf()로 리스트 내의 지우고자 하는 숫자값을 지울수도 있다.(문자열은 그냥 쓰면 지워짐) |
clear | l1.clear() []이 나온다. |
빈 리스트로 만듦 |
sort | l1.sort(Comparator.naturalOrder()); // 오름차순 l1.sort(Comparator.reverseOrder()); // 내림차순 |
순서를 정렬하는 함수 |
contains | l1.contains(2); l1.contains("study"); |
리스트가 해당 값을 갖고있는지 boolean값으로 반환 |
indexOf | l1.indexOf("test"); | 해당 값의 인덱스번호를 반환 |
맵(Map)
key, value 형태로 데이터를 저장하는 자료형이다. (파이썬의 딕션과 비슷) 킷값을 통해 접근하므로 맵 내부의 쌍들의 순서는 중요치 않다.
HashMap h1 = new HashMap();
HashMap h2 = new HashMap(4);; // 4=initialCapacity, 초기용량(이것보다 많이 들어가는건 상관없음)
HashMap<String, Integer> h3 = new HashMap<>();; // <>는 앞의 String, Integer과 동일하게 암묵적으로 인정된다.
같이 만들 수 있다.
주로 사용하는 메소드
예시로 사용하는 변수 => HashMap h1 = new HashMap()
메소드 이름 | 사용 예시 | 설명 |
put | h1.put("apple", 3000); h1.put(123, "banana"); |
앞이 key, 뒤가 value의 한쌍으로 들어간다. |
get | h1.get("kiwi"); h1.get("apple"); |
해당 key에 매칭되는 value를 반환한다. 없을경우 null을 반환한다. |
size | h1.size(); | map의 크기 반환(한 쌍이 하나) |
remove | h1.remove("kiwi"); h1.remove("apple"); |
해당 key에 매칭되는 쌍을 삭제한다. 없을경우 null을 반환한다.(map은 변화없음) |
containsKey | h1.containsKey("kiwi"); h1.containsKey("apple"); |
map에 해당 key가 있는지를 boolean으로 반환 |
https://nukoori.tistory.com/35
제네릭스(Generics)
자료형을 명시적으로 지정해주는 것이다. 제네릭스를 이용하지 않을경우 어떤 타입이든 Map이나 List에 들어갈 수 있는데 자료형을 제한해서 저것만 들어가도록 하는 것이다. 안전성을 높여주고 형변환을 줄여준다.
<>을 써서 만든다. 앞에 명시해주면 뒤에 <>는 안써도 암묵적으로 인정된다.