점프 투 자바

SUADI·2022년 4월 10일

저번 포스팅에 이어서 자료형에 대해 공부한 것을 포스팅하려고 한다. TIL

4. 자료형

(8) StringBuffer

StringBuffer은 문자열을 추가하거나 변경할 때 주로 사용하는 자료형이다. String 자료형과는 약간의 차이가 있는데 후에 알아볼 것이다.

ㄱ) append

StringBuffer으로 생성한 문자열에 append를 통해 새로 문자열을 추가할 수 있다.

StringBuffer sb = new StringBuffer(); // StringBuffer sb 객체 생성
sb.append("Happy");
sb.append(" new year!!");
String result = sb.toString(); 
System.out.println(sb); // Happy new year!! 출력

여기서 toString 메소드를 이용하면 StringBuffer에서 String 자료형으로 변경할 수 있다.

String string = "";
string += "Happy";
string += " new year!!";
System.out.println(string); // Happy new year!! 출력

이 코드는 String으로 문자열을 추가한 코드이다. 두 개의 코드의 결과는 동일하지만 내부적으로 객체가 생성되고 메모리가 사용되는 과정이 다르다.
StringBuffer의 경우 객체는 한번만 생성되고 append와 같은 메소드를 통해 생성된 객체에 추가, 변경을 해주는데 반해, String은 추가, 변경을 해줄 때마다 객체가 새로 생성이 된다. 예로 든 코드 같은 경우엔 3개의 객체가 새로 생긴 것이다.
String 자료형은 한번 객체가 생성되면 그 값을 변경할 수가 없다. 이를 immutable(공존할 수 없는)하다고 한다. StringBuffer는 반대로 값을 변경할 수 있기 때문에 mutable하다. 즉, 한번 생성된 값을 언제든 변경할 수 있다.

ㄴ) insert

insult는 특정 위치에 문자열을 삽입할 수 있다.

StringBuffer sb = new StringBuffer("Happy year!!");
sb.insert(5," new");
System.out.println(sb);

ㄷ) substring

substring은 String 자료형에서 동작했던 것과 마찬가지로 특정위치에서의 문자열을 추출해 내는 메소드이다.

StringBuffer sb = new StringBuffer("Happy new year");
System.out.println(sb.substring(0,5)); // Happy 

(9) 배열(Array)

다음은 숫자나 문자들의 모임을 표현할 수 있는 자료형이다.

int[] odd = {1,3,5,7,9};
String[] food = {"apple", "kimchi","beef"};

자료형 타입 옆에 []을 붙여 배열임을 나타낸다.
배열은 자료형의 종류가 아니라 자료형의 집합을 의미한다.
배열의 길이는 고정되어 있다.

String[] weeks = new String[7];
weeks[0] = "일";
weeks[1] = "월";
weeks[2] = "화";
weeks[3] = "수";
weeks[4] = "목";
weeks[5] = "금";
weeks[6] = "토";

배열에서 빈번히 일어나는 오류는

ArrayIndexOutOfBoundsException

인데 이는 예를 들어 배열의 크기가 7인데 8번째 값을 얻으려고 하면 나타나는 오류이다.

(10) 리스트(List)

리스트는 배열과 유사한 자료형이지만 배열보다 더 편리한 기능을 가지고 있다. 배열은 크기가 정해져 있어 7개면 8개 이상의 값을 담을 수 없는 반면 반면 리스트는 크기가 정해져 있지 않아 원하는 만큼 값을 담을 수 있다. 예를 들어 내가 매일 달리기를 하면서 달린 거리 값을 저장한다고 해보자. 달린 횟수가 정해져 있는게 아니라 어느날은 달리고 어느날은 달리지 않는다면 명확한 크기를 알 수 없기 때문에 리스트에 저장하는 것이 유용할 수 있다.
List 자료형에는 ArrayList, Vector, LinkedList 등이 있는데 이는 List 인터페이스를 상속받은 클래스들이다. 이 중 ArrayList를 가장 많이 사용하므로 ArrayList에 대해 설명할 것이다.

ㄱ) add

내가 만약 5km, 3km, 10km를 뛰었다면,

import java.util.ArrayList;

public class jog {
	public static void main(String[] args) {
    	ArrayList km = new ArrayList();
        km.add("5");
        km.add("3");
		km.add("10");
    }
}

먼저 ArrayList를 사용하려면 import를 해주어야 한다.
add는 ArrayList에 값을 추가해주는 메소드이다.
원하는 위치에 삽입하고 싶을 땐

km.add(위치, "값");

제네릭스

J2SE 5.0 버전부터는

ArrayList<String> name = new ArrayList<String>(); 

이와 같이 객체를 포함하는 자료형 타입을 명시할 것을 권고하고 있다. 제네릭스없이 코딩을 하면 정상적으로 작동하긴 하지만

Raw use of parameterized class 

'ArrayList' 명확한 타입을 명시하라고 Warning이 뜬다.

ArrayList km = new ArrayList();

자료형 타입을 명시하지 않으면 새로운 객체를 object 자료형으로 인식하게 된다. object 자료형은 모든 객체가 상속하고 있는 가장 기본적인 자료형이다.
지금 당장은 object 자료형으로 인식하고 정상적으로 동작하지만
나중에 ArrayList의 값을 가져오거나 할때 원래의 자료형으로 형변환(casting)을 해주지 않으면 에러가 나게 된다.

String one = (String) km.get(0); 
// object 자료형을 String 자료형으로 casting한다

제네릭스가 탄생한 이유 중 하나는 ArrayList는 여러 타입의 객체를 넣을 수 있기 때문에 자료형 타입을 명시하지 않으면 에러가 날 확률이 있기 때문이다.

그리고 뒷 부분의 꺽쇠는 String이라는게 앞부분에 명시되어있으므로 생략해도 좋다. 인텔리제이에선 앞 뒤 모두 적을 경우 앞에만 적으라고 Warning뜬다.

ArrayList<String> name = new ArrayList<>();

ㄴ) get

원하는 값을 추출하고 싶을 땐 get 메소드를 사용한다

System.out.println(km.get(1)); // 3 출력

ㄷ) size

ArrayList의 크기를 출력한다.

System.out.println(km.size());

ㄹ) contains

ArrayList 안에 해당값이 있는지를 판별하여 true or false를 return해준다.

System.out.println(km.contains("19")); // false

ㅁ) remove

ArrayList 안의 값을 제거해주고 어떤 parameter를 적느냐에 따라 return해주는 값이 다르다.

System.out.println(km.remove("3")); //값을 적으면 true return

System.out.println(km.remove(1));  // 인덱스를 적으면 "3"값 return

ㅂ) 배열 추가

ArrayList에 값을 추가하는 방법 중 값을 일일히 추가하는 방법도 있지만 기존에 배열이 존재한다면 배열 자체를 추가할 수도 있다.

import java.util.ArrayList;
import java.util.Arrays;

public class Sample {
    public static void main(String[] args) {
        String[] data = {"15", "5", "4"};
        ArrayList<String> km = new ArrayList<>(Arrays.asList(data));
        System.out.println(km);
    }
}

Arrays.asList() 구문으로 String 배열을 추가하였다.

ㅅ) String.join

ArrayList의 값들을 콤마로 구분하여 나누려면 어떻게 해야할까

import java.util.ArrayList;
import java.util.Arrays;

public class Sample {
    public static void main(String[] args) {
        ArrayList<String> km = new ArrayList<>(Arrays.asList("15","5","7"));

        String result = "";
        for (int i=0; i<km.size(); i++) {
            result += km.get(i);
            result += ",";
        }
        result = result.substring(0, (result.length()-1));
        System.out.println(result);
    }
}

반복문을 사용해서 각 값들을 result에 추가하고 사이사이에 ,를 넣은 다음 반복문을 빠져나와 substring으로 0번째부터 마지막에서 두번째까지를 출력하면 15,5,7이 출력된다.
이는 너무 복잡하므로 String.join(구분자,리스트객체)를 사용하면 편리하다. 콤마와 같은 구분자를 리스트의 값들 사이사이에 끼워넣는다는 의미이다.

import java.util.ArrayList;
import java.util.Arrays;

public class sample {
	public static void main(String[] args) {
    	ArrayList<String> km = new ArrayList<>(Arrays.asList("15","5","8"));
        
        String result = String.join(",", km);
		System.out.println(result);
    }
}

0개의 댓글