쉽게 쉽게

배열 본문

개발공부/Java

배열

곱마2 2023. 3. 14. 16:00
반응형

이 글은 '자바의 정석'의 내용을 기반으로 공부한 내용을 덧붙인 글입니다.


1. 배열이란?

배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

2. 배열의 복사

배열은 한번 생성하면 길이를 변경할 수 없기 때문에 큰 배열을 생성하고 이전 배열의 내용을 복사해야 한다.

 

★ 배열을 복사하는 방법

자바에서 객체를 복사하는 방법으로는 깊은 복사와 얕은 복사가 있다.

깊은 복사는 객체의 실제값을 새로운 객체로 복사하는 것이고 얕은 복사는 단순히 객체의 주소 값만을 복사하는 것이다.

얕은 복사는 여러 객체가 같은 주소를 참조하기 때문에 하나의 값을 변경해 버리면 다른 대상의 값 또한 바뀌어 버리는 문제가 발생한다.

public class Array_Copy1{
    public static void main(String[] args)  {
        int[] a = { 1, 2, 3, 4 };
        int[] b = a;
    }
}

위에는 얕은 복사의 예시이다.

여기서 a의 값을 변경하면 b도 같은 주소를 참조하고 있기 때문에 동일하게 값이 변경된다.

public class Array_Copy2{
    public static void main(String[] args)  {
        int[] a = { 1, 2, 3, 4 };
        int[] b = new int[a.length]; 
        for (int i = 0; i < a.length; i++) {
            b[i] = a[i];
        }
    }
}

하지만 깊은 복사의 경우 실제로 대상이 두 개가 생겨 새로운 값을 부여할 수 있다.

a에 값을 추가하거나 b에서 제거하여도 각각의 결과가 나타난다.

단 한 객체로 할 수 있는 일을 여러 개로 나눠서 한다면 메모리 측면에서 비효율적이게 된다.

 

정리하면

얕은 복사는 복사된 배열이나 원본배열이 변경될 때 서로 간의 값이 같이 변경된다.
깊은 복사는 복사된 배열이나 원본배열이 변경될 때 서로 간의 값은 바뀌지 않는다.

 

★ 깊은 복사의 방법

(1) for문을 이용해서 배열을 복사

int[] arr = new int[5];
int[] tmp = new int[arr.length*2];
for(int i = 0; i < arr.length; i++){
    tmp[i] = arr[i];
    }
arr = tmp; // 참조변수 arr이 새로운 배열을 가르키게 한다.    

(2) System.arraycopy()를 이용한 배열의 복사

System.arraycopy(배열1, 배열1 인덱스, 배열2, 배열2 인덱스, 복사할 데이터 개수)

배열 1 [인덱스]부터 데이터 개수만큼 복사해서 배열 2 [인덱스]부터 붙여 넣는다.

 

(3) Object.clone()

 int[] a = { 1, 2, 3, 4 };
 int[] b = a.clone();

가장 보편적인 깊은 복사 방법이다.

 

(4) Arrays.copyOf()

int[] a = { 1, 2, 3, 4 };
int[] b = Arrays.copyOf(배열(a), 복사개수(a.length));

Arrays.copyOf()를 사용하면 배열의 시작점 ~ 원하는 length까지 배열의 깊은 복사를 할 수 있다.

 

(5) Arrays.copyOf()

 int[] a = { 1, 2, 3, 4 };
 int[] b = Arrays.copyOfRange(배열(a), 복사시작점(1), 복사개수(a.length));

Arrays.copyOfRange() 메서드는 복사할 배열의 시작점(인덱스)도 지정할 수 있습니다.

3. String 배열

String클래스는 char배열에 기능(메서드)을 추가한 것이다.

★ String클래스의 주요 메서드

charAt(index) 
문자열에서 ()해당하는 문자 반환

length() 
문자열 길이 반환

substring(from to) 
from부터 to에 있는 문자열 반환(범위 끝 포함x)

equals() 
문자열 내용이 동일한지 비교, 값비교

equalsIgnoreCase() 
대소문자 구분없이 비교

toCharArray() 
문자배열로 변환(char배열로 전환)

compareTo(str) 
문자열과 사전순서로 비교 , 같으면 0, 이전이면 음수, 이후면 양수
int I = “aaa”.compareTo(“aaa”) = 0
int I = “aaa”.compareTo(“bbb”) = -1
int I = “bbb”.compareTo(“aaa”) = 1

concat(str)
문자열을 뒤 덧붙인다

boolean contains()
저장된 문자열이 포함됐는지 검사
s = “abcd”
t = s.contains(“bc”) = true

boolean endsWith()
지정된 문자열로 끝나는지 검사

boolean startsWith()
지정된 문자열로 시작하는지 검사

indexof(ch)
주어진 문자가 문자열에 존재하는지 확인하여 위치를 알려준다.
없으면 -1

indexof(ch, pos)
주어진 문자가 문자열에 존재하는지 지정된 위치부터 확인하여 위치를 알려준다.
없으면 -1

indexof(str)
주어진 문자열이 존재하는지 확인하여 위치를 알려준다
없으면 -1

lastIndexof(ch)
지정된 문자를 문자열의 오른쪽 끝에서부터 찾아서 위치를 알려준다.
없으면 -1

lastIndexof(str)
지정된 문자열을 문자열의 오른쪽 끝에서부터 찾아서 위치를 알려준다.
없으면 -1

replace(old, new)
문자열 중 문자를 새로운 문자로 바꿔 반환, 문자열도 가능

replaceAll(old, new)
지정된 문자열 중 일치하는 모든 문자를 새로운 문자로 바꿔 반환

replaceFirst(old, new)
지정된 문자열 중 일치하는 첫 번째 문자를 새로운 문자로 바꿔 반환

string[] split(regex)
문자열을 지정된 분리자로 나누어 문자열 배열에 반환

string[] split(regex, limit)
문자열을 지정된 분리자로 나누어 문자열 배열에 반환, 단 문자열 전체를 지정(하나씩 저장되다가 남은 것은 마지막 배열에 몰빵되어 저장됨)

join(regex)
지정된 문자로 결합, split()반대 (단 java8버전에서만 사용가능)

toLowerCase(), toUpperCase()
모든 문자열 소문자, 대문자로 반환

trim()
문자열 왼쪽 끝과 오른쪽 끝에 있는 공백제거(중간은 x)

static string valueOf(boolean b)
static string valueOf(char c)
static string valueOf(int i)
static string valueOf(long l)
static string valueOf(float f)
static string valueOf(double d)
static string valueOf(object o)
string.valueOf()
지정된 값을 문자열로 변환하여 반환

(Byte,Short,Integer,Long,Float,Double).valueOf()은 지정된 래퍼클래스로 변환

 

공부하면서 참고한 블로그입니다.

https://coding-factory.tistory.com/548

 

[Java] 자바 배열을 복사하는 다양한 방법 (깊은복사, 얕은복사)

자바에서 객체를 복사하는 유형으로 깊은 복사와 얕은 복사가 있습니다. 깊은 복사의 경우 객체의 실제값을 새로운 객체로 복사하는 것이고 얕은 복사는 단순히 객체의 주소 값만을 복사하는

coding-factory.tistory.com

잘못된 내용이 있다면 지적부탁드립니다. 방문해주셔서 감사합니다.

 

 

반응형

'개발공부 > Java' 카테고리의 다른 글

객체지향언어(캡슐화, 다형성)  (0) 2023.03.17
객체지향언어(특징, 추상화, 상속)  (0) 2023.03.16
연산자  (0) 2023.03.14
변수  (0) 2023.03.13
자바의 특징  (0) 2023.03.12