본문 바로가기
클라우드 활용 자바개발자 양성과정/01. JAVA 프로그래밍 언어 활용

13. 컬렉션 Collection

by moca7 2024. 7. 10.

 

ㅁ 컬렉션 매우 중요. 앞으로 배열 잘 안쓰고 컬렉션 씀.

- 너무 중요하다.

왜냐면 다수의 데이터를 관리해야 하기 때문에 그 때마다 컬렉션은 계속 따라다닐 것.

    

 

ㅁ < 제네릭 Generics >

- 클래스 내부에 사용할 타입을 클래스 외부에서 지정

 

 

public static void main(String[] args) {

 

     // Container 객체 생성시 정수값 데이터 보관

     // 기본 자료형은 제네릭으로 못 쓴다. 무조건 레퍼런스 타입. 참조자료형. = 클래스형만 쓰세요.

 

     Container<Integer> c = new Container<Integer>();

 

     c.setItem(5);

     System.out.println(c);     //    5

 

 

     // Container 객체 생성시 String 데이터 보관

 

     Container<String> c2 = new Container<String>();

 

     c2.setItem("안녕");

     System.out.println(c2);         //      안녕 ( Container 클래스의 toString() 메서드가 String.valueOf(item)을 반환 )

 

 

     // Container 객체 생성시 String[] 데이터 보관

 

     Container<String[]> c3 = new Container<String[]>();

 

     c3.setItem(new String[] {"가", "나", "다"} );

     System.out.println(Arrays.toString(c3.getItem()));       //    [가, 나, 다] 

 

 

     // 제네릭 타입을 지정하지 않는다면?

     Container c4 = new Container();

     c4.setItem("하하하"); // setItem을 나는 T 타입으로 해놨는데, 자동완성을 보면 Object로 되어 있음을 볼 수 있다.

     // Object 이기 때문에 문자열, 숫자 데이터 다 가능.

     // 즉 타입을 지정하지 않은 채로 객체를 생성하면 Object 타입으로 자동 지정됨.

     System.out.println(c4); // 하하하

 

     c4.setItem(22);

     System.out.println(c4); // 22

 

 

}

 

 

 

===================================================================

 

 

 

ㅁ < 컬렉션 >

- 자료구조를 담당하는 프레임워크(자료구조의 개념이 내장되어 있는 자바 클래스)

- 자료구조: 방대한 데이터들을 효율적, 구조적으로 관리(추가, 수정, 삭제, 조회, 정렬)할 수 있는 개념

- 프레임워크: 데이터나 기능들을 보다 쉽게 사용할 수 있도록 이미 제공됨.

 

- 배열로는 for문을 써서 복잡한 알고리즘을 내가 구현해야함.

컬렉션은 그게 다 구현되어 있어서 쓰기만 하면 됨.

 

ㅁ < 배열과 컬렉션의 차이점 >

- 배열

- 크기에 대한 제약이 많음. 크기 지정 필수, 한번 지정된 크기는 변경이 불가능하다. 

- 중간 위치에 추가하거나 삭제할 경우 - 복잡한 로직 코드를 직접 작성해야함.

- 한 타입의 데이터만 저장 가능

 

- 컬렉션

- 크기에 대한 제약이 없음. 크기 지정 필수x, 유동적으로 크기 변경됨.

- 중간 위치에 추가하거나 삭제할 경우 복잡한 로직을 짤 필요 없음 - 이미 구현되어있는 메소드 사용

- 여러 타입의 데이터를 저장할 수 있음

 

 

- 담아 두고 조회만 할 거면 배열 써도 됨.

근데 빈번하게 변경할 거면 컬렉션을 쓰는게 훨씬 더 효율적으로 관리 가능.

 

 

 

ㅁ < 컬렉션의 종류 >

 

1. List : 배열 같이 사용되는 컬렉션

- 데이터(value)만 저장 가능

- 순서 유지됨(index로써 관리됨)

- 중복 데이터 허용됨

- 하위 클래스 : ArrayList, Vector, LinkedList 외에도 더 있지만,

ArrayList만 마스터하면 됨. 벡터는 ArrayList가 나오기 전 개념에 쓰던거라 안쓴다.

링크드도 별로 안쓴다. 이것만 많이 씀.

- 벡터를 개선해서 나온게 어레이리스트. 벡터쓰면 느림. 근데 자바에서 아직 쳐내진  못했음. 쓰고있는데가 많아서.

 

 

2. Set : 집합 형태의 컬렉션

- 데이터(value)만 저장 가능

- 순서 유지되지 않음 (index의 개념이 없다)

- 중복 데이터 허용되지 않음

- 하위 클래스 : HashSet, TreeSet 외에도 더 있지만,

HashSet만 알면 됨. Set 자체가 잘 안쓰이지만 HashSet을 알아야 Map을 이해할 수 있어서.

 

 

3. Map : 객체(인스턴스)를 대신해서 사용되는 컬렉션

- 키(key)와 함께 데이터(value)를 저장

- 순서 유지되지 않음

- 중복된 키(key) 허용 안됨

- 하위 클래스 : HashMap, Hashtable, TreeMap, Properties 외에도 더 있지만,

HashMap, Properties만 기억하면 된다. 나머진 거의 안 쓰인다. 

 

 

- 어레이리스트, 해시맵 이 두 개가 제일 중요. + 프로퍼티스

 

 

ㅁ  java.util.Collection > List > ArrayList 

- 선형자료구조의 컬렉션으로 배열을 가지고 있어 데이터가 순차적으로 보관되어 관리됨

- 특징

- 순서대로 데이터(value)가 저장

- 인덱스로 각 데이터가 관리

- 중복 데이터 보관 가능

 

 

ㅁ 

import java.util.ArrayList;
import java.util.List;

public class ArrayListExample {

    public static void main(String[] args) {
        arrayListTest1();
    }

    public static void arrayListTest1() {
        // List list = new List(); List는 인터페이스라 그냥 객체를 생성할 수 없다. 
        // 대신 타입으로는 쓸 수 있다.
        List list = new ArrayList();     //     List<Object> 근데 이렇게 타입 지정안하고는 거의 안쓴다.

        list.add(10);
        list.add("안녕하세요");
        list.add(5.12);
        System.out.println(list);    //     [10, 안녕하세요, 5.12]     <- list는 참조타입. 오버라이딩 된 toString이 실행. 

        list.add(2, "안녕하세요"); // 2번 인덱스에 추가되고, 알아서 다 한칸씩 밀린다. 
        System.out.println(list); // [10, 안녕하세요, 안녕하세요, 5.12]
        // list 특성상 중복데이터 저장 가능. 
        // 이런식으로 계속 추가 가능. 별도로 크기 지정 안했음. 배열의 단점이 보완됨. 

        System.out.println(list.get(0)); // 10
        System.out.println(list.get(1)); // 안녕하세요
        System.out.println(list.get(2)); // 안녕하세요
        System.out.println(list.get(3)); // 5.12

        // System.out.println(list.get(4)); IndexOutOfBoundsException 발생
    }
}

 

 

public void arrayListTest2() {

 

     // 정수값만 저장 가능한 list 생성

     List<Integer> numList = new ArrayList<>(); // 뒤 꺽새는 똑같으면 생략 가능

 

     numList.add(1);

     numList.add(2);

     numList.add(3);

     // numList.add("안녕"); 빨간줄. Integer만 가능.

 

     System.out.println(numList);      //     [1, 2, 3]

     System.out.println("요소 갯수 : " + numList.size()); // 요소 갯수 : 3

 

     for(int i=0; i<numList.size(); i++)

          System.out.print(numList.get(i) ); // 123

 

}

 

 

public void arrayListTest3() {

 

     // 문자열만 저장가능한 list 생성

     List<String> strList = new ArrayList<>();

 

     strList.add("안녕");

     strList.add("hello");

     strList.add("bye");

     // strList.add(4); 빨간줄. 문자열만 저장 가능.

 

     System.out.println(strList);   //   [안녕, hello, bye]

 

     for(int i=0; i<strList.size(); i++) {

          System.out.print(strList.get(i));   //   안녕hellobye

     }

 

     System.out.println();

     for(String l : strList) {      //  향상된 for문은 배열, 컬렉션 등의 요소에 담겨있는 값을 반환함. strList.get(0) ... (1) ... (2)

          System.out.print(l);   //   안녕hellobye

     }

 

}

    

 

 

public void arrayListTest4() {

 

     String[] seasonArr = {"봄", "여름", "가을", "겨울"};

 

 

     // 현재 배열을 List로 변경하고자 할 경우

     // Arrays.asList(배열) : 전달된 배열을 List로 바꿔서 반환 (단, 길이 고정)

     List<String> seasonList = Arrays.asList(seasonArr);

     System.out.println(seasonList); // [봄, 여름, 가을, 겨울]

 

     //seasonList.add("계절");

     // add한 순간 에러 java.lang.UnsupportedOperationException . 추가 불가.

 

     //seasonList.remove(1);

     // remove한 순간 에러 java.lang.UnsupportedOperationException. 삭제 불가.

     // 데이터를 추가하는 것도 지우는 것도 안 됨.

 

     // asList로 배열을 List화 하면, 길이를 변경할 수 없음. Arrays.asList가 fixed size List를 반환하는 메소드라.

     // 길이 변경이 불가한 리스트. 새로운 요소 추가, 삭제 불가능.

     // 그러나 기존의 요소를 새로운 요소로 변경은 가능하다.

 

     seasonList.set(0, "Spirng");

     System.out.println(seasonList); // [Spirng, 여름, 가을, 겨울]

 

 

 

     // Arrays.asList(요소, 요소, 요소 ...) 이렇게 배열 없이 바로 List로 반환도 가능. (자료형 x)

     // 애초에 초기값을 담아둔 리스트를 만들고 싶은 경우.

     // 가변 매개변수라 요소 개수는 상관 없음.

     // 이것도 역시 고정 길이라 add, remove 불가능.

 

     List<String> carList = Arrays.asList("제네시스", "벤츠", "BMW");

     System.out.println(carList); // [제네시스, 벤츠, BMW]

 

}

 

 

 

ㅁ 

public void arrayListTest5() {

    

     // List.of(요소, 요소, ..) : 전달된 요소들을 List에 담아서 반환

     List<String> hobbyList = List.of("운동", "게임", "영화", "산책");

     System.out.println(hobbyList);

 

     // add, remove뿐 아니라 set(인덱스, 요소) 도 안됨.

     // unmodifiable list 반환. 수정도 안 됨. 불변이다.

     // 새로운 요소 추가, 삭제, 변경 모두 안 됨(오로지 조회만 가능)

 

     // 조회만 할 목적이면 이 아래 두 개 방법 사용.

     // 자유롭게 변경할 목적이면 맨 처음 방법 사용.

 

}

 

  

- 우리는 List에 문자나 숫자보단 VO객체를 주로 담게 될 거에요.

 - VO 객체. 기본생성자, 매개변수 생성자, 게터세터, 투스트링까지. 

 

 

public void arrayListTest6() {

 

List<Music> list = new ArrayList<>();

 

System.out.println("초기 list : " + list);     //     초기 list : []

 

 

// list.set(0, new Music()); 오류   <- set은 수정하는 거. 0번 인덱스 없다 지금.

 

// add(E e) : 리스트 공간 끝에 전달된 요소를 추가시켜줌

 

// list.add(new Music());

// System.out.println("초기 list : " + list); // 초기 list : [Music [title=null, artist=null]]

 

list.add(new Music("Good Bye", "박효신"));

list.add(new Music("이 밤", "양다일"));

list.add(new Music("잊혀지다", "정키"));

System.out.println("추가 후 list : " + list); // 추가 후 list : [Music [title=Good Bye, artist=박효신], Music [title=이 밤, artist=양다일], Music [title=잊혀지다, artist=정키]]

 

 

// add(int index, E e) : 리스트 내에 특정 인덱스 위치에 전달된 요소를 추가. 그냥 add(E e)하면 맨 끝에 추가.

list.add(1, new Music("진심이 담긴 노래", "케이시"));

System.out.println("추가 후 list : " + list); // 추가 후 list : [Music [title=Good Bye, artist=박효신], Music [title=진심이 담긴 노래, artist=케이시], Music [title=이 밤, artist=양다일], Music [title=잊혀지다, artist=정키]]

 

// remove(int index) : 리스트 내에 특정 인덱스 위치의 요소를 제거시켜줌

list.remove(1);

System.out.println("제거 후 list : " + list); // 제거 후 list : [Music [title=Good Bye, artist=박효신], Music [title=이 밤, artist=양다일], Music [title=잊혀지다, artist=정키]]

 

// set(int idex, E e) 리스트 내에 특정 인덱스 위치의 요소를 새로이 전달한 요소로 변경시켜줌

list.set(0, new Music("술이 달다", "에픽하이"));

System.out.println("변경 후 list : " + list); // 변경 후 list : [Music [title=술이 달다, artist=에픽하이], Music [title=이 밤, artist=양다일], Music [title=잊혀지다, artist=정키]]

 

 

// size() : 리스트 내의 요소 갯수 반환 (즉, 리스트의 사이즈)

System.out.println("list의 사이즈 : " + list.size());

System.out.println("list의 마지막 인덱스 수 : " + (list.size()-1));

 

// get(int idex) : 리스트 내의 특정 인덱스 위치의 요소를 E 타입으로 반환

System.out.println(list.get(0)); // Music [title=술이 달다, artist=에픽하이]

 

System.out.println(list.get(0).getTitle()); // 술이 달다

System.out.println(list.get(0).getArtist()); // 에픽하이

 

list.get(1).setTitle("저 밤");

System.out.println(list.get(1)); // [title=저 밤, artist=양다일]

 

System.out.println();

// list 내의 전체 요소(Music객체들) 순차적 출력

for(int i=0; i<list.size(); i++) {

System.out.println(list.get(i));

}

 

//Music [title=술이 달다, artist=에픽하이]

//Music [title=저 밤, artist=양다일]

//Music [title=잊혀지다, artist=정키]

 

for(Music m : list) {

    System.out.println(m);

}

// Map 계열은 향상된 for문 못 씀.

// 반복문 안에서 remove하면 오류. 왜냐면 for는 맨 처음에 전체 길이를 인식하기 때문.

 

//Music [title=술이 달다, artist=에픽하이]

//Music [title=저 밤, artist=양다일]

//Music [title=잊혀지다, artist=정키]

 

System.out.println();

// subList(int fromIndex, in toIndex) : 리스트의 fromIndex부터 toIndex "이전"까지를 새로운 List에 담아서 반환

List<Music> sub = list.subList(0, 2); // 반환형이 List임.

System.out.println(sub); // [Music [title=술이 달다, artist=에픽하이], Music [title=저 밤, artist=양다일]]

 

System.out.println();

// addAll(Collection c) : 기존 리스트에 전달된 컬렉션의 전체 데이터들을 통째로 추가시켜줌

list.addAll(sub);

System.out.println(list); // [Music [title=술이 달다, artist=에픽하이], Music [title=저 밤, artist=양다일], Music [title=잊혀지다, artist=정키], Music [title=술이 달다, artist=에픽하이], Music [title=저 밤, artist=양다일]]

 

// clear() : 리스트 내의 요소들을 다 제거시켜줌 (초기화)

list.clear();

System.out.println(list); // []

 

// isEmpty() : 리스트가 비어있을 경우 true 반환

System.out.println(list.isEmpty()); // true

 

}

 

 

ㅁ 

 

public void arrayListTest7() {

 

List list = Arrays.asListnew Music("술이 달다", "에픽하이"), new Music("이 밤", "양다일"), "끝"  );

// "끝"은 String 객체

 

 

System.out.println(list); // [Music [title=술이 달다, artist=에픽하이], Music [title=이 밤, artist=양다일], 끝]

 

// Music m1 = list.get(0); 타입을 지정하지 않아서 Music 객체가 Object 타입으로 반환됨.

// System.out.println(list.get(0)); 이건 되지만.

// 객체를 꺼내 특정 변수에 담을 때 매번 형변환 해야 함.

//String str = (String) list.get(2); Music이나 String으로.

 

 

//list.get(1).setTitle("저 밤"); 타입을 지정하지 않아서 Object에 setTitle 메소드가 없다고 함.

((Music)list.get(1)).setTitle("저 밤");

 

 

// < 컬렉션 사용시 타입을 지정해두는 것을 권장 >

1. 명시된 타입의 객체만 저장가능하도록 제한을 둘 수 있어 다른 타입의 데이터는 못들어옴(데이터 안정성 확보).

2. 컬렉션에 저장된 객체에 접근시 매번 형변환하는 절차를 없앨 수 있음

 

 

}

 

 

===================================================================

 

ㅁ MVC 패턴

- 각 클래스마다 역할(데이터 담당, 화면 담당, 요청처리 담당)을 부여해서 작업

- 후에 유지보수가 용이함. 요청처리에 문제가 있으면 거기만 보면 되니까.

 

(1) M(Model) : 데이터를 담당하는 역할

- 데이터를 담기위한 클래스 vo

- 비즈니스 로직을 처리하기 위한 클래스 service

- 데이터 보관함과 직접 접근해서 입출력하는 클래스 dao

 

(2) V(View) : 화면을 담당하는 역할(사용자에게 보여지는 시각적인 요소) 

- 출력문(print)이나 입력문(scanner)으로 입력받는 과정은 무조건 View 쪽 클래스에서만 하고 다른 클래스에서는 출력문과 입력문이 있어서는 안 됨.

 

(3) C(Controller) : 사용자가 요청한 내용을 처리한 후 그 결과를 돌려주는 역할 (여기서 출력 안 함)

 

(4) 실행용 클래스

- 오직 프로그램 실행만 함.

 

 

 

- 프로젝트할 때 지피티 안 쓰는게 좋다. 어떤건지도 모르고 그냥 가져다 쓰면 안좋다.

- 회사에서 내부망안되서 아예 인터넷안 될 수 도 있음.

- 코드도 좋다고 할 수 없다. 오픈소스로 하는거라 공유 안된 코드들은 안 나옴. 현엽에서 쓰이지 않는 코드

- 차라리 구글링을 해라.

 

 

 

ㅁ < java.util.Collection>  --  < java.uitl.set >  --  HashSet

- list와 set이 Collection 상속.

- 다른 set도 있지만 HashSet만 알면 된다. 검색속도가 가장 빠르다.

 

- 집합 형태로 데이터를 관리하는 컬렉션

- 순서가 유지되지 않은 채로 데이터(value)가 저장됨. (저장 순서 유지 안 됨)

- 인덱스로 데이터를 관리할 수 없다. (즉, 특정 요소 하나만 추출할 수 없다)

(get 메소드 없음. get 메소드는 list와 map에만 있다)

- 중복 데이터 보관 불가

 

 

 

ㅁ Set은 인터페이스라 new Set은 안됨. 자료형으로는 쓸 수 있다. 

ㅁ 제네릭 타입을 지정하지 않으면 Object로 되어서 다양한 타입을 담을 수 있지만 이렇게 쓰지 않는 것이 좋다. 

 

 

Set 컬렉션을 배열로 변환시킬 수 있다.

- Set의 특성을 이용해서 중복없이 저장을 하고, 배열로 변환.

- toArray() 메소드. 반환형은 Object[]다.

- 보통 set을 거쳐가는 용으로 씀. 단독으로는 잘 안 씀. 중복없이 저장하려고 씀.

 

 

ㅁ 특정 요소 하나만 뽑기는 불가능. 인덱스가 없다.

 

 

ㅁ 대신 순회(순차탐색)하는 용도로는 사용 가능하다.

 

(1) for문 이용 (향상된 for문만 가능)   //  map 계열은 향상된 for문도 안됨.

 

for(Object obj : set ) {

 

}

 

(2) Set을 List로 변환 후 이용

 

List list = new ArrayList();

list.addAll(set);  //  set의 데이터 통채로 추가 - addAll은 Collection 상속받는거면 매개변수로 가능.

 

or

 

List list = new ArrayList(set)   //  생성과 동시에 추가

 

 

(3) Iterator(반복자) 이용

 

set.iterator()

 

- Collection이 iterator를 상속함. Map은 사용 불가. 

 

 

ㅁ 동일객체

set.add(new Student("공유", 45, 100));

set.add(new Student("김말똥", 26, 40));

set.add(new Student("홍길동", 24, 20));

set.add(new Student("공유", 45, 100));

 

- 그런데 공유학생 객체가 2개 존재. 동일객체가 안됨.

Student 클래스에 hashCode, equals 메소드가 없을 경우,

Object 클래스의 hashCode, equals 메소드를 수행함. 주소값을 기반으로 비교한다.

 

 

- <참고>

add 수행시 매번 동일객체 판별하는데

hashCode 메소드 수행 결과가 일치하는지, equals 메소드 비교 결과가 true인지로 판별함.

 

String과 기본타입의 래퍼클래스들은 저 둘이 오버라이딩 되어있다.

 

 

 

ㅁ set

- contains(Object o) : Set 내에 전달한 요소가 포함되어 있을 경우 true 반환

 

System.out.println(set.contains(new Student("홍길동", 24, 20))); // true

 

단 해시코드와 이퀄스가 오버라이딩 되어 있어야 한다. 

 

 

 

 

ㅁ < java.util.Map >  --  HashMap

- key와 vlaue를 함께 저장하는 구조로 객체를 대신해서 사용하는 개념

- 순서 유지되지 않음. 인덱스 개념이 없고, key가 각 데이터를 식별함

- 키는 중복을 허용하지 않는다.

- 키: 각 데이터(value)들의 식별자같은 존재. Set의 특성(순서 없고, 중복허용 x)

밸류: 데이터

- 키와 밸류를 함께 칭하는 용어로 엔트리.

 

 

ㅁ Map.of(key1, value1, key2, value2, ...)

- 키 밸류 순으로 나열하면 알아서 한쌍씩 Map 객체 반환해줌.

- 대신 unmodifiable map으로 반환함. 수정 불가한 map객체로. 불변객체.

(List.of도 불변이라 생성한 다음에 추가(put), 삭제(remove), 수정(replace) 불가)

 

 

ㅁ .replace(K key, V value) : 컬렉션 내에 해당 키 값을 찾아서 새로 전달한 Value값으

- map.replace("포테이토칩", new Snack("겁나짠맛", 1000) );

 

ㅁ .remove(Object key) : 컬렉션으로부터 전달된 키값에 해당하는 키-밸류 제거

- map.remove("포테이토칩");

 

 

ㅁ Map 순회하는 방법

- 단순 for문 안됨. 향상된 for문도 불가. 

- List로 변환 불가능

List list = new ArrayList(map); 불가. 인자로는 Collection이 와야 함.

- Iterator를 이용하는 방법만 가능

근데 map.iterator()는 불가능

 

Map -> Set -> Iterator

 

(1) keySet()

 

(2) entrySet()

 

 

 

ㅁ < java.util.Map >  --  Properties 

- 인터페이스 Map을 구현한 클래스임으로 Map의 특징을 다 가지고 있다. 

- put, get 메소드 가능.

- Properties는 자바 내에서만 쓰는 목적이 아닌, 외부 파일(.properties 파일 또는 .xml 파일)과 입출력할 때 주로 쓴다. 

저 두 파일은 키, 밸류를 '문자열'의 형태로 보다 단순하게 써둘 수 있는 파일이다.

객체 아니고 그냥 텍스트 형식으로 작성할 수 있음.

 

주로 프로그램의 환경설정(ip주소, dbms url 등) 관련 내용을 포함하고 있음.

setProperty, getProperty 메소드 주로 사용.

 

- 프로퍼티를 속성이라고도 한다. 속성정보를 저장할 때 쓴다.

 

 

 

- 예제1

Properties prop = new Properties();    //    얘는 제네릭 타입 지정 안함.

 

prop.put("다이제", new Snack("초코맛", 1500) );

prop.put("새우깡", new Snack("짠맛", 700) );

 

System.out.println(prop);     //    {다이제=Snack [flaovr=초코맛, calory=1500], 새우깡=Snack [flavor=짠맛, calory=700]}

System.out.println(prop.get("다이제"));     //    Snack [flaovr=초코맛, calory=1500]

 

 

외부파일로 출력한다면,

 

prop.store(OutputStream out, String comments)

prop.store(Writer writer, String comments)

첫번째 인자로 OutputStream이나 Writer 스트림 객체가 온다. 파일과 연결될 기반 스트림 객체.

두번째 인자로 그 파일에 기록할 주석문

 

try { prop.store( new FileOutputStream("test.properties"), "propertiesTest" ); } 

catch (IOException e) { e.printStackTrace(); }

 

 java.lang.ClassCastException: class Snack cannot be cast to class java.lang.String 

Snack 객체가 String으로 강제 형변환이 불가능. 파일은 만들어졌는데, 기록이 안 됨(아무것도 없음).

 

자바 내에서만 쓸거면 꼭 문자열이 아니더라도 다양한 타입의 객체를 담아도 됨. 

(근데 해시맵을쓰지 굳이 프로퍼티스를 쓰진 않음) 

근데 프로퍼티 파일에 출력하려면 문자열이어야 함. 

내부적으로 저장할 때 key, value 모두 String 형변환해서 저장함.

 

 


ㅁ 프로퍼티스 말고 XML 확장자 파일로도 출력이 가능.
- 보통 태그로서 정의하는 언어를 마크업 랭귀지라고 함.

- 마크업이 곧 태그다.

- XML: Extenstion Markup Language

- HTML : Hyper Text Markup Language  얘도 태그씀

 

 

ㅁ Properies 객체에서 put과 setProperty의 차이

 

  • put: Object 타입의 키와 값
  • setProperty: String 타입의 키와 값

 

 

 

-

Properties prop = new Properties();

 

// setProperty(String key, String value) : 전달된 키-밸류 문자열을 저장하는 메소드.

prop.setProperty("List", "ArrayList");

prop.setProperty("Set", "HashSet");

prop.setProperty("Map", "HashMap");

prop.setProperty("Map", "Properties");

 

 

System.out.println(prop); // {Set=HashSet, List=ArrayList, Map=Properties}

 

 

// getProperty(String key) : 전달된 키에 해당하는 value값을 문자열로 반환

System.out.println(prop.getProperty("List")); // ArrayList

System.out.println(prop.getProperty("list")); // null

// 존재하지 않는 key값 제시시 예외가 아닌 null을 반환함.

 

 

// store(스트림, String comments) 컬렉션에 담겨있는 key-value 값들을 파일로 출력(내부적으로 String형변환)

try {

    prop.store(new FileOutputStream("test.properties"), "propertiesTest");

}

catch (IOException e) { e.printStackTrace(); }

 

 

// storeToXML(스트림, String comments) : .xml 확장자 파일로 저장시킬 때 사용하는 메소드

try {

    prop.storeToXML(new FileOutputStream("test.xml"), "propertiesTest");

}

catch (IOException e) { e.printStackTrace(); }

 

 

 

 

(1) 이클립스에서 test.properties 파일 열기

 

 

 

 

 

 

 

 

 

- 두번째 주석은 파일이 저장된 날짜, 시간.

 

 

 

(2) 메모장에서 test.properties 파일 열기

 

#propertiesTest
#Mon Jul 15 14:38:13 KST 2024
Set=HashSet
List=ArrayList
Map=Properties

 

 

 

(3) 이클립스에서 test.xml 파일 열기

 

 

 

(4) 메모장에서 test.xml 파일 열기

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>propertiesTest</comment>
<entry key="Set">HashSet</entry>
<entry key="List">ArrayList</entry>
<entry key="Map">Properties</entry>
</properties>

 

 

- 첫째 줄은 XML 문서의 맨 처음에 위치하며, 문서의 버전과 인코딩을 명시하는 데 사용됩니다.

- 둘째 줄은 문서의 타입을 정의하는 DTD 선언(Document Type Definition)을 나타냅니다.

이 문서는 properties라는 이름의 요소들로 구성된 문서임을 선언합니다.

이 DTD는 외부에서 가져와 사용할 수 있는 SYSTEM 유형의 DTD 파일을 참조하며, properties.dtd 파일은 Java 표준 라이브러리에서 제공됩니다.

 

유효성검사함.

 

 

(5) 이클립스에서 test.xml을 열고, 아래 탭에서 Design이 아닌 Source선택.

 

 

 

 

 

 

 

 

 

 

 

 

 

- 빨간줄은 이클립스 버그. 낮은 이클립스버전은 안뜸

- <properties> </properties> 이건 태그라고 함. 시작태그와 종료태그. 

 

 

 

 

-

// 외부 파일에 기록되어있는 키-밸류를 읽어들이기

// 자바 프로그램으로 작성하는 경우는 별로 없고, 가져오는 경우가 많다.

 

Properties prop = new Properties();

 

try {

    prop.load(new FileInputStream("test.properties"));

}

catch (IOException e) { e.printStackTrace(); }

 

System.out.println(prop); // {Set=HashSet, List=ArrayList, Map=Properties}

System.out.println(prop.getProperty("Set")); // HashSet

 

 

- load(InputStream InStream)

load(Reader reader)

loadFromXML(InputStream in)

 

load는 String(두번째 인자) 없음. store는 출력이라 주석을 남기는 거였고.

 

 

 

 

- 언제 프로퍼티를 쓰고 언제 xml을 쓰냐.

다 프로퍼티를 써도 되고 다 xml을 써도 되기는 함. 각 특성이 있다.

 

프로퍼티 파일은 키와 밸류를 한 줄 단위로 써야함. 한줄 단위로 짧게 쓰는경우는 프로퍼티 파일을 씀.

여러줄 문장을 쓰고자 한다면 xml 파일로 기술. 엔트리 시작 태그 ~ 종료 태그에 엔터 넣어도 됨.

(단 콘솔 출력시에도 그렇게 나옴)

 

- 나중에 xml에 sql 쿼리문을 작성할건데, 여러줄 쓸거라 이 때는 xml 쓴다.

 

- xml 파일에 커서가 있는 상태이클립스를 실행하면 안 됨. 이상한게 뜸. 자바로 돌아와서 실행해야 함.

 

 

ㅁ .properties 파일과 .xml 파일을 사용하는 경우

- 프로그램상에 필요한 환경설정 내용을 기술해둠

- 해당 파일에 기술된 내용을 읽어들여서 자바측에서 사용

- 해당 파일 안에 내용은 다 텍스트(문자열)이기 때문에 개발자가 아닌 일반인 관리자가 해당 문서를 파악해서 수정할 수 있음. (이 내용이 자바 코드상에 있으면 일반인 관리자가 볼 수 없으니)

- .xml 파일의 경우 타 언어와 호환이 쉽다.

 

 

ㅁ 이제 오라클. 파일에 데이터를 저장할 수도 있지만 번거로워서 db라는 공간에 데이터를 입력 수정 삭제한다.

구조도 만들고.

 

자바-오라클 연계도.

'클라우드 활용 자바개발자 양성과정 > 01. JAVA 프로그래밍 언어 활용' 카테고리의 다른 글

11. 예외처리  (0) 2024.07.09
10. API  (0) 2024.07.05
08. 상속 Inherit & 09. 다형성 Polymorphism  (1) 2024.07.03
07. 객체 배열  (0) 2024.07.02
06. 객체  (0) 2024.06.27