TIL 23.07.26

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

TIL

λͺ©λ‘ 보기
47/146

πŸ“ŒToday I Learned

JAVA μˆ˜μ—… - λ°°μ—΄

배열에 λŒ€ν•˜μ—¬ κ³΅λΆ€ν–ˆλ‹€.

β—ˆEx32_Array.java

λ°°μ—΄, Array

  • 자료 ꡬ쑰
  • μžλ£Œν˜• -> μ°Έμ‘°ν˜•
  • 집합 -> 집합 μžλ£Œν˜• -> 데이터λ₯Ό μ—¬λŸ¬ 개 μ €μž₯ν•  수 μžˆλŠ” μžλ£Œν˜•
  • 같은 μžλ£Œν˜• / 같은 성격 -> 집합

  • μ•Œκ³ λ¦¬μ¦˜
  • 자료ꡬ쑰
    1. μžλ£Œν˜• + λ³€μˆ˜
    2. μ½˜μ†” -> μž…μΆœλ ₯
    3. μ œμ–΄λ¬Έ(β˜†β˜†β˜†β˜†β˜†) -> μ•Œκ³ λ¦¬μ¦˜ 생성에 μ£Όμš” μ—­ν• 
    4. λ°°μ—΄(β˜†β˜†β˜†β˜†β˜†β˜†β˜†β˜†) -> 자료ꡬ쑰 쀑 ν•˜λ‚˜

배열이 없을 λ•Œ

-> μž…λ ₯ν•  개수 만큼 λ³€μˆ˜ 생성
-> μž…λ ₯ν•  개수 만큼 μ΄ˆκΈ°κ°’ μž…λ ₯
=> λ²ˆκ±°λ‘­λ‹€.

배열이 μžˆλ‹€λ©΄?

=> ν•œλ²ˆμ— κ°€λŠ₯!

λ°°μ—΄ μ„ μ–Έν•˜κΈ°(μƒμ„±ν•˜κΈ°)

  • μžλ£Œν˜•[] λ°°μ—΄λͺ… = new μžλ£Œν˜•[길이];
    ex) int[] kors = new int[300];
    - ν•΄λ‹Ή λ°°μ—΄ 생성 μ‹œ λ©”λͺ¨λ¦¬ μ–΄λ”˜κ°€μ— int[300]이 μž‘νžŒλ‹€.(μ—°μ†λœ int둜.)
    - μ‹œμž‘λ˜λŠ” λ°°μ—΄μ˜ μ£Όμ†Œ λ²ˆμ§€κ°€ korsλΌλŠ” λ³€μˆ˜μ— λ“€μ–΄μžˆλ‹€.
    - int[] λ₯Ό ν•˜λ‚˜μ˜ μžλ£Œν˜•μœΌλ‘œ 보자.

λ§Œμ•½, λ°°μ—΄μ˜ 길이λ₯Ό λ²—μ–΄λ‚œ μ±„λ‘œ μž…λ ₯을 ν•œλ‹€λ©΄?

int[] nums = new int[3];
nums[3] = 400;

java.lang.ArrayIndexOutOfBoundsException:Index 3 out of bounds for length 3

λΌλŠ” 였λ₯˜κ°€ λ°œμƒν•œλ‹€. μ΄λŠ” λ°°μ—΄μ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚¬λ‹€λŠ” 였λ₯˜μ΄λ‹€. μ‹€μ œλ‘œ 배열을 μ‚¬μš©ν•  λ•Œ 많이 λ°œμƒν•˜λŠ” 였λ₯˜μ΄λ―€λ‘œ μ•Œμ•„λ‘λ©΄ μ’‹λ‹€.

λ°°μ—΄μ˜ 방을 μ›ν•˜λŠ” μˆœμ„œλŒ€λ‘œ μ ‘κ·Όν•˜λ €λ©΄

-> 탐색해야 ν•œλ‹€.
-> for문을 μ‚¬μš©ν•œλ‹€.

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

보톡 forλ¬Έ μ‚¬μš© μ‹œ

for (int i = 1; i <= 10; i++) { // μ΄λ ‡κ²ŒλŠ” 잘 μ•ˆν•¨

}
        
for (int i = 0; i < 10; i++) { // 잘 씀

}

μœ„ λ³΄λ‹€λŠ” μ•„λž˜μ˜ μ΄ˆκΈ°μ‹κ³Ό 쑰건식을 많이 μ“΄λ‹€.

각 μžλ£Œν˜•μ΄ 달라도 배열을 μ„ μ–Έν•˜λŠ” 방식은 κ°™λ‹€.

단, 배열을 μ„ μ–Έν•œλ‹€λŠ” 것은 λ°°μ—΄ λ‚΄ μžλ£Œν˜•μ„ μ €μž₯ν•  λ³€μˆ˜λ₯Ό μƒμ„±ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€.
λ³€μˆ˜λ§Œ μƒμ„±ν•˜κ³  λ‚΄λΆ€μ˜ 값을 μ •ν•˜μ§€ μ•ŠμœΌλ©΄ 배열은 μ΄ˆκΈ°κ°’μœΌλ‘œ μ„€μ •λ˜μ–΄μžˆλ‹€.
-> μ‹€μ œλ‘œ μœ μš©ν•œ 값은 μ—†λ‹€κ³  보면 λœλ‹€.

λ©”λͺ¨λ¦¬μ˜ 곡간은 ν•œ 번 ν• λ‹Ήλ˜λ©΄, μ ˆλŒ€λ‘œ 곡간을 더 λŠ˜λ¦¬κ±°λ‚˜ 쀄일 수 μ—†λ‹€.

=> 배열은 μ²˜μŒλΆ€ν„° μ‚¬μš©ν•˜λŠ” μ΅œλŒ€ 길이λ₯Ό 미리 μ˜ˆμΈ‘ν•΄μ•Ό ν•œλ‹€.(λ‚˜μ€‘μ— μˆ˜μ •ν•  수 μ—†λ‹€.)

λ°°μ—΄μ˜ κΈΈμ΄λŠ” μ΄ˆκΈ°ν™” ν•  λ•Œ 뿐만 μ•„λ‹ˆλΌ λŸ°νƒ€μž„ λ•Œ μ •ν•  μˆ˜λ„ μžˆλ‹€.

ex) μ‚¬μš©μžμ—κ²Œ 숫자λ₯Ό μž…λ ₯λ°›κ³ , 이λ₯Ό λ°°μ—΄μ˜ 크기둜 μ •ν•  수 μžˆλ‹€.

λ°°μ—΄ 볡사

  • κ°’ν˜• 볡사 -> Side Effectκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

  • κ°œλ°œμžκ°€ λ§Œλ“œλŠ” λͺ¨λ“  지역 λ³€μˆ˜λŠ” stack에 μƒμ„±λœλ‹€.
    κ°’ν˜• λ³€μˆ˜λŠ” stack속에 μ‹€μ œ 값이 λ“€μ–΄μžˆλ‹€.
    μ°Έμ‘°ν˜• λ³€μˆ˜λŠ” stack속에 μ‹€μ œ 값이 μ•„λ‹Œ, λ°μ΄ν„°μ˜ μ£Όμ†Œ(μ°Έμ‘°κ°’)이 λ“€μ–΄μžˆλ‹€.

  • newκ°€ λΆ™μ–΄μžˆμœΌλ©΄ stack이 μ•„λ‹ˆλΌ heap에 μ‹€μ œ 값이 μ €μž₯λœλ‹€κ³  μƒκ°ν•˜μž.
    λ°°μ—΄ 생성 μ‹œ μ‹€μ œ 값은 heap에 생긴닀.
    λ°°μ—΄λͺ…은 stack에 μƒμ„±λœλ‹€.

  • λ°°μ—΄ λ³€μˆ˜λΌλ¦¬μ˜ λ³΅μ‚¬λŠ” μ£Όμ†Œκ°’ 볡사닀.
    원본과 볡사본 배열은 같은 μ£Όμ†Œκ°’μ„ κ°€μ§ˆ λ•Œ, 같은 배열을 가리킨닀.
    -> λ‘˜ 쀑 ν•˜λ‚˜λ₯Ό μ‘°μž‘ν•˜λ©΄ λ‚˜λ¨Έμ§€ 배열도 영ν–₯λ°›λŠ”λ‹€.
    -> Side Effectκ°€ λ°œμƒν•œλ‹€.
    -> 쑰심!!

μ΄λŠ” 같은 μ£Όμ†Œκ°’μ„ 가진 얕은 λ³΅μ‚¬μ˜ 그림이닀.


λ°°μ—΄μ˜ 볡사

  1. 얕은 볡사, Shallow Copy
  • μ£Όμ†Œκ°’ 볡사
  • Side Effect λ°œμƒ
  1. κΉŠμ€ 볡사, Deep Copy
  • μš”μ†Œ 볡사
  • Side Effect μ—†μŒ

κ°œλ°œμžλŠ” stackκΉŒμ§€ μ ‘κ·Όν•  수 μžˆλ‹€.

heap은 stack을 κ±°μ³μ•Όλ§Œ 접근이 κ°€λŠ₯ν•˜λ‹€.

얕은 볡사와 κΉŠμ€ 볡사, κ°œλ°œμžκ°€ μ ‘κ·Όν•˜λŠ” stack의 그림이닀.


μœ ν‹Έλ¦¬ν‹° 클래슀

  • int -> Integer
  • double -> Double

Arrays

  • λ°°μ—΄ μœ ν‹Έλ¦¬ν‹° 클래슀

덀프(dump): 객체의 μƒνƒœλ₯Ό ν•˜λ‚˜μ˜ λ¬Έμžμ—΄λ‘œ ν’€μ–΄λ‚΄λŠ” 행동.

int[] nums = new int[3];
/// ...
Arrays.toString(nums); // λ°°μ—΄ λ‚΄μ˜ 값을 String으둜 λ³€ν™˜.
System.out.println(Arrays.toString(nums)); //dump. λ°°μ—΄μ˜ μš”μ†Œλ₯Ό λͺ¨λ‘ ν•œλˆˆμ— λ³Ό 수 μžˆλ‹€.

Arrays.copyOfRange(nums, 0, nums.length); //0 ~ length-1κΉŒμ§€ κΉŠμ€λ³΅μ‚¬λ₯Ό ν•œλ‹€.

λ°°μ—΄ μžλ™ μ΄ˆκΈ°ν™”

  • λ°°μ—΄(μ°Έμ‘°ν˜•)은 생성 직후에 μžλ™μœΌλ‘œ μ΄ˆκΈ°ν™”κ°€ λœλ‹€.

μ΄ˆκΈ°ν™” κ·œμΉ™
1. μ •μˆ˜ λ°°μ—΄ -> 0
2. μ‹€μˆ˜ λ°°μ—΄ -> 0.0
3. 문자 λ°°μ—΄ -> \0 -> μ½˜μ†”μ—μ„œλŠ” 좜λ ₯해도 μ‹€μ œλ‘œ μ•ˆλ³΄μΈλ‹€.
4. 논리 λ°°μ—΄ -> false
5. μ°Έμ‘°ν˜• λ°°μ—΄ > null


λ°°μ—΄ μ΄ˆκΈ°ν™” 리슀트

//1번 방법
int[] nums = new int[3];
// μ΄ˆκΈ°ν™”
nums[0] = 100;
nums[1] = 200;
nums[2] = 300;

//2번 방법
int[] nums2 = new int[] { 100, 200, 300 }; // 0, 0, 0 μ•„λ‹ˆκ³  μ²˜μŒλΆ€ν„° 100, 200, 300으둜 μ΄ˆκΈ°ν™”

//3번 방법
int[] nums3 = { 100, 200, 300 };
System.out.println(Arrays.toString(nums3));

String[] names1 = new String[3];

//λ°°μ—΄μ˜ μžλ£Œν˜•μ΄ 달라도 μ΄ˆκΈ°ν™” 방법은 κ°™λ‹€.

μ •λ ¬

  • μš”μ†Œκ°„μ˜ 크기 비ꡐ ν›„ -> 재배치 ν•œλ‹€.
  1. μ˜€λ¦„μ°¨μˆœ
    a. 숫자: μž‘μ€ 수 -> 큰 수
    b. λ¬Έμžμ—΄: 문자 μ½”λ“œκ°’ 순으둜
    c. λ‚ μ§œμ‹œκ°„: κ³Όκ±° -> 미래
  2. λ‚΄λ¦Όμ°¨μˆœ
    a. 숫자: 큰 수 -> μž‘μ€ 수
    b. λ¬Έμžμ—΄: 문자 μ½”λ“œ κ°’ μ—­μˆœμœΌλ‘œ
    c. λ‚ μ§œμ‹œκ°„: 미래 > κ³Όκ±°

μ •λ ¬ κ΅¬ν˜„ 방법
1. κ°œλ°œμžκ°€ 직접 κ΅¬ν˜„
2. JDK or Library μ‚¬μš© -> 이 방법을 주둜 μ‚¬μš©ν•œλ‹€.

버블 μ •λ ¬

  • μ˜€λ¦„μ°¨μˆœ μ •λ ¬
for (int i = 0; i < nums.length - 1; i++) { // 0, 1, 2, 3 > cycle
	for (int j = 0; j < nums.length - 1 - i; j++) { // 비ꡐ ν›„ μŠ€μ™‘.
		if (nums[j] > nums[j + 1]) { // μ˜€λ¦„μ°¨μˆœ. λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ ν•˜λ €λ©΄ λ“±ν˜Έ λ°©ν–₯만 λ°”κΏ”μ£Όλ©΄ λœλ‹€.
			int temp = nums[j];
			nums[j] = nums[j + 1];
			nums[j + 1] = temp;
		}
	}
}
System.out.println(Arrays.toString(nums));

Arrays.sort(nums);
도 μžˆλ‹€. μ΄λŠ” 퀡 μ •λ ¬, μ˜€λ¦„μ°¨μˆœμ΄λ‹€.


문제 풀이

λ°°μ—΄ 문제λ₯Ό ν’€μ—ˆλ‹€. Q061 ~ Q069 9문제 ν’€μ—ˆλ‹€.


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

0개의 λŒ“κΈ€