[Java] 참조 자료형 - 배열, 문자열(String)

Geehyun(장지현)·2024년 1월 22일
0

Java

목록 보기
4/12
post-thumbnail

참조 자료형

Reference Type으로 값 자체를 저장하는게 아닌, 해당 값이 올라가있는 메모리의 주소를 저장하여 해당 주소를 참조해오는 타입입니다.

참조 자료형의 경우
참조자료형 변수명 = new 참조자료형()의 형태로 생성합니다.

실제 데이터는 힙 영역에 저장되어있고, 해당 주소를 스택에 저장해놓는 방식입니다.

Java에서는 8개의 기본 자료형 이외에는 모두 참조 자료형입니다.
대표적인 참조 자료형에는, 배열(array), 클래스(class), 인터페이스(interface) 등이 있습니다.

배열

  • 배열은 동일한 자료형을 묶어 저장하는 참조 자료형 입니다.
    배열이란 순서(index)를 갖고 저장된 자료형으로 순서는 0부터 시작 합니다.
  • 생성할 때 배열의 크기를 지정해야하며, 한번 크기를 지정하면 변경할 수 없습니다.

1차원 배열 생성하기

1. 배열 선언하기
배열을 선언할 때는, 해당 배열에 들어갈 자료형도 함께 선언해줘야하며, 해당 자료형 외 값은 배열에 들어올 수 없습니다.

//배열 선언법1
자료형[] a;

//배열 선언법2 : 요즘에는 자주 안쓰는 방식
자료형 a[];

2. 배열 객체 생성하기
배열 객체를 생성할 때는 new라는 키워드로 생성할 수 있으며,

  • 배열 선언과 객체 생성을 한번에 할 수도
  • 나눠서 할 수도 있습니다.
//선언과 객체 생성 한번에 하기
자료형[] a = new 자료형[배열의 길이];

//선언 따로 객체 생성 따로 하기
자료형[] a;
a = new int[배열의 길이];

💡 배열 객체의 저장 방식
1차원 배열 저장방식
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차원 배열이란 배열 안 값으로 배열을 넣은 것을 의미합니다.
2차원 배열 이해하기

1. 배열 선언하기
1차원 배열과 마찬가지로 해당 배열에 들어갈 자료형과 함께 선언해줍니다.
차이점은 [][]으로 2차원 배열임을 선언해줌이 다릅니다.

자료형 [][] 변수명;

💡 배열 선언 방법은 한가지가 아닐텐데?
배열 선언의 경우, 자료형 변수명[][], 자료형 [] 변수명 [] 등으로 선언할 수도 있지만, 해당 방법은 권장되지 않으므로 설명하지 않겠습니다.

2. 배열 객체 생성하기
또한 마찬가지로 new 키워드를 이용해서 배열 객체를 생성해줍니다.

  • 한번에 2차원 배열의 행/열 성분 객체 생성도 가능하고
  • 배열의 행 따로 열 따로 객체 생성도 가능합니다. (이 경우 행 성분을 먼저 생성 후 안에 열 성분을 대입해주는 방식입니다.)
//한번에 배열 객체 생성하기
자료형 [][] 변수명 = new 자료형 [행 개수][열 개수];

// 행 따로 열 따로 객체 생성하기
자료형 [][] 변수명 = new 자료형 [행 개수][];

변수명[0] = new 자료형 [열개수];
변수명[1] = new 자료형 [열개수];
.
.
.

2차원 배열의 저장 방식
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);
}

for-Each
위 처럼 변수에 각 배열의 원소를 담아 반복문을 실행합니다.

문자열(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 프로그램 입분서 자바 완전 정복 - 김동형
위 책을 공부하며 작성하고 있습니다!

profile
개발자를 꿈꾸는 병아리 (블로그 이전 준비중 입니다.)

0개의 댓글