TIL 23.08.09

ν™©μ€ν•˜Β·2023λ…„ 8μ›” 9일
0

TIL

λͺ©λ‘ 보기
57/146

πŸ“ŒToday I Learned

Java μˆ˜μ—… (67~72)

Ex67_sort

λ°°μ—΄ or μ»¬λ ‰μ…˜

  • μ˜€λ¦„μ°¨μˆœ μ •λ ¬, λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬
    1. 직접 μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„
    2. JDK 제곡 κΈ°λŠ₯

μ •λ ¬ 방법

Arrays 클래슀의 sort() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
μ˜€λ¦„μ°¨μˆœ 정렬이닀.
λ‚΄λ¦Όμ°¨μˆœ 정렬은 μ§€μ›ν•˜μ§€ μ•Šμ•„μ„œ 직접 κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

Integer[] nums = { 1, 5, 2, 4, 3 };

// μ˜€λ¦„μ°¨μˆœ μ •λ ¬
Arrays.toString(nums);

// λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬ > 지원 μ•ˆν•¨ > 직접 κ΅¬ν˜„
//		Arrays.sort(λ°°μ—΄, Comparator);
Arrays.sort(nums, new MyComparator());

Comparator μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
o1 vs o2
1. μ˜€λ¦„μ°¨μˆœ
a. o1이 더 크면 > μ–‘μˆ˜ λ°˜ν™˜ > 1
b. o2κ°€ 더 크면 > 음수 λ°˜ν™˜ > -1
c. κ°™μœΌλ©΄ > 0 λ°˜ν™˜


2. λ‚΄λ¦Όμ°¨μˆœ
a. o1이 더 크면 > 음수 λ°˜ν™˜ > -1
b. o2κ°€ 더 크면 > μ–‘μˆ˜ λ°˜ν™˜ > 1
c. κ°™μœΌλ©΄ > 0 λ°˜ν™˜

Arrays.sort(nums2, new Comparator<Double>() {

	@Override
	public int compare(Double o1, Double o2) {
//		if (o1 < o2)
//			return 1;
//		else if (o1 > o2)
//			return -1;
//		else
//			return 0;

		return o2 - o1; // μ •μˆ˜

	}
});

System.out.println(Arrays.toString(nums2));

μžλ£Œν˜•λ³„ μ •λ ¬

  1. μˆ«μžν˜•
  2. 문자(μ—΄) > λ¬Έμžμ½”λ“œκ°’ > 숫자
  3. λ‚ μ§œμ‹œκ°„ > 숫자
  4. 객체 ***

μœ„μ— 정리해 λ‘” 것이 μˆ«μžν˜•μ΄λ‹€.

λ¬Έμžμ—΄μ€ μ°Έμ‘°κ°’μ΄λ―€λ‘œ μ£Όμ†Œκ°’μ€ μ—°μ‚°μ˜ λŒ€μƒμ΄ λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ν•œ 문자(κ°’)μ”© λΉ„κ΅ν•œλ‹€.
λ§Œμ•½ λ¬Έμžμ—΄ κ·ΈλŒ€λ‘œ μ •λ ¬ν•˜λ €λ©΄ compareTo() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜λ©΄ λœλ‹€. (-> μ•žμ΄ 크면 μ–‘μˆ˜, μž‘μœΌλ©΄ 음수, κ°™μœΌλ©΄ 0이닀.)
compareToIgnoreCase() λ©”μ†Œλ“œλŠ” λŒ€μ†Œλ¬Έμž ꡬ뢄 없이 λΉ„κ΅ν•œλ‹€.

String txt1 = "ABC";
String txt2 = "abc";

for (int i = 0; i < 3; i++) {
	char c1 = txt1.charAt(i);
	char c2 = txt2.charAt(i);

	if (c1 > c2) {
		n = 1;
		break;
	} else if (c1 < c2) {
		n = -1;
		break;
	}	

λ¬Έμžμ—΄ λ°°μ—΄ μ •λ ¬ν•˜κΈ°

String[] names = { "홍길동", "μ•„λ¬΄κ°œ", "μœ μž¬μ„", "λ°•λͺ…μˆ˜", "μ΄μˆœμ‹ ", "ν›ˆ", "κΉ€μ² " };

// κ°€λ‚˜λ‹€μˆœμœΌλ‘œ μ •λ ¬
Arrays.sort(names);

// μ‚¬μš©μž μ •μ˜ν˜• μ •λ ¬
Arrays.sort(names, new Comparator<String>() {

	@Override
	public int compare(String o1, String o2) {
//		return o1.compareTo(o2); // μ˜€λ¦„μ°¨μˆœ
//		return o2.compareTo(o1); // λ‚΄λ¦Όμ°¨μˆœ

//		return o1.length() - o2.length(); // κΈ€μžμˆ˜ 비ꡐ > μ˜€λ¦„μ°¨μˆœ
//		return o2.length() - o1.length(); // κΈ€μžμˆ˜ 비ꡐ > λ‚΄λ¦Όμ°¨μˆœ

		if (o1.length() > o2.length()) {
			return 1;
		} else if (o1.length() < o2.length()) {
			return -1;
		} else {
			// 2μ°¨ μ •λ ¬ κΈ°μ€€. 1차둜 μ •λ ¬ν•œ λ’€ 2차둜 μ •λ ¬ν•˜κ³  싢을 λ•Œ 여기에 적으면 λœλ‹€.
			return o2.compareTo(o1); // 문자 μ½”λ“œκ°’ 비ꡐ
		}
	}
});

λ‚ μ§œ μ •λ ¬

  1. Arrays.sort(dates);

    • 기본적인 λ‚ μ§œμˆœ 정렬이닀.
  2. Arrays.sort() λ©”μ†Œλ“œμ˜ 인자둜 Comparator μΈν„°νŽ˜μ΄μŠ€μ˜ compare() λ©”μ†Œλ“œ

    • λ‚΄λ¦Όμ°¨μˆœμ΄λ‚˜ μš”μΌμˆœ μ •λ ¬ λ“± μ‚¬μš©μž μ •μ˜λ‘œ 정렬을 μ‚¬μš©ν•  λ•Œ μ“΄λ‹€.
Calendar[] dates = new Calendar[5];

for (int i = 0; i < dates.length; i++) {
	dates[i] = Calendar.getInstance();
}

dates[0].add(Calendar.DATE, 7);
dates[1].add(Calendar.DATE, -2);
dates[2].add(Calendar.DATE, 1);
dates[3].add(Calendar.DATE, 0);
dates[4].add(Calendar.DATE, 3);

//1. 
Arrays.sort(dates);

//2.
Arrays.sort(dates, new Comparator<Calendar>() {

	@Override
	public int compare(Calendar o1, Calendar o2) {
		// λ‚ μ§œ 순 μ •λ ¬
//		return (int) (o2.getTimeInMillis() - o1.getTimeInMillis()); // ν˜•λ³€ν™˜ μ‹œ μœ„ν—˜ν•  수 있음
//		return o2.compareTo(o1); // λ°˜λ“œμ‹œ compareTo() μ‚¬μš©

		// μš”μΌ 순 μ •λ ¬ (일(1) ~ ν† (7))
		return o1.get(Calendar.DAY_OF_WEEK) - o2.get(Calendar.DAY_OF_WEEK); // μ˜€λ¦„μ°¨μˆœ
//		return o2.get(Calendar.DAY_OF_WEEK) - o1.get(Calendar.DAY_OF_WEEK); // λ‚΄λ¦Όμ°¨μˆœ
	}
});

객체 μ •λ ¬

Score[] list = new Score[5];

list[0] = new Score("홍길동", 100, 90, 80);
list[1] = new Score("μ•„λ¬΄κ°œ", 98, 78, 88);
list[2] = new Score("μœ μž¬μ„", 78, 95, 79);
list[3] = new Score("λ°•λͺ…μˆ˜", 56, 78, 76);
list[4] = new Score("μ΄μˆœμ‹ ", 99, 67, 79);

System.out.println(Arrays.toString(list));

// μ΄λ¦„μˆœ μ •λ ¬
Arrays.sort(list, new Comparator<Score>() {

	@Override
	public int compare(Score o1, Score o2) {
		// 이름 비ꡐ
//		return o1.getName().compareTo(o2.getName());

		// κ΅­μ–΄μ μˆ˜ λ‚΄λ¦Όμ°¨μˆœ
//		return o2.getKor() - o1.getKor();

		// 총점 λ‚΄λ¦Όμ°¨μˆœ
		return (o2.getKor() + o2.getEng() + o2.getMath()) - (o1.getKor() + o1.getEng() + o1.getMath());
	}
});

class Score {
	private String name;
	private int kor;
	private int eng;
	private int math;
    
	public Score(String name, int kor, int eng, int math) {
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		this.math = math;
	}
	public String getName() {
		return name;
	}
	public int getKor() {
		return kor;
	}
	public int getEng() {
		return eng;
	}
	public int getMath() {
		return math;
	}
	@Override
	public String toString() {
		return "Score [name=" + name + ", kor=" + kor + ", eng=" + eng + ", math=" + math + "]\n";
	}
}

Collections μ •λ ¬
1. ArrayList > μˆœμ„œ 쑴재 > μ •λ ¬ O
2. HashMap > μˆœμ„œ 미쑴재 > μ •λ ¬ X
3. Queue > μˆœμ„œ 쑴재 > μ •λ ¬ X (λ“€μ–΄μ˜¨ μˆœμ„œκ°€ μ€‘μš”ν•¨)
4. Stack > μˆœμ„œ 쑴재 > μ •λ ¬ X (λ“€μ–΄μ˜¨ μˆœμ„œκ°€ μ€‘μš”ν•¨)
5. HashSet > μˆœμ„œ 미쑴재 > μ •λ ¬ X

λ³΄ν†΅μ˜ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ μ‹œ Collections.sort()λ₯Ό μ‚¬μš©ν•œλ‹€.
μ‚¬μš©μž μ •μ˜ 정렬이 ν•„μš”ν•˜λ‹€λ©΄ Comparatorμ—μ„œ κ΅¬ν˜„ν•œλ‹€.

ArrayList<Integer> list = new ArrayList<>();

for (int i = 0; i < 10; i++) {
	list.add((int) (Math.random() * 100)); // 0 ~ 99
}

//		Collections.sort(list); // = Arrays.sort() μ˜€λ¦„μ°¨μˆœ
//		Collections.sort(list, new Comparator<Integer>() { // λ‚΄λ¦Όμ°¨μˆœ
//			@Override
//			public int compare(Integer o1, Integer o2) {
//				return o2 - o1;
//			}
//		});

// μ˜€λ¦„μ°¨μˆœ -> Collections.sort()μ‚¬μš©, κ·Έ μ™Έ μ •λ ¬ -> list.sort()μ‚¬μš© μΆ”μ²œ
list.sort(new Comparator<Integer>() { // 무쑰건 Comparator κ΅¬ν˜„ν•΄μ•Ό 함.
	@Override
	public int compare(Integer o1, Integer o2) {
		// TODO Auto-generated method stub
		return o1 - o2;
	}
});

Ex68

this vs super

  • 객체 지정 μ—°μ‚°μž
  • this: 자기 μžμ‹ 
  • super: λΆ€λͺ¨

Ex69_LinkedList

물리 ꡬ쑰 + μΈν„°νŽ˜μ΄μŠ€(μ‚¬μš©λ²•)

  • Array + List
  • Linked + List
  • Hash + Map
  • Tree + Map
  • Hash + Set
  • Tree + Set

ArrayList

  • λͺ¨λ“  μ»¬λ ‰μ…˜ μ€‘μ—μ„œ μš”μ†Œμ— μ ‘κ·Όν•˜λŠ” 속도가 κ°€μž₯ λΉ λ₯΄λ‹€.
  • μš”μ†Œ μ‚½μž…/μ‚­μ œμ— λŒ€ν•œ λΉ„μš©μ΄ 많이 λ“ λ‹€. > shift O
  • 보톡 초기 생성 이후에 μ‚½μž…, μ‚­μ œκ°€ μ—†μœΌλ©΄μ„œ μ €μž₯ν•  λ³€μˆ˜μ˜ 개수λ₯Ό λͺ¨λ₯Ό λ•Œ μ‚¬μš©ν•œλ‹€.

LinkedList

  • μš”μ†Œμ— μ ‘κ·Ό 속도가 μƒλŒ€μ μœΌλ‘œ λŠλ¦¬λ‹€.
  • μš”μ†Œ μ‚½μž…/μ‚­μ œμ— λŒ€ν•œ λΉ„μš©μ΄ 거의 μ—†λ‹€. > shift X
  • 초기 생성 이후 μ‚½μž…, μ‚­μ œκ°€ λ§Žμ„ λ•Œ μ‚¬μš©ν•œλ‹€.
  • List μΈν„°νŽ˜μ΄μŠ€λ‘œ κ΅¬ν˜„ν•˜μ—¬ ArrayList와 μ‚¬μš©λ²•μ΄ μœ μ‚¬ν•˜λ‹€. 개발자 κ²½ν—˜μ„ μ‚¬μš©ν•  수 μžˆλ‹€.
  • ArrayList와 내뢀ꡬ쑰가 달라 μ‚¬μš© μš©λ„κ°€ λ‹€λ₯΄λ‹€.

Collection(I) > List(I) > ArrayList(C), LinkedList(C)

LinkedList μ’…λ₯˜

  1. LinkedList: 일방 톡행
  2. Double LinkedList: μ–‘λ°©ν–₯ 톡행
  3. Double Circle LinkedList: μ–‘λ°©ν–₯ + 처음~끝 μ—°κ²° > μžλ°”μ˜ LinkedList

=> λ°°μ—΄μ˜ μ ‘κ·Ό -> μ‹œκ°„ λ³΅μž‘λ„ : O(1) -> λ°°μ—΄μ˜ μ‹œμž‘ μ£Όμ†Œκ°’κ³Ό 인덱슀λ₯Ό μ΄μš©ν•œ λ‹¨μˆœ κ³„μ‚°μœΌλ‘œ ν•œλ²ˆμ— μ£Όμ†Œλ₯Ό μ°Ύμ•„κ°„λ‹€.


Ex70_TreeSet

TreeSet

  • Tree ꡬ쑰 > 이진 트리 ꡬ쑰(이진 탐색 트리, Binary Search Tree)
  • Set μ‚¬μš©λ²•
    -> 값을 넣을 λ•Œ μžλ™μœΌλ‘œ μ •λ ¬λ˜μ–΄ λ“€μ–΄κ°„λ‹€. μ—­μˆœ 정렬은 μ•ˆλœλ‹€.

Set

  • μˆœμ„œκ°€ μ—†λ‹€.
  • 쀑볡값을 가지지 μ•ŠλŠ”λ‹€.

TreeSet 고유 κΈ°λŠ₯

set2.first(); //μ‹œμž‘ κ°’
set2.last(); // 끝 κ°’
set2.headSet(30); // νŒŒλΌλ―Έν„°λ³΄λ‹€ μž‘μ€ κ°’λ“€
set2.tailSet(30); // νŒŒλΌλ―Έν„°λ³΄λ‹€ 큰 κ°’λ“€
set2.subSet(20, 40) // ν•΄λ‹Ή λ²”μœ„ λ‚΄μ˜ κ°’λ“€

set을 ArrayList둜 λ§Œλ“€ 수 μžˆλ‹€.

ArrayList<Integer> list = new ArrayList<>(set2);

Ex71_TreeMap

TreeMap

  • Tree > 이진 탐색 트리 > μžλ™ μ •λ ¬
  • Map > ν‚€ + κ°’ > μ—°κ΄€ λ°°μ—΄

TreeMap 고유 κΈ°λŠ₯

map.firstKey(); // 첫번째 ν‚€
map.lastKey(); // λ§ˆμ§€λ§‰ ν‚€
map.headMap("m"); // νŒŒλΌλ―Έν„°λ³΄λ‹€ μž‘μ€ ν‚€+κ°’λ“€
map.tailMap("m"); // νŒŒλΌλ―Έν„°λ³΄λ‹€ 큰 ν‚€+κ°’λ“€
map.subMap("r", "y") // νŒŒλΌλ―Έν„°λ“€ μ€‘κ°„μ˜ ν‚€+κ°’λ“€

List

  • ArrayList > 배열이 ν•„μš”ν•  λ•Œ / μ‚½μž…, μ‚­μ œ(X) *
  • LinkedList > ArrayList λŒ€μ²΄μ œ / μ‚½μž…, μ‚­μ œ(O)
  • Stack > μŠ€νƒ ꡬ쑰 ν•„μš”
  • Queue > 큐 ꡬ쑰 ν•„μš”
  • Vector => ArrayList와 거의 λΉ„μŠ·ν•˜λ‚˜ 잘 μ•ˆμ”€. Thread λΆ€λΆ„μ—μ„œ 쑰금 λ‹€λ₯΄λ‹€.

Set (근데 μ •λ ¬ 거의 μ•ˆμ”€)

  • HashSet > 쀑볡값 배제, μœ μΌν•œ 집합 *
  • TreeSet > HashSet + μ •λ ¬

Map (근데 μ •λ ¬ 거의 μ•ˆμ”€)

  • HashMap > ν‚€/κ°’ μ—°κ΄€ 배열이 ν•„μš”ν•  λ•Œ *

  • TreeMap > HashMap + μ •λ ¬

  • HashTable => HashMapκ³Ό 거의 λΉ„μŠ·ν•˜λ‚˜ 잘 μ•ˆμ”€. Thread λΆ€λΆ„μ—μ„œ 쑰금 λ‹€λ₯΄λ‹€.

  • Properties > JSON, XML => 잘 μ•ˆμ”€.


Ex72_Lambda

λžŒλ‹€μ‹, Lambda Expression

  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° > 지원
  • μžλ°” > λžŒλ‹€μ‹ > μ»¬λ ‰μ…˜ μ‘°μž‘(= 슀트림)
  • λžŒλ‹€μ‹μ„ μ‚¬μš©ν•˜λ©΄ μ½”λ“œκ°€ 간결해진닀.
    λ©”μ†Œλ“œ ν‘œκΈ°λ²•)
  • λžŒλ‹€μ‹μ€ λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ§€λŠ” μ½”λ“œλΈ”λŸ­μ΄λ‹€. =λ©”μ†Œλ“œ)
  • μžλ°”μ˜ λžŒλ‹€μ‹μ€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•΄μ„œ λ§Œλ“ λ‹€.(μžλ°”λ§Œμ˜ νŠΉμ§•)

λžŒλ‹€μ‹ ν˜•μ‹

  • μΈν„°νŽ˜μ΄μŠ€ λ³€μˆ˜ = λžŒλ‹€μ‹;

  • ex) MyInterface m1 = () -> {};

  • (λ§€κ°œλ³€μˆ˜) -> {μ‹€ν–‰μ½”λ“œ}

  • μžλ°”μ˜ λ©”μ†Œλ“œμ˜ λ‹€λ₯Έ ν‘œν˜„

  • a. (λ§€κ°œλ³€μˆ˜): λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜ λ¦¬μŠ€νŠΈμ™€ 동일

  • b. ->: ν™”μ‚΄ν‘œ(Arrow), μ½”λ“œλΈ”λŸ­ 호좜 μ—­ν• 

  • c. {μ‹€ν–‰μ½”λ“œ}: λ©”μ†Œλ“œμ˜ κ΅¬ν˜„λΆ€μ™€ 동일


ν”„λ‘œμ νŠΈ 진행 μ„€λͺ…

μ–΄λ–»κ²Œ μ§„ν–‰λ˜μ–΄μ•Ό ν•˜λŠ”μ§€ μ„€λͺ…을 λ“€μ—ˆλ‹€. 첫 번째 ν”„λ‘œμ νŠΈμ˜ 주제λ₯Ό λ…Όμ˜ν–ˆλ‹€.

profile
μ°¨κ·Όμ°¨κ·Ό ν•˜λ‚˜μ”©

0개의 λŒ“κΈ€