ㅁ 컬렉션 매우 중요. 앞으로 배열 잘 안쓰고 컬렉션 씀.
- 너무 중요하다.
왜냐면 다수의 데이터를 관리해야 하기 때문에 그 때마다 컬렉션은 계속 따라다닐 것.
ㅁ < 제네릭 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.asList( new 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 |