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