- 자바 기본 자료형을 제외한 자료형들을 의미한다.
- 참조형(Reference Type)은 자바에서의 최상위 클래스인 java.lang.Object 클래스를 상속하는 모든 클래스들을 말한다.
- 원본 데이터의 메모리 주소만 지니며, 모든 참조형의 크기는 동일하다. ( JVM에서는 8바이트를 할당한다. )
- 주소를 참조하는 자료형으로써 null 값으로 초기화하여 사용할 수 있다.
- 참조 자료형은 메모리의 Heap 영역에 저장되며, 반대로 기본 자료형은 Stack 영역에 저장된다.
문자열(String)
String str1 = "Hello World!";
- 문자(Char)들로 이루어진 집합이자 문자열을 나타내는 자료형이다.
- C언어에서는 문자열을 나타내기 위해 char형 배열을 사용한다.
- 기본 자료형과 같이 리터럴 표기 방식을 사용하는 것이 좋으며, 가독성이 좋고 컴파일할 때 최적화에 도움을 준다.
주요 내장 메소드
equals
String s1 = "Hello World!";
String s2 = "See you again!";
String s3 = "Hello World!";
System.out.println(s1.equlas(s2)); // false 출력
System.out.println(s1.equlas(s3)); // true 출력
System.out.println(s1 == s3); // false 출력
- 문자열 2개의 값을 비교하여 그 값이 같은 지를 비교한 뒤 그 결과 값을 반환해 준다.
- 문자열의 값을 비교하고자 한다면 반드시 equals를 사용하며, 만약 비교연산자(==)를 사용하여 값을 비교하고자 한다면 다른 결과값이 나올 수 있다. 이는 값을 비교하는 것이 아닌 객체가 같은 자료형인지를 판별할 때 사용되는 연산자이기 때문이다.
indexOf
String s1 = "Hello World!";
System.out.println(s1.indexOf("o")); // 4 출력
- 문자열에서 특정 문자열이 시작되는 위치(즉, 인덱스 값)를 리턴한다.
- 자바에서는 모든 인덱스 0부터 시작하기 때문에 예시를 출력하면 "5"가 아닌 "4"가 출력된다.
replace
String s1 = "Hello World!";
String s2 = s1.replace("World", "Seltol")
System.out.println(s2); // Hello Seltol 출력
- 문자열에서 특정 문자열과 매칭되는 첫 문자열을 변경할 때 사용한다.
replaceAll
String s1 = "Hello World!";
String s2 = s1.replaceAll("World", "Seltol")
System.out.println(s2); // Hello Seltol 출력
- 문자열에서 특정 문자열과 같은 문자열들을 모두 변경할 때 사용한다.
substring
String s1 = "Hello World!";
System.out.println(s1.substring(0, 5); // Hello 출력
- 문자열에서 부분적으로 특정 문자열을 뽑아낼 때 사용한다.
- 문자열에서 조건으로 주어진 시작 위치값에서 끝 위치 이전의 문자까지 출력된다.
toUpperCase
String s1 = "Hello World!";
System.out.println(s1.toUpperCase()); // HELLO WORLD! 출력
- 문자열을 모두 대문자로 변경할 때 사용한다.
- 반대로 모두 소문자를 변경하고자 할 때는 toLowerCase를 사용한다.
StringBuffer
StringBuffer sb = new StringBuffer(); // StringBuffer 객체 sb 생성
sb.append("Hello World!");
- 문자열을 추가하거나 변경할 때 주로 사용하는 자료형이다.
주요 내장 메소드
append
StringBuffer sb = new StringBuffer(); // StringBuffer 객체 sb 생성
sb.append("Hello");
System.out.println(sb); // Hello 출력
sb.append("World");
System.out.println(sb); // HelloWorld 출력
- 기존 문자열 뒷부분에 문자열을 계속해서 추가해 나갈 수 있다.
- toString() 메서드를 사용하면 StringBuffer의 데이터를 String 자료형으로 변경할 수도 있다.
// String 자료형으로 변경
String sb = "Hello";
sb += "World";
System.out.println(sb); // HelloWorld 출력
- StringBuffer 자료형은 객체를 한 번만 생성하는 데에 반해 String 자료형으로 동일한 기능을 수행한다면 추가될 때마다 새로운 객체를 생성하여 리턴해준다. 이는 메모리에 대한 할당을 다시 하는 것으로 기존 영역과는 새로운 영역에 할당된다.
- StringBuffer 자료형은 String 자료형을 사용할 때보다 메모리 사용량도 많고 속도도 느려 문자열을 추가하거나 변경하는 작업이 많은 경우 사용하면 유리하다. 반대로 적은 경우에는 String을 사용하는 것이 유리하다.
insert
StringBuffer sb = new StringBuffer(); // StringBuffer 객체 sb 생성
sb.append("Hello");
sb.insert(0, "World ");
System.out.println(sb.toString()); // World Hello 출력
- 특정 위치에 원하는 문자열을 삽입할 때 사용한다.
배열(Array)
- 자료형의 종류가 아니라 하나의 집합을 의미하며, 많은 수의 데이터를 담을 수 있다.
- 사용방법은 자료형 바로 옆에 [ ] 기호를 붙여준다.
int[] nums = {2, 4, 6, 8, 10};
String[] arrStr = {"Seltol", "Tech"};
리스트(List)
- 배열과 같이 여러 데이터를 담을 수 있는 자료형이다.
- 배열과 가장 큰 차이점은 크기가 유동적으로 변한다는 데에 있다.
즉, 배열과 달리 데이터가 많아질수록 리스트의 크기는 커진다.
- 리스트 자료형의 종류 : ArrayList, Vector, LinkedList 등
주요 내장 메소드
append
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList weight = new ArrayList();
weight.add(67);
weight.add("80");
weight.add(52);
System.out.println("weight = " + weight); // weight = [67, 80, 52] 출력
weight.add(1, 72); // Index 1의 위치에 값을 추가
System.out.println("weight = " + weight); // weight = [67, 72, 80, 52] 출력
}
}
- ArrayList에 요소값을 추가할 수 있다.
get
(... 생략 ...)
System.out.println(weight.get(0)); // 67 출력
System.out.println(weight.get(2)); // 52 출력
- 특정 인덱스의 값을 추출할 수 있다.
size
(... 생략 ...)
System.out.println(weight.size()); // 3 출력
- ArrayList의 요소 개수를 리턴한다.
remove
/*
remove의 메서드는 2가지 방식이 존재
1. remove(객체)
2. remove(인덱스)
*/
// remove(객체)
(... 생략 ...)
System.out.println(weight.remove(Integer.valueOf(67))); // true 출력
// remove(인덱스)
System.out.println(weight.remove(Integer.valueOf(0))); // 80 출력
- remove(객체)의 경우, 해당 항목을 삭제 후 true 또는 false로 리턴한다.
- remove(인덱스)의 경우, 인덱스에 해당하는 항목을 삭제하고 그 항목을 리턴한다.
clear
(... 생략 ...)
weight.clear();
System.out.println("weight = " + weight); // weight = [] 출력
- ArrayList에 담긴 모든 요소값을 지운다.
sort
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList weight = new ArrayList();
weight.add(25);
weight.add(90);
weight.add(76);
System.out.println("weight = " + weight); // weight = [25, 90, 76] 출력
weight.sort(Comparator.naturalOrder()); // 오름차순(순방향) 정렬
System.out.println("weight = " + weight); // weight = [25, 76, 90] 출력
weight.sort(Comparator.reverseOrder()); // 내림차순(역방향) 정렬
System.out.println("weight = " + weight); // weight = [90, 76, 25] 출력
}
}
- ArrayList의 요소를 순서대로 정렬할 때 사용한다.
- Java 8 버전부터 사용할 수 있는 메소드이다.
contains
(... 생략 ...)
System.out.println(weight.contains(72); // false 출력
System.out.println(weight.contains(76); // true 출력
- ArrayList에 해당 항목이 있는지 판별해 그 결과를 boolean 자료형으로 리턴한다.
맵(Map)
- 키(key)와 값(value) 형태로 값을 저장하는 자료형이다.
- 순차적으로(Sequential) 요소값을 구하기 않고 키(key)를 이용해 값을 얻는다.
- 맵 자료형의 종류 : HashMap, LinkedHashMap, TreeMap 등
주요 내장 메소드
put
import java.util.HashMap;
public class Test{
public static void main(String[] args) {
HashMap< map = new HashMap<>();
map.put("weight", "체중");
map.put("height", "키");
map.put("name", "이름");
System.out.println("map = " + map); // map = {weight=체중, height=키, name=이름} 출력
}
}
- key와 value를 추가할 때 사용한다.
get
(... 생략 ...)
System.out.println(map.get("name")); // 이름 출력
System.out.println(map.get("age")); // null 출력
- key에 해당하는 value를 얻을 때 사용한다.
- key에 해당하는 value가 없을 경우에는 null를 리턴하며, 있는 경우 value 값을 리턴해준다.
size
(... 생략 ...)
System.out.println(map.size()); // 3 출력
- 맵 요소의 개수를 리턴한다.
remove
(... 생략 ...)
System.out.println(map.remove("name")); // 이름 출력
System.out.println(map.remove("age")); // null 출력
- 맵의 항목을 삭제하는 메서드로, 해당 key의 항목을 삭제한 후 value 값을 리턴한다.
containsKey
(... 생략 ...)
System.out.println(map.containsKey("weight")); // true 출력
System.out.println(map.containsKey("age")); // false 출력
- 맵에 해당 key가 있는 지를 참(true) 또는 거짓(false)으로 리턴한다.
제네릭스(Generics)
- 자료형을 명시적으로 지정하여, 안전하게 사용할 수 있도록 만들어 주는 기능이다.
- 자료형을 강제로 바꿀 때 생길 수 있는 캐스팅 오류를 줄일 수 있다.
사용하는 방식
ArrayList<String> pitches = new ArrayList<String>(); // 일반적인 방식
ArrayList<String> pitches = new ArrayList<>(); // 선호되는 방식
// 일반적인 방식과 같이 앞뒤에 자료형을 모두 적으면 intelliJ와 같은 IDE에서는 경고 메시지가 출력된다.
사용하지 않은 예
ArrayList name = new ArrayList();
pitches.add("홍길동");
pitches.add("고길동");
String one = (String) pitches.get(0);
String two = (String) pitches.get(1);
- 제너릭스를 사용하지 않으면 추가하는 객체는 Object 자료형으로 인식한다.
- Object 자료형은 모든 객체가 상속하고 있는 가장 기본적인 자료형이다.
- 값을 가져올 때는 Object 자료형에서 형 변환을 통해 값을 가져올 수 있다.
- 형 변환 과정에서 2개 이상의 자료형을 사용하는 경우 형변환 과정에서 오류가 발생할 수 있다.
제너릭스를 적용한 예
ArrayList<String> name = new ArrayList<>();
pitches.add("홍길동");
pitches.add("고길동");
String one = pitches.get(0);
String two = pitches.get(1);
- 제너릭스로 자료형을 선언하면 그 이후로는 형 변환의 과정이 필요 없다.
- 설정한 자료형만 추가되어야 한다는 것을 컴파일러가 이미 알기 때문에 잘못된 자료형의 값이 추가되면 에러가 발생한다.
⊙ 참고 문헌
- 마종현, 「제로베이스 백엔드 취업 파트타임 스쿨 5기:Part 01. Java 기초-Chapter 01. Java 프로그래밍-02.변수와 자료형」, 제로베이스, 2024, https://zero-base.co.kr
- 박응용, 「점프 투 자바:03장 자바의 기초 - 자료형:03-04 문자열」, 위키독스, 2024.07.11, https://wikidocs.net/205
- 박응용, 「점프 투 자바:03장 자바의 기초 - 자료형:03-05 StringBuffer」, 위키독스, 2024.07.11, https://wikidocs.net/276
- 박응용, 「점프 투 자바:03장 자바의 기초 - 자료형:03-06 배열」, 위키독스, 2024.07.11, https://wikidocs.net/206
- 박응용, 「점프 투 자바:03장 자바의 기초 - 자료형:03-07 리스트」, 위키독스, 2024.07.11, https://wikidocs.net/207
- 박응용, 「점프 투 자바:03장 자바의 기초 - 자료형:03-08 맵」, 위키독스, 2024.07.11, https://wikidocs.net/208