자바(Java)

자바 자료형(Data type) + 자료구조

넉우리 2023. 2. 4. 22:53
반응형

자료형은 아주 기초적인 개념이라 넘어가려고 했지만, 새로이 자바를 공부하면서 생각보다 모르는 부분이 많았기에 따로 정리해두려고 한다.

 

자료형(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가지가 있다.

  1.  String s1 = "test for study"; String s2 = "test for study";
  2.  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라는 클래스를 제공해준다고 한다. 

만드는 방법은 여러가지가 있다.

  1.  int[] arr1 = {1, 5, 4, 3, 2}; String arr2 = {"Hi", "123", "Developer"};
  2.  char[] arr3 = new char[3]; -> 배열 size는 있으나 무얼 넣을지 정하지 않았을 경우 사용.
  3.  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

 

[자료구조] 자바 해시 맵(HashMap)

Map은 키(Key)와 값(Value) 으로 이루어진 Entry객체 데이터를 보관하는 자료구조이다. java.util안에 존재한다. 순서를 유지하지 않는다. Key는 중복을 허용하지 않지만, Value는 가능하다. 해시 맵(HashMap)

nukoori.tistory.com


제네릭스(Generics)

자료형을 명시적으로 지정해주는 것이다. 제네릭스를 이용하지 않을경우 어떤 타입이든 Map이나 List에 들어갈 수 있는데 자료형을 제한해서 저것만 들어가도록 하는 것이다. 안전성을 높여주고 형변환을 줄여준다.

 

 

 

<>을 써서 만든다. 앞에 명시해주면 뒤에 <>는 안써도 암묵적으로 인정된다.

반응형