728x90
수업내용 정리 (Java)
1. HashMap
더보기
public class HashMapMain {
public static void main(String[] args) {
HashMapList mList = new HashMapList();
Member lee = new Member(1001, "이순신");
Member kim = new Member(1002, "김유신");
Member kang = new Member(1003, "강감찬");
Member hong = new Member(1004, "홍길동");
Member hong2 = new Member(1004, "홍길동");
Member hong3 = new Member(2008, "홍길동");
mList.addMember(lee);
mList.addMember(kim);
mList.addMember(kang);
mList.addMember(hong);
mList.addMember(hong2);
mList.addMember(hong3);
mList.showAllMember();
mList.removeMember(lee.getId());
mList.showAllMember();
HashMap<Integer, String> hMap = new HashMap<>();
hMap.put(1001, "kim");
hMap.put(1002, "kim");
hMap.put(1003, "park");
hMap.put(1004, "hong");
System.out.println(hMap);
}
}
- HashMap을 이용한 멤버 목록
public class Member {
private int id;
private String name;
public Member(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return id+"\t"+name;
}
}
- Member 클래스는 어제자 예제와 동일하다.
public class HashMapList
// 필드
private HashMap<Integer, Member> hashMap;
- Map <K, V>에 따라 필드를 저장한다.
// 생성자
public HashMapList() {
this.hashMap = new HashMap<>();
}
public void addMember(Member member) {
// 1001, new Member(1001,"강감찬")
// 1002, new Member(1002,"홍길동")
this.hashMap.put(member.getId(), member);
}
- 매개변수로 Member 타입으로 저장할 member를 받아온다.
- k 값에 member의 id를 넣고, v 값에 member 변수를 넣는다.
public boolean removeMember(int memberId) {
if (hashMap.containsKey(memberId)) {
hashMap.remove(memberId);
return true;
}
System.out.println(" > 정보를 찾을 수 없습니다.");
return false;
}
- 매개변수로 삭제할 memberId를 받아와서 Map 내부에 해당하는 key가 있으면 true 값을 반환하고, 아니라면 false 값을 반환한다.
public void showAllMember() {
Collection<Member> mList = hashMap.values();
// System.out.println(mList);
for(Member mb:mList) {
System.out.println(mb); //Member toString
}
System.out.println("---------------");
}
- HashMap에서 반복문 구현
- Member 타입의 임시변수 mList에 v값을 저장한다.
- foreach를 돌려 새로운 임시변수에 mList의 값을 하나씩 가져와 출력한다.
- 주석처리 된 System.out.println(mList); 라고 출력해도 되지만, 가로로 쭉 출력되는 것이 보기에 좋지 않다. (비추!)
public void showAllMember2() {
Iterator<Integer> ir = hashMap.keySet().iterator();
while(ir.hasNext()) {
int key = ir.next();
Member m = hashMap.get(key);
System.out.println(m);
}
System.out.println("---------------");
}
- Iterator을 이용한 멤버 전체 출력
- ir 값에 k값을 집어넣고, while문의 조건에 ir.hasNext를 넣어 Map의 다음 값이 있다면 true, 없다면 false를 입력받아 반복문을 돌린다.
- 임시변수에 ir.next를 통해 현재 값을 저장한다.
- Member 임시변수에 k값에 해당하는 v값을 저장하고, 출력한다.
2. 파일 입출력 스트림 (맛보기.....)
더보기
- 자바 스트림의 큰 분류: 입력 스트림(프로그램으로 데이터를 읽어들이는 스트림), 출력 스트림(프로그램으로부터 데이터를 내보내는 스트림)
- 데이터의 입력을 위해서는 입력 스트림을, 출력을 위해서는 출력 스트림을 형성해야한다. (스트림은 인스턴스의 생성을 통해 형성된다.)
- 파일 기반의 입력 스트림 형성
- 파일 run.exe(예시) 대상의 입력 스트림 생성(인스턴스 생성)
- FileInputStream 클래스는 InputStream 클래스를 상속한다.
- InputStream 클래스: 바이트 단위로 데이터를 읽는 모든 입력 스트림 클래스의 최상위 클래스 (파일에 맞춰서 read 메소드 구현)
- OutputStream 클래스: 바이트 단위로 데이터를 쓰는 모든 출력 스트림 클래스의 최상위 클래스
- GDInputStream 클래스: 존재하지 않는 가상의 클래스 (장치에 맞춰서 read 메소드 구현)
- InputStream 클래스(추상화 클래스)의 대표적인 두 메소드
- public abstract int read() throws IOException
- public void close() throws IOException
- 입력의 대상에 적절하게 read 메소드가 정의되어 있다. 그리고 입력 대상에 따라서 입력 스트림을 의미하는 별도의 클래스가 정의되어있다.
// 파일 대상의 입력 스트림 생성
InputStream in = new FileInputStream("run.exe");
int bData = in.read();
- 오버라이딩에 의해 FileInputStream의 read 메소드 호출
- 파일 대상의 출력 스트림 형성(입출력 스트림은 대부분 쌍(pair)을 이룬다.
InputStream <-> OutputStream
FileInputStream <-> FileOutputStream
public class Ex01 {
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream("boss.mp4");
OutputStream out = new FileOutputStream("bossCopy.mp4"); // 자동으로 생성된다.
long start = System.currentTimeMillis();
int copyByte = 0;
int bData;
while (true) {
bData = in.read(); // 1바이트 씩 읽기
if (bData == -1)
break;
out.write(bData);
copyByte++;
}
in.close();
out.close();
// 40.199초
long end = System.currentTimeMillis();
System.out.println("파일복사 시간: "+(end-start)/1000.+"초");
System.out.println("복사된 바이트 크기 " + copyByte);
}
}
- InputStream in에 new FileInputStream()으로 읽어들일 파일(자바 소스와 같은 폴더에 들어있어야 함!)의 이름을 큰따옴표"" 안에 적는다.
- OutputStream out에 새로 생성할 파일의 이름을 적는다.
- copyByte라는 변수를 만들어 값을 0으로 설정하고, bData라는 변수도 선언해둔다. (변수명은 달라도 상관없다.)
- while문 조건을 true로 두고 bData에 in.read();를 통해 읽어들인 바이트 값을 저장한다. (1바이트씩 읽는다.)
- 만약 bData에 -1 값이 들어갔다면 break를 통해 while문을 종료한다.
- 조건에 충족하지 않았다면 out.write();를 통해 bData 값 만큼 출력하고, copyByte를 1씩 올린다.
- in/out 코드 모두 close() 메소드를 통해 닫아준다.
- long start/end는 시간을 재기 위한 코드 (컴퓨터마다 차이는 있겠지만 내 노트북으로는 해당 코드로 16GB 영상을 복사하는데 40.199초가 나왔다.)
InputStream in = new FileInputStream("boss.mp4");
OutputStream out = new FileOutputStream("bossCopy.mp4");
long start = System.currentTimeMillis();
int copyByte=0;
int readLen;
byte buf[]=new byte[1024];
while(true)
{
readLen=in.read(buf);
if(readLen==-1)
break;
out.write(buf, 0, readLen);
copyByte+=readLen;
}
// 0.057초
long end = System.currentTimeMillis();
System.out.println("파일복사 시간: "+(end-start)/1000.+"초");
System.out.println("복사된 바이트 크기 " + copyByte);
- 위의 코드에서 start/end 사이의 내용만 바꾼 코드
- 전체 구조는 비슷하지만 readLen이란 변수에 in.read만큼 읽어들일때, buf를 통해 바이트[1024] 값을 담아 1024배 빠르게 읽어들일 수 있도록 한다. (이론상으로는 1024배만큼 빨라져야 한다.)
- 위의 코드가 계단을 통해 위로 올라가는 것이었다면 이 코드는 엘레베이터를 통해 위로 올라가는 느낌
- out.write에는 buf 배열 0번째 인덱스부터 readLen 바이트를 저장한다.
- copyByte는 readLen 값을 누적해서 저장한다.
- long start/end는 시간을 재기 위한 코드 (컴퓨터마다 차이는 있겠지만 내 노트북으로는 해당 코드로 16GB 영상을 복사하는데 0.057초가 나왔다.) (같은 영상인데 훨씬 빠르다!)
질문한 내용이나 어려웠던 점 메모
1. 입출력 스트림
- 아주 조금만 배웠는데도 너무 어렵다..우선 외워두기만 하고 이해하는 것은 나중에 하기로 했다. (실상 외우기도 힘들 것 같다 ㅠㅠ )
2. 필터
- 정리할 만큼의 이해도 되지 않아서 다시 찾아보고 해야할 것 같다.
전체 피드백
- 이전에 배운걸 전부 이해하지 못한 상태에서 새로운걸 넣으려고 해서 그런지 더 들어오지 않는 기분이 들었다. 학원이 끝나고 일지를 쓰면서 다시 독해도 하고 그러면서 조금씩 이해도가 높아지고는 있지만 주말에 더 시간을 써서 공부를 해야할 것 같다.
- 날씨에 컨디션이 영향받지 않도록 하기!
- 일지를 비공개로 올리지 않도록 노력하기..(그리고 늦지 않게 쓰도록 노력하기..!)
728x90
'프로그래밍 > 수업일지' 카테고리의 다른 글
수업일지 23일차 (23/10/23) - MySQL (3) | 2023.10.23 |
---|---|
수업일지 22일차 (23/10/20) - Java (3) | 2023.10.20 |
수업일지 20일차 (23/10/18) - Java (0) | 2023.10.18 |
수업일지 19일차 (23/10/17) - Java (2) | 2023.10.17 |
수업일지 18일차 (23/10/16) - Java (1) | 2023.10.16 |