일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- abstract
- array
- ArrayList
- Class
- collection
- database
- db
- DDL
- default
- DML
- Exception
- Generic
- HashSet
- Interface
- Java
- Java 입문
- java 자료형
- java 클래스
- JavaBean
- javabeans
- JAVA의 특징
- LinkedList
- linkedset
- list
- mariadb
- Private
- protected
- public
- RuntimeException
- set
- Today
- Total
GeehDev
[Java] 참조 자료형 - 배열, 문자열(String) 본문
참조 자료형
Reference Type
으로 값 자체를 저장하는게 아닌, 해당 값이 올라가있는 메모리의 주소를 저장하여 해당 주소를 참조해오는 타입입니다.
참조 자료형의 경우참조자료형 변수명 = new 참조자료형()
의 형태로 생성합니다.
실제 데이터는 힙 영역에 저장되어있고, 해당 주소를 스택에 저장해놓는 방식입니다.
Java에서는 8개의 기본 자료형 이외에는 모두 참조 자료형입니다.
대표적인 참조 자료형에는, 배열(array), 클래스(class), 인터페이스(interface) 등이 있습니다.
배열
- 배열은 동일한 자료형을 묶어 저장하는 참조 자료형 입니다.
배열이란 순서(index)를 갖고 저장된 자료형으로 순서는 0부터 시작 합니다. - 생성할 때 배열의 크기를 지정해야하며, 한번 크기를 지정하면 변경할 수 없습니다.
1차원 배열 생성하기
1. 배열 선언하기
배열을 선언할 때는, 해당 배열에 들어갈 자료형도 함께 선언해줘야하며, 해당 자료형 외 값은 배열에 들어올 수 없습니다.
//배열 선언법1
자료형[] a;
//배열 선언법2 : 요즘에는 자주 안쓰는 방식
자료형 a[];
2. 배열 객체 생성하기
배열 객체를 생성할 때는 new
라는 키워드로 생성할 수 있으며,
- 배열 선언과 객체 생성을 한번에 할 수도
- 나눠서 할 수도 있습니다.
//선언과 객체 생성 한번에 하기 자료형[] a = new 자료형[배열의 길이]; //선언 따로 객체 생성 따로 하기 자료형[] a; a = new int[배열의 길이];
💡 배열 객체의 저장 방식
int[] a = new int[3];
식으로 배열객체가 생성되었을 때 스택영역에 해당 배열의 실제 값이 저장된 힙 영역의 주소값을 저장하고, 해당 주소값 기준으로 힙영역에서 값을 참조해오는 방식입니다.
3. 값 할당하기
생성한 배열 객체에 값을 할당할 때는
- 각 배열의 `index`로 하나씩 할당해주거나
- 객체 생성과 동시에 `{}` 안에 값을 넣어 대입해줄 수 있고,
- {}안에 값을 넣어 바로 배열 선언시 함께 대입해줄 수도 있습니다.
//값 하나씩 할당하기
a[0] = 값;
a[1] = 값;
// 객체 생성과 함께 값 대입하기
a = new int[]{값, 값, 값 ...};
// 값만 바로 대입
int[] a = {값, 값, 값 ...};
💡 {} 이용해서 값 대입하는 두 방식의 차이점
// 객체 생성과 함께 값 대입하기 int[] a = new int[배열의 길이]{값, 값, 값 ...}; //O int[] a; a = new int[]{값, 값, 값 ...}; //O // 값만 바로 대입 int[] a = {값, 값, 값 ...}; //O int[] a; a = {값, 값, 값 ...}; //X
위 코드 처럼 {값}으로만 값을 대입하는 경우 객체 선언과 대입을 분리할 수 없지만 객체생성과 값할당을 같이하는 경우 객체 선언 부분과 분리해서 작성이 가능합니다.
2차원 배열 생성하기
2차원 배열이란 배열 안 값으로 배열을 넣은 것을 의미합니다.
1. 배열 선언하기
1차원 배열과 마찬가지로 해당 배열에 들어갈 자료형과 함께 선언해줍니다.
차이점은 [][]
으로 2차원 배열임을 선언해줌이 다릅니다.
자료형 [][] 변수명;
💡 배열 선언 방법은 한가지가 아닐텐데?
배열 선언의 경우, 자료형 변수명[][], 자료형 [] 변수명 [] 등으로 선언할 수도 있지만, 해당 방법은 권장되지 않으므로 설명하지 않겠습니다.
2. 배열 객체 생성하기
또한 마찬가지로 new
키워드를 이용해서 배열 객체를 생성해줍니다.
- 한번에 2차원 배열의 행/열 성분 객체 생성도 가능하고
- 배열의 행 따로 열 따로 객체 생성도 가능합니다. (이 경우 행 성분을 먼저 생성 후 안에 열 성분을 대입해주는 방식입니다.)
//한번에 배열 객체 생성하기 자료형 [][] 변수명 = new 자료형 [행 개수][열 개수]; // 행 따로 열 따로 객체 생성하기 자료형 [][] 변수명 = new 자료형 [행 개수][]; 변수명[0] = new 자료형 [열개수]; 변수명[1] = new 자료형 [열개수]; . . .
💡2차원 배열의 저장 방식
2차원 배열도 마찬가지로 배열 객체가 생성될 때 스택 영역에 해당 배열이 저장되어있는 힙 영역의 주소가 저장되며, 2차원 배열의 경우 해당 휩 저장소에는 각 열 성분의 값들이 저장되어있는 주소가 저장되며 해당 주소를 참조해서 가져옵니다.
3. 값 할당하기
생성한 배열에 값을 할당하는 때는
- 각 배열의 index로 하나씩 할당해주거나
- 객체 생성과 동시에 {} 안에 값을 넣어 대입해줄 수 있고,
- {}안에 값을 넣어 바로 배열 선언시 함께 대입해줄 수도 있습니다
//값 하나씩 할당하기
a[0][1] = 값;
a[0][2] = 값;
// 객체 생성과 함께 값 대입하기
a = new int[][]{{값, 값, 값 ...}, {값, 값, 값 ...}...};
// 값만 바로 대입
int[][] a = {{값, 값, 값 ...}, {값, 값, 값 ...}...};;
💡1차원이든 2차원이든 다른 몇차원이든...
여기까지 보면 알 수 있다시피, 배열을 생성할 때는 1차원이든, 2차원이든
1. 배열을 선언한다. 선언할때는 자료형과 함께 선언하고 [] 개수로 몇차원인지 구분한다.자료형[] 변수명;
2. 객체를 생성한다. 생성할 때는 각 배열의 길이도 함께 작성한다.new 변수명 = 자료형[배열의 길이]; 또는 자료형[] 변수명 = new 자료형[배열의 길이];
3. 값을 할당한다. 각 배열의 인덱스로 접근해 할당하거나, 통으로 할당한다.변수명[인덱스] = 값; 또는 변수명 = new 자료형[배열의 길이] {값, 값 ...}; 또는 자료형[] 변수명 = {값, 값 ...};
for-Each
배열의 원소들을 하나씩 꺼내서 특정 명령을 수행하는 반복문입니다.for-Each
문의 경우 배열 외에도 집합 객체에서 사용할 수 있습니다.
//사용법
for(자료형 변수명 : 배열명) {
명령문;
}
//사용예시
int[] arr = {1,2,3,4,5,6};
for(int i : arr) {
System.out.println(i);
}
위 처럼 변수에 각 배열의 원소를 담아 반복문을 실행합니다.
문자열(Strigng)
문자열을 저장하는 클래스이며,
문자열을 입력할 때는 String 변수명 = "문자열"
으로 ""
쌍따옴표 안에 문자열을 작성해야합니다.
문자열 객체 생성하기
//첫번째 방법
String 변수명 = new string("안녕하세요");
//두번째 방법 - 주로 이 방법으로 사용
String 변수명 = "안녕하세요";
두 가지 방법 모두 사용가능 하지만, String 변수명 = "문자열"
이 더 간단하여 주로 이용됩니다.
문자열 객체 특징
1. 한 번 정의된 문자열은 변경할 수 없습니다.
다만 해당 변수에 다른 값은 문자열을 할당하게 되면 기존 객체를 버리고 새로운 문자열로 객체를 새로 생성해낸다.
2. 문자열 리터럴을 바로 입력해 사용할 때 (위 두번째 방식) 같은 문자열까리는 객체를 공유합니다.
String text1 = new String("안녕");
String text2 = "안녕";
String text3 = "안녕";
new
키워드를 쓰지 않고 바로 문자열 리터럴을 이용해 할당한 경우 두 문자열깔리는 같은 객체를 공유합니다.
문자열의 연산
문자열 끼리+
연산
두 문자열이 합쳐집니다. concat()
메서드와 유사합니다.
//사용예시
String str = "안녕" + "나 피자 먹어러가!!";
System.out.println(str); // "안녕 나 피자 먹으러가!"
다른 기본 자료형과의 연산
기본자료형과 문자열이 섞여서 연산되어야할 경우 문자열과 계산되는 자료형은 자동형변환되어 문자열로 계산됩니다.
System.out.println(1+"안녕"); // 결과 = 1안녕
System.out.println(1 + "안녕" + 2); // 결과 = 1안녕2
System.out.println(1 + 2 + 안녕 ); //3안녕
문자열과 섞여있더라도 연산 순서에 따라 먼저 연산되는 부분에 문자열이 포함되어있지 않다면 정상적으로 연산 됩니다.
주요 메서드
메서드 | 설명 | 예시 |
length() |
문자열의 길이를 반환합니다. | str.length() |
charAt() |
인덱스 위치에의 문자를 반환합니다. | str.charAt(인덱스번호) |
indexOf() |
문자열에 포함된 문자 또는 문자열의 위치를 앞에서부터 탐색해서 인덱스값을 반환합니다. 문자열 내 찾는 값이 여러개 있어도 가장 처음 만난 위치만 반환합니다. |
str.indexOf(문자 또는 문자열) |
lastIndexOf() |
indexOf() 와 동일하지만 문자열의 뒤에서부터 탐색합니다. |
str.lastIndexOf(문자 또는 문자열) |
String.valueOf() |
기본 자료형의 값들을 문자열로 변환하여 반환합니다. | String.valueOf(변환할 값) |
concat() |
두 문자열을 연결하여 반환해줍니다. | str.concat(str2) |
getBytes() |
문자열을 byte[]로 변환한 값을 반환해줍니다. | str.getBytes() |
toCharArray() |
문자열을 char[]로 변환한 값을 반환해줍니다. | str.toCharArray() |
toLowerCase() |
문자열에서 영문을 모두 소문자로 바꾼 값을 반환해줍니다. | str.toLowerCase() |
toUpperCase() |
문자열에서 영문을 모두 대문자로 바꾼 값을 반환해줍니다. | str.toUpperCase() |
replace() |
문자열에서 특정 문자를 다른 특정 문자로 교체한 값을 반환해줍니다. | str.replace(바꿀문자, 대체할 문자) |
substring() |
시작인덱스부터 종료인덱스 번호 전까지 문자열을 잘라 반환합니다. 종료인덱스 미입력시 해당 문자열의 끝까지 잘라 반환합니다. |
str.substring(시작인텍스, 종료인텍스-선택) |
split() |
특정 구분자 기준으로 문자열을 잘라 배열로 반환받습니다. 구분자는 '|'를 기호로 여러개 사용가능하며, 최대분할개수를 지정할 수 있습니다.(선택) |
str.split(구분자, 최대분할개수 - 선택) |
trim() |
문자열의 앞뒤 공백을 제거합니다. | str.trim() |
equals() |
두 문자열의 실제 내용(휩에 저장된 실제 내용)을 비교하여 boolean값을 반홥합니다. | str.equals(str2) |
equalsIgnoreCase() |
두 문자열의 실제 내용(휩에 저장된 실제 내용)을 비교할 떄 대소문자 구분없이 비교하여 boolean 값을 반환합니다. | str.equalsIgnoreCase(str2) |
참고
Do it! 진짜 개발자가 되는 Java 프로그램 입분서 자바 완전 정복 - 김동형
위 책을 공부하며 작성하고 있습니다!
'Study > Java' 카테고리의 다른 글
[Java] 클래스의 상속과 다형성 (0) | 2024.09.15 |
---|---|
[Java] 클래스의 기본구조 (0) | 2024.09.15 |
[Java] 변수 선언과 기본 자료형 (2) | 2024.09.08 |
[Java] 연산자와 제어문 (1) | 2024.09.08 |
[Java] Java의 기본 개요 (1) | 2024.09.08 |