프로그래밍/수업일지 (39)

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
728x90

 

수업내용 정리 (Java)

 

1. 제네릭  (참고 / 참고2)

더보기
  • 일반화
  • 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다.
  • 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다.
  • 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법
  • 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것
  • 클래스 자체가 아니라 클래스 내의 메소드 하나만 제네릭인 경우도 있다.
  • 기본 자료형은 사용할 수 없다. (ex: int, double 등)
  • ArrayList 등을 사용할 때 붙어있는 꺽새 괄호<>가 제네릭이다. (ex: ArrayList<String>)
  • 타입이 정해져있지 않다면 <T>를 적는다. (템플릿의 약자) / Object로 적으면 자료형이 안정성이 떨어진다.

 

fct(10);
fct('A');
fct("A");

void fct(T a) { … }
  • 알아서 int, char, String으로 생성된다.

 

ArrayList<String> list = new ArrayList<>();
//list.add(1);
list.add("1");
list.add("2");
for(String s : list) System.out.println(s);

ArrayList<Integer> listI = new ArrayList<>();
listI.add(3);
listI.add(4);
for(int s : listI) System.out.println(s);
  • 제네릭 타입을 String으로 적어서 ArrayList를 문자로 채우겠다고 약속을 했는데 숫자를 넣으면 에러가 난다.
  • 제네릭 타입을 Integer을 적고 안에 있는 값을 foreach int로 돌려도 값이 출력된다.
  • 클래스를 타입으로 적을 수 있다.

 

 

2. 컬렉션 프레임워크 (참고)

더보기
  • 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미
  • 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것
  • 컬렉션 프레임워크 주요 인터페이스는 List 인터페이스, Set 인터페이스, Map 인터페이스를 정의하고 있지만 List, Set 인터페이스는 Collection 인터페이스를 상속받고 Map 인터페이스는 별도 정의한다.
  •  
  • 컬렉션 프레임워크를 구성하는 모든 클래스는 제네릭으로 표현
출처: 주요 인터페이스 간의 상속 관계 <TCP school(참고)>
  • List <E>: 저장 순서 인정 / 중복값 허용 (ArrayList, LinkedList 등)
  • Set <E>: 저장 순서 비인정 / 중복값 비허용 (HashSet, TreeSet) (단, 내가 만든 클래스를 타입으로 받을 경우, 중복값을 제거해주지 않으므로 직접 equals랑 HashCode를 오버라이딩해주어야 중복값을 제거할 수 있다.)
  • Map <K, V>: 저장 순서 비인정 / 키: 중복값 비허용, 값: 중복값 허용 / 키(Key)와 값(Value)이 한 쌍 (HashMap, TreeMap 등)

 

 

3. List 계열

더보기
  • ArrayList<E>: 특징이 배열의 특징과 일치

장점: 데이터의 참조가 용이해서 빠른 참조가 가능하다.

단점: 저장소의 용량을 늘리는 과정에서 많은 시간이 소요되고, 데이터의 삭제에 필요한 연산과정이 매우 길다. (잦은 삽입/삭제에 오버헤드가 걸린다.)

  • LinkedList<E>: 특징이 리스트의 자료구조의 특징과 일치

장점: 저장소의 용량을 늘리는 과정이 간단하고, 데이터의 삭제가 매우 간단하다.

단점: 데이터의 참조가 다소 불편하다.

 

ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> list2 = new ArrayList<>();
List<Integer> list3 = new ArrayList<>();
Collection<Integer> list4 = new ArrayList<>();
  • 꺽새(제네릭)에 기본타입(ex: int) 불가
  • 뒷 꺽새는 타입을 안 적어도 되지만 꺽새는 적어야한다.
  • 부모타입인 List/Collection으로 ArrayList 생성 가능

 

list.add(10);
list.add(new Integer(20));
list.add(30);
  • new Integer 스킵 가능

 

System.out.println(list.size()+"개");
  • size를 통해 ArrayList 길이 출력 가능

 

list.remove(0);
  • 첫번째 인덱스(10) 삭제

 

for(int s : list) {
	System.out.println(s);
}

for(Integer s : list) {
	System.out.println(s);
}

for(int i=0; i<list.size(); i++) {
	System.out.println(list.get(i));
}
  • 세가지 모두 리스트 값을 출력한다.
  • Integer 타입이지만 int 타입에 값을 담아서 출력하는 방법도 가능하다.

 

 

4. Iterator (참고)

더보기
  • 반복자
  • 컬렉션 프레임워크(List, Set, Map, Queue)에서 값을 가져오거나 삭제할 때 사용
  • list.get()으로 값을 꺼내올 수 없는 Set에서 사용할 수 있다.
  • 장점

모든 컬렉션 프레임워크에 공통적으로 사용이 가능하다.  쉽게 값을 가져오거나 제거가 가능하다.

  • 단점

처음부터 끝까지의 단방향 반복만 가능하다. 값을 변경하거나 추가하는 것이 불가능하고, 대량의 데이터를 제어할 때 속도가 느리다.

  • 메소드

Iterator.hasNext(): 다음 값이 있으면 true, 아니면 false 값을 반환

Iterator.next(): 다음 값을 가져온다.

Iterator.remove(): next 시 가져왔던 값(현재 값)을 컬렉션에서 삭제한다. 반드시 Iterator.next() 다음에 사용!

 

 

Set<String> list = new HashSet<>();
list.add("first");
list.add("first");
list.add("third");
list.add("fourth");
  • 두번째 적은 first는 중복값이므로 Set으로 만든 list에 값이 저장되지 않는다. 따라서 값은 3개만 저장된다.

 

Iterator<String> ir = list.iterator();
while(ir.hasNext()){
	String curStr = ir.next();
	System.out.println("curStr: "+curStr);
	if(curStr.equals("third")) {
		ir.remove();	// 반복자의 현재 요소를 삭제
	}
}
  • while문의 조건에 ir.hasNext를 넣어 list에 다음 값이 있다면 true, 아니라면 false를 입력받아 반복문을 돌리거나 나간다.
  • 임시변수에 ir.next를 통해 현재 값을 저장한다.
  • if문의 조건에 삭제하고 싶은 값과 현재 값이 같은지 적고, 만약 맞다면 iterator의 현재 요소를 삭제하면 list에서도 삭제된다.

 

ir = list.iterator();
while(ir2.hasNext()){
	System.out.println(ir2.next());
}
  • 다시 반복하려고 하면 ir에 새로 지정해주어야 한다.
더보기
HashSet<Person> hSet = new HashSet<Person>();
hSet.add(new Person("최순이", 10));
hSet.add(new Person("최순이", 20));
hSet.add(new Person("갑돌이", 20));
hSet.add(new Person("갑돌이", 15));
hSet.add(new Person("최순이", 20));
hSet.add(new Person("갑돌이", 20));
System.out.println("데이터 수:" + hSet.size());
Iterator<Person> itr = hSet.iterator();
while (itr.hasNext()) {
	System.out.println(itr.next());
}
  • 내가 만든 클래스를 타입으로 주고 저장하면, 중복값이 제거되지 않는다. (클래스 내에서 오버라이딩 해주어야 한다.)
  • Iterator을 통해 값을 출력한다.

 

private String name;
private int age;

public Person(String name, int age) {
	this.name = name;
	this.age = age;
}

@Override
public String toString() {
	return name + "(" + age + "세)";
}

@Override
public boolean equals(Object obj) {
	Person p = (Person)obj;
	if(this.name.equals(p.name) && this.age == p.age) {
		return true;
	}
	return false;
}
@Override
public int hashCode() {
//		return age;	// 나이가 같은 사람끼리 모아두기
//		return name.hashCode();	// 이름이 같은 사람끼리 모아두기
	return age%3 + name.hashCode();
    // 나이가 같은 사람끼리(3그룹), 이름이 같은 사람끼리 모아두기
}

@Override
public int compareTo(Person p) {
	// 이름 길이, 알파벳 순 정렬+같은 길이 스킵 안 함
	if(name.length()>p.name.length()) return 1;
	else if(name.length()<p.name.length()) return -1;
	else {
		if(name.compareTo(p.name)>0) return 1;
		else if(name.compareTo(p.name)<0) return -1;		
}
  • 중복값을 제거하기 위해 equals와 hashCode를 오버라이딩했다.
  • equals 메소드 오버라이딩에서 받아올 변수가 Object로 받았기 때문에 (Person)을 통해 강제형변환을 해준다. 조건문에 같은 조건을 주고, 조건을 만족하면 true를 return하고 조건을 만족하지 못하면 false를 return한다.
  • Person 클래스에 implements Comparable했기 때문에 compareTo를 오버라이딩할 수 있다.

 

 

5. 예제

더보기
public class Main {
	public static void main(String[] args) {
		MemberArrayList mList = new MemberArrayList();
		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, "홍길동");
		
		mList.addMember(lee);
		mList.addMember(kim);
		mList.addMember(kang);
		mList.addMember(hong);
		mList.addMember(hong2);
		
		mList.showAllMember();
		mList.removeMember(kim.getId());
		mList.showAllMember();
	}
}
  • ArrayList를 이용한 멤버 목록

 

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 MemberArrayList {
	private ArrayList<Member> memberList;

	public MemberArrayList() {
		memberList = new ArrayList<>();
	}
	public MemberArrayList(int size) {
		memberList = new ArrayList<>(size);
	}
	
	public void addMember(Member member) {
		this.memberList.add(member);
	}
	
	public boolean removeMember(int id) {
		Iterator<Member> ir = memberList.iterator();
		while(ir.hasNext()) {
			Member member = ir.next();
			int tempId = member.getId();
			if(tempId == id) {
				memberList.remove(member);
				return true;
			}
		}
		System.out.println(id+"가 존재하지 않습니다.");
		return false; 
	}
	
	public void showAllMember() {
		System.out.println("============");
		System.out.println("id\tname");
		System.out.println("--  ----  --");
		for(Member m:memberList) {
			System.out.println(m);	// Member의 toString 생략
		}
		System.out.println("============");
		System.out.println();
	}
}
  • Member 클래스를 통해 만들어낸 객체들을 저장하고, 컨트롤타워에서 명령한 메소드가 담겨있는 ArrayList 클래스
  • 삭제는 Iterator을 통해 메소드를 작성했다. (독해는 위의 4. Iterator에서 적어두었다.)

 

 

 


 

질문한 내용이나 어려웠던 점 메모

1. Iterator

  • 보면 알겠는데 혼자 아무것도 없이 해보려고 하면 뭐였지..하면서 기억나지 않아서 여러번 예제를 만들거나 같은 예제를 계속 작성해보면서 연습해봐야할 것 같다.

 


 

전체 피드백

  • 예제를 많이 해본 것과 안 해본 것의 차이겠지만 아직은 Iterator보다는 for문이 조금 더 편한 것 같다..
  • 건강으로 인해 컨디션이 나빠서 자꾸 수업시간에 집중할 수 없었다.. ㅠ

 


728x90
728x90

 

수업내용 정리 (Java)

 

1. 객체 비교

더보기
IntNumber num1 = new IntNumber(10);
IntNumber num2 = new IntNumber(10);

 

// == 연산자
if(num1 == num2) {
	System.out.println("참조값 비교");
}else {
	System.out.println("참조값이 다르다.");
}
  • 객체의 주소값(참조값)을 비교하는 역할

 

// .equals 메소드
if(num1.equals(num2)) {
	System.out.println("오버라이딩 전 참조값 비교, 오버라이딩 후 내용 비교");
}else {
	System.out.println("오버라이딩 전 참조값/후 내용이 다르다");
}
  • 객체를 비교할 때에는 오버라이딩하지 않는 이상 참조값을 비교하는 것이다.
  • 원래 equals 메소드의 경우, Object 클래스의 메소드라서 == 연산자와 동일하게 주소값을 비교하도록 하는 메소드지만 String 타입에서는 내용 비교가 가능한 이유가 String 클래스에서 Object 메소드를 오버라이딩했기 때문이다.
@Override
public boolean equals(Object obj) {
	IntNumber cmp = (IntNumber)obj;
	if(this.num == cmp.num) {
		return true;
	}
	return false;
}
  • 오버라이딩을 통해 내용 비교로 바꿀 수 있다.

 

 

// 예제
package part1;

class Book{
	private String title;	//책제목
	private String author;	//작가
	private int price;
	public Book(String title, String author, int price) {
		this.title = title;
		this.author = author;
		this.price = price;
	}
	
	@Override
	public String toString() {
		return " > title: "+title+"\t("+author+")";
	}

	@Override
	public boolean equals(Object obj) {
		Book book = (Book)obj;
		if(this.title.equals(book.title)
				&& this.author.equals(book.author)
				&& this.price == book.price) {
			return true;
		}
		return false;
	}

	@Override
	public int hashCode() {
		return price%5;	//나머지 0~4(해시값)
	}
	
}

public class Ex01 {
	public static void main(String[] args) {
		Book b1 = new Book("삼국지","홍길동",1000);
		Book b2 = new Book("삼국지","홍길동",1200);
		Book b3 = new Book("삼국지","이순신",1000);
		
		System.out.println(b1 == b2);	// 참조값 비교
		System.out.println("참조값 주소\t"+System.identityHashCode(b1));
		System.out.println("해시 값\t"+b1.hashCode());
		
		if(b1.equals(b2)) {
			System.out.println("b1과 b2는 동일 도서");
		}else
			System.out.println("b1과 b2는 비동일 도서");
		if(b1.equals(b3)) {
			System.out.println("b1과 b3는 동일 도서");
		}else {
			System.out.println("b1과 b3는 비동일 도서");
		}
	}
}
  • hashCode(): 객체의 주소값을 변환하여 생성한 객체의 고유한 정수값 / 이 또한 오버라이딩해서 사용할 수 있다.
  • .equals를 오버라이딩해서 객체의 title, author, price가 셋 다 맞아야 같은 책이라는 조건을 넣었다.

 

 

2. int / Integer

더보기
  • int
  • 변수 타입
  • 자료형
  • 산술 연산 가능
  • null 값 지정 불가

 

  • Integer
  • 객체 타입
  • 래퍼클래스
  • Unboxing하지 않을 시 산술 연산 불가능 (지금은 자동으로 Boxing / Unboxing이 된다)
  • null 값 지정 가능

 

 

public class Ex01 {
	public static void main(String[] args) {
		Integer iInst = new Integer(10);
		Double dInst = new Double(3.14);
		
		iInst = new Integer(iInst.intValue()+10);
		System.out.println(iInst);
		System.out.println(dInst);
	}
}
  • Integer iInst = new Integer(10); 이 코드를 작성하면 취소선과 함께 노란색 밑줄이 쳐지는데 이클립스가 개선되면서 이렇게 풀어쓰지 않아도 된다는 뜻이므로 프로그램은 정상적으로 돌아간다. (Integer iInst = 10;과 동일한 코드) 밑의 Double도 동일
  • iInst = new Integer(iInst.intValue()+10); 이 코드를 작성해도 취소선과 함께 노란색 밑줄이 쳐진다. (iInst+=10;과 동일한 코드)

 

public class Ex02 {
	public static void main(String[] args) {
		Integer num1 = new Integer(10);
		Integer num2 = 10;
		
		if(num1 == num2) {
			System.out.println("참조값 비교");
		}else {
			System.out.println("참조값 다름");
		}
		if(num1.equals(num2)) {
			System.out.println("내용 비교");
		}else {
			System.out.println("내용 다름");
		}
	}
}
  • 콘솔창: 참조값 다름, 내용 비교 출력

 

 

3. 소수점 절대값 내기 (BigDecimal)

더보기
import java.math.BigDecimal;
import java.util.Scanner;

public class Ex04 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("5.5 입력> ");
		BigDecimal num1=new BigDecimal(sc.next());
		System.out.print("10.7 입력> ");
		BigDecimal num2=new BigDecimal(sc.next());
		
		System.out.println("절대값: "+num1.subtract(num2).abs());
	}
}
  • (아직 BigDecimal에 대해 잘 모르겠다.)
  • BigDecimal은 자바 언어에서 숫자를 정밀하게 저장하고 표현할 수 있는 유일한 방법이다. (참고)
  • .abs는 인자값에 대한 절대값을 반환해준다.

 

 

4. Random

더보기
Random rd = new Random();
  • Random 함수를 사용하기 위해서는 import해야한다.

 

// 선생님이 예제로 보여주신 방법
for(int i=0; i<5; i++) {
	System.out.print((int)(Math.random()*10)+" ");
}
// 기존에 내가 찾아뒀던 방법
for(int i=0; i<5; i++) {
	System.out.print(rd.nextInt(10)+" ");
}
  • (나는 내가 기존에 찾아뒀던 방법이 편하다고 생각한다.)

 

// 문제) 중복되지 않는 6개의 정수(1~14)를 배열에 저장 후 출력하시오
int[] a = new int[6];
		
for(int i=0; i<a.length; i++) {
	a[i] = rd.nextInt(13)+1;
	for(int j=0; j<i; j++) {
		if(a[i] == a[j]) {
			i--;
			break;
		}
	}
}
Arrays.sort(a);
for(int i=0; i<a.length; i++) {
	System.out.println(a[i]);
}
  • 랜덤한 숫자를 중복되지 않게 6개 뽑아내고, 배열에 저장해 출력하기
  • 첫번째 숫자(배열의 0번째 인덱스)를 뽑을 때는 그냥 뽑지만 두번째 숫자(배열의 1번째 인덱스)부터는 for문을 다시 돌려 i번째 인덱스와 j번째 인덱스가 같으면 i-1을 해주며 두번째 for문인 j for문을 종료하고 다시 큰 for문을 돌린다.
  • 배열에 숫자를 모두 저장하고 나면 Arrays.sort 함수를 이용하여 배열 내 숫자들을 순서대로 정리해줬다.
  • for문을 돌려 배열에 저장된 숫자들을 순서대로 출력했다.

 


 

질문한 내용이나 어려웠던 점 메모

1. BigDecimal

 


728x90
1 ··· 4 5 6 7 8 9 10 ··· 13