과제 피드백
cf) 이클립스에서 cmd 키 누르고 메소드에 마우스 갖다대면 해당 메소드로 이동 가능.
cf) 루프를 빠져나올때 break 한번만쓰면 안될땐 키워드를 써서 break loop 이런식으로도 가능하지만, System.exit(0);을 쓰면 프로그램이 아예 종료된다.
cf) 보통 화면에 보여주는 기능클래스는 View라 하고, 원래는 프린트하는 클래스도 따로있다.
cf) 변수나 메소드 이름은 언더바로 시작을 할 수 있긴하지만, 언더바로 시작하는 변수나 메소드들은 시스템을 건드리는 기능을 하는 아이들이다.
SimpleDateFormate 클래스
우리가 원하는 포맷으로 연 원 일 시 분 초를 뽑아낼 수 있다.
날짜 객체로부터 원하는 형태의 문자열로 변환한다.
특정한 포맷 문자열을 사용하여 날짜 정보를 추출한다.
SimpleDateFormat(String pattern)
jar
내가 만든 프로그램을 배포하고싶을때, 자바 압축파일로 export한다.
패키지에서 오른쪽마우스 -> export
우리가 프로그램 짜며 쓴 모든 패키지들, util, scanner 등도 모두 압축해야하기 때문에.
어차피 우리가 쓴 패키지들은 우리가 만든 클래스에 있으므로 우리가 만든 패키지 전체를 export하면됨.
runnable은 실행파일이 있는경우만. 그 외는 그냥 jar
외부에서 jar파일을 다운받았다면 build path를 고쳐줘야 한다. 안그러면 빨간 x 표시가 뜬다. edit 해주면 된다.
Collection API 와 자료구조
배열 : 같은 타입의 변수를 고정된 개수만큼 모아놓은 집합
-> 크기가 고정되있어 내가 늘이거나 줄일 수 없다. 그러다보니 비효율적으로 보였다.
그러다보니 좀더 효율적으로 다룰수있는 데이터 집합이 필요했다. 이걸 “자료구조”라 한다.
자료구조 : 같은 타입의 데이터들이 어떻게 좀 더 효율적으로 메모리에 저장하고, 어떻게하면 내가 원하는 정보를 빠르게 탐색할 수 있을까 라는 생각에서 출발함.
[ Collection과 자료구조 ]
어떤 자료형이 들어올지 모르기때문에 묵시적형변환을 써서 object 클래스를 상속받음.
그래서 기본자료형이 아니라 참조자료형들의 객체로만 이루어짐.
정적 자료구조 : 크기가 고정
ex) 배열
동적 자료구조 : 그때그때 내가 크기를 유연하게 움직일 수 있는 것.
ex) 벡터, 리스트, 스택, 큐
(요즘 벡터는 거의 안쓰인다. 자바의 스택은 문제가 좀 있어서 잘 안쓴다. 리스트가 가장 중요)
리스트 - 동적인 배열. 이 동적인 배열중에 입출력의 규칙에 따라 스택과 큐가 될 수 있다.
Collection (인터페이스)
- Set
- List
- Queue
-> 이들을 나누는 기준 : 순서를 유지할것인가? 중복을 허용할것인가?
Map (key와 value의 쌍으로 이루어진 조금 다른 형태의 자료구조)
- SortedMap
중요한건, 회사에선 아무도 리스트로 짜라, 큐로 짜라고 얘길 안한다. 우리 자신이 판단해야 한다.
[ Generic ]
이러한 콜렉션은 사용자가 어떤 자료형으로 쓸지 모르는게 문제여서, 모든걸 담을수있는 형태의 object 배열로 만들어야 한다. 근데 이럴경우, 오브젝트 배열 [ ] 에서 각 번지마다 다른 타입을 넣어도 에러가 안나게됨.
0번지에 String, 1번지에 iceCream 이렇게 넣어도 에러가 안난다는 것임.
예를들어,
Object[] objArr = new Object[5];
for(int i = 0; i < objArr.length; i++){
objArr[i] = new String(“hello” + (j+1) + “!!!”);
}
for(int i = 0; i < objArr.length; i++) {
println(“length: “ + objArr[i].length());
}
// -> 불가능하다. 왜? length() 메소드는 object의 자식클래스인 String이 가진 메소드이기 때문에.
// 묵시적형변환으로는 부모와 오버라이딩한 메소드에만 접근가능하지, 자식만이 가진 메소드엔 접근 못한다.
for(int i = 0; i < objArr.length; i++) {
print(“length:” + ((String) objArr[i]).length());
}
// -> 이걸 가능케하려면 이렇게 명시적 형변환을 해줘야 함.
But, 문제는 object 배열이다보니 내가 항상 스트링만 쓴다는 보장이 없음. 내가 IceCream형을 써도 오류가 안나게됨. 또한, 몇번지에 어떤 형이 들어갔는지 몰라서 각각 다 명시적 형변환을 해주기도 어려움. 안좋음.
=> 이를 방지하기 위해 원래는 object 배열인데 만들때부터 무슨 형으로 쓸거라는걸 명시하게 되었다. 이걸 제너릭이라 한다. 애초에 같은 타입의 집합을 만드는게 목적이니까.
- 제너릭 : 타입을 명시하는 기술. jdk1.5버전때 나왔다. 그 전까지는 다 object 배열을 만들어서 묵시적명시적 형변환을 해줬었다. 지금은 제너릭으로 인해 편해짐.
- 컴파일 시점에 자료구조에 사용되는 Type을 체크하는 Generic 문법.
- 형식 : 클래스<타입> // 원래는 object 배열인데 지금은 <타입>으로 받을꺼야!
ex)
List<String> list = new ArrayList<String>();
원래는 List list = new ArrayList(); 이랬다. 기본이 object형이라 모든 타입을 저장할 수 있었다. 그래서 자식클래스의 메소드를 쓰기 위해선 명시적 형변환을 다 해줘야했다. 근데 이럴경우 각 번지에 다른 형이 들어갈수도 있게된다. 이를 방지하기 위해 제너릭으로 <String>만 들어올거야! 선언해준것이다.
[ List ]
- 순서가 있고, 중복을 허용.
- 장점 : 가변적인 배열
- 단점 : 원하는 데이터가 뒤쪽에 위치하는 경우 속도의 문제
- 구현클래스 :
- ArrayList - 내부적으로 배열처럼 움직임
- LinkedList
-> 배열처럼 쓰기 때문에 왼쪽에서 오른쪽으로 주소를 계산한다. 앞쪽 데이터는 빨리 탐색 가능하지만 뒤쪽은 속도가 느려진다.
[ ArrayList - 메소드 ]
- 배열과 다르게 크기가 유동적으로 변함(동적 자료구조)
- 배열을 다루는 것과 유사하게 사용할 수 있음
- 내부적으로 배열을 이용하여 데이터를 관리
[ ArrayList와 Generic ]
ArrayList list = new ArrayList(); // 얘가 제너릭 없이 Object로
ArrayList<String> list2 = new ArrayList<String>(); // 얘가 제너릭
[ ArrayList - 메소드 ]
- add(E e) : 데이터 입력
순차적으로 입력된다.
ex)
list.add(“봄”);
list.add(“여름”);
list.add(“봄”); // 중복 허용
- get(int index) : 데이터 추출
list.get(0) => “봄” // 데이터는 그대로. 반환만 한다.
- Size() : 데이터 크기 반환
list.size();
- remove(int i) : 인덱스 위치의 데이터를 삭제
list.remove(0); // 1번지의 봄이 삭제되고 1번지의 여름이 0번지로 옮겨온다.
- remove(Object o) : 동일한 데이터를 삭제
list.remove(“봄”); // 0번지의 봄이 먼저 지워진다. 데이터값이 중복될경우 제일 처음 값만 지운다. 여름이 0번지로, 그다음 봄이 1번지로 온다.
- clear() : 모든 데이터를 삭제
list.clear();
- contains(Object o) : 특정 데이터가 있는지 체크. 몇번지인지는 모르고 있다 없다만 리턴.
boolean b = list.contains(“봄”); // True 리턴.
- isEmpty() : 데이터가 존재하는지 체크
boolean b = list.isEmpty(); // false. 데이터가 있으니까.
- addAll(Collection c) : 기존 등록된 콜렉션 데이터 추가
list : 봄 여름
sub : 가을 겨울
list.addAll(sub); // => list의 2번지와 3번지에 가을과 겨울이 들어가게 됨.
[ Set ]
- 특징 : 순서가 없고, 중복을 허용하지 않음
- 장점 : 빠른 속도
- 단점 : 단순 집합의 개념으로 정렬하려면 별도의 처리가 필요하다.
- 구현 클래스
- HashSet : 마치 우편물 탐색기
- TreeSet : 마치 윈도우탐색기
=> 둘 다 탐색속도를 빠르게하려고 만들어진것이다.
[ Set - 메소드 ]
- boolean add(E e) : 데이터 입력
set.add(“봄”);
set.add(“여름”);
=> 순서를 갖고있지 않아서 get 메소드는 없다. 인덱스도 필요 없다.
- int size() : 크기 반환
int size = set.size(); // -> 2가 반환
- boolean remove(Object o) : 동일한 데이터를 삭제 (ArrayList와 다르게 인덱스로 지울수 없다. 데이터값으로만 삭제)
set.remove(“봄”);
- void clear();
- contains(Object o);
- isEmpty();
- iterator() : iterator 인터페이스 객체 반환
- toArray()
[ TreeSet ]
: binary 이진트리 형식으로 노드들이 가지치기를 한다.
P (부모 노드)
L R
(Left node) (Right node)
ex)
10
5 25
3 14
…
=> 그래서 TreeSet은 문자형의 경우 알파벳순으로 정렬한다.
cf) 기본자료형을 콜렉션에서 사용할 때, Wrapper Class를 사용해서 참조자료형으로 변환한다.
정수형 ArrayList를 만들고싶을 때 기본형 Int는 원칙적으로 안되므로 참조자료형으로 바꿔주는 Integer wrapper class 사용
List<Integer> list = new ArrayList<Integer>();
list.add(1);
int data = list.get(0);
실습 코드 및 과제
https://github.com/LeenaKim/Java_Lessons/tree/master/src/kr/ac/kopo/day12
'Programming > Java' 카테고리의 다른 글
[ JAVA 수업 DAY 10 - 11 ] Final, 인터페이스+, 예외처리, Java API (0) | 2020.05.05 |
---|---|
[ JAVA 수업 DAY 09 ] 객체형변환+, 인터페이스 (0) | 2020.05.05 |
[ JAVA 수업 DAY 07 - 08 ] 상속, 추상클래스, 객체형변환 (0) | 2020.05.05 |
[ JAVA 수업 DAY 06 ] 문자열 (0) | 2020.05.05 |
[ JAVA 수업 DAY 05 ] 클래스와 메소드 (0) | 2020.05.05 |