Day 09(21.09.13) - Gomserker/Java-101 GitHub Wiki

10. μ°Έμ‘° νƒ€μž…

1. λ©”λͺ¨λ¦¬ μ‚¬μš© μ˜μ—­

(1) Method μ˜μ—­

Method μ˜μ—­μ—λŠ” μ½”λ“œμ—μ„œ μ‚¬μš©λ˜λŠ” 'Class'듀을 클래슀 λ‘œλ”λ‘œ 읽어듀여, field 데이터, method 데이터, method μ½”λ“œ, constructor μ½”λ“œ 등을 λΆ„λ₯˜ν•˜μ—¬ μ €μž₯ν•œλ‹€.

(2) Heap μ˜μ—­

객체와 배열이 μƒμ„±λ˜λŠ” μ˜μ—­μ΄λ‹€. Heap μ˜μ—­μ— μƒμ„±λœ 객체와 배열은 Stack μ˜μ—­μ˜ λ³€μˆ˜λ‚˜ λ‹€λ₯Έ 객체의 ν•„λ“œμ—μ„œ μ°Έμ‘°ν•œλ‹€.
μ°Έμ‘°ν•˜λŠ” λ³€μˆ˜λ‚˜ fieldκ°€ μ—†λ‹€λ©΄ JVM은 GCλ₯Ό μ‹€ν–‰μ‹œμΌœ μžλ™μœΌλ‘œ Heap μ˜μ—­μ—μ„œ μ œκ±°ν•œλ‹€.
Cμ–Έμ–΄ κ³„μ—΄μ—μ„œλŠ” 이런 의미 μ—†λŠ” 객체λ₯Ό μ‚­μ œν• λ•Œ ν¬μΈν„°λΌλŠ” κ±Έ λ”°λ‘œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€κ³  ν•œλ‹€.

(3) Stack μ˜μ—­

각 Thread λ§ˆλ‹€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•˜λ©° μ‹œμž‘λ  λ•Œ ν• λ‹Ήλœλ‹€.
Stack은 Methodλ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ Frame을 μΆ”κ°€(Push)ν•˜κ³ , λ©”μ†Œλ“œκ°€ μ’…λ£Œλ˜λ©΄ ν•΄λ‹Ή Frame을 제거(Pop)ν•˜λŠ” λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€.
ν”„λ ˆμž„ λ‚΄λΆ€μ—λŠ” 둜컬 λ³€μˆ˜ Stack이 μžˆλŠ”λ°, κΈ°λ³Έ νƒ€μž…(int, double λ“±) λ³€μˆ˜μ™€ μ°Έμ‘° νƒ€μž… λ³€μˆ˜κ°€ Pushλ˜κ±°λ‚˜ Popλœλ‹€.
λ³€μˆ˜μ˜ 초기 값을 μ €μž₯ν• λ•Œ(μ΄ˆκΈ°ν™”) 이 μ˜μ—­μ— λ³€μˆ˜κ°€ μƒμ„±λ˜λŠ”λ°, μ„ μ–Έλœ 블둝 μ•ˆμ—μ„œλ§Œ Stack에 μ‘΄μž¬ν•˜κ³  이λ₯Ό λ²—μ–΄λ‚˜λ©΄ Popλœλ‹€.

2. λ°°μ—΄

λ°°μ—΄μ΄λž€?

ν•˜λ‚˜μ˜ λ³€μˆ˜λŠ” ν•˜λ‚˜μ˜ λ°μ΄ν„°λ§Œ μ €μž₯ν•  수 μžˆλ‹€. 이 말은, λ°μ΄ν„°μ˜ μˆ˜κ°€ λ§Žμ•„μ§€λ©΄ ν•„μ—°μ μœΌλ‘œ ν•„μš”ν•œ λ³€μˆ˜μ˜ μˆ˜κ°€ μ¦κ°€ν•œλ‹€λŠ” μ–˜κΈ°λ‹€. 예λ₯Ό λ“€μ–΄, ν•™μƒμ˜ μ„±μ μ΄λ‚˜ μ‚¬μ›μ˜ 근무 평가λ₯Ό κΈ°λ‘ν•œλ‹€κ³  ν•  λ•Œ, μ†Œμˆ˜ μΈμ›μ˜ 경우 학생 1, λ˜λŠ” 사원 1 의 λ³€μˆ˜λ₯Ό λ”°λ‘œλ”°λ‘œ μƒμ„±ν•œλ’€, μ „λΆ€ κ°œλ³„λ‘œ 관리할 수 μžˆλ‹€. ν•˜μ§€λ§Œ, 학ꡐ 전체 λ‹¨μœ„λ‚˜ 전사 μ°¨μ›μ˜ 관리가 ν•„μš”ν•œ κ²½μš°μ—λŠ” κ°œλ³„ 인원에 λŒ€ν•œ λ³€μˆ˜λ₯Ό λ”°λ‘œ μƒμ„±ν•˜λŠ” 것은 ν˜„μ‹€μ μœΌλ‘œ 무리에 가깝닀. μ΄μ μ΄λ‚˜ 평균 λ“±, λ‚΄λΆ€ 데이터λ₯Ό ν™œμš©ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•  κ²½μš°μ—λŠ” 말할 것도 μ—†λ‹€.
μ΄λŸ¬ν•œ μž‘μ—…μ„ 효율적으둜 μˆ˜ν–‰ν•  수 있게 λ„μ™€μ£ΌλŠ” 것이 λ°”λ‘œ 배열이닀. 배열은 같은 νƒ€μž…μ˜ 데이터λ₯Ό μ—°μ†λœ 곡간에 λ‚˜μ—΄μ‹œν‚€κ³ , 각 ν…Œμ΄ν„°μ— Indexλ₯Ό λΆ€μ—¬ν•΄ 놓은 μžλ£Œκ΅¬μ‘°μ΄λ‹€. 이λ₯Ό μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ μ„€λͺ…ν•˜μžλ©΄,

학생 1번 : κΉ€μ² μˆ˜
학생 2번 : κΉ€μ˜ν¬
학생 3번 : ꢌ민수
...

μœ„μ™€ 같이 학생 λͺ‡ λ²ˆμ΄λΌλŠ” Index에 ν•™μƒμ˜ 이름을 μ €μž₯ν•˜λŠ” μžλ£Œκ΅¬μ‘°λΌλŠ” 것이닀.
μ€‘μš”ν•œ 점은 λ°°μ—΄μ˜ indexλŠ” 1이 μ•„λ‹ˆλΌ 0 λΆ€ν„° μ‹œμž‘λœλ‹€.
μ•„λž˜λŠ” 학생 30λͺ…μ˜ 평균 점수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“ λ‹€κ³  κ°€μ •ν–ˆμ„ λ•Œμ˜ μ½”λ“œμ΄λ‹€.

int sum = 0;
for(int i=0; i < 30; i++ {
  sum += score[i];
 }
int avg = sum / 30;

μœ„ μ½”λ“œμ˜ for문은 0λΆ€ν„° 29κΉŒμ§€ 30개의 index의 dataλ₯Ό μ „λΆ€ λ”ν•œ 값을 sum으둜 λ°˜ν™˜ν•œλ‹€.
κ·Έλ ‡κ²Œ λ°˜ν™˜λœ sum을 30으둜 λ‚˜λˆ„μ–΄ 평균 avgλ₯Ό μ–»κ²Œλ˜λŠ”λ°, μ΄λ ‡κ²Œ ν•˜λ©΄ 30λͺ…이 μ•„λ‹ˆλΌ 수 천λͺ…μ˜ 평균을 κ΅¬ν• λ•Œλ„ for문의 숫자만 μˆ˜μ •ν•˜λ©΄ λ˜λ―€λ‘œ μ—„μ²­ 효율적인 μžλ£Œκ΅¬μ‘°λΌν•  수 μžˆλ‹€.

λ°°μ—΄μ˜ νŠΉμ§•

  1. 배열은 같은 νƒ€μž…μ˜ λ°μ΄ν„°λ§Œ μ €μž₯ν•  수 μžˆλ‹€.
    int 배열은 int κ°’λ§Œ μ €μž₯ν•  수 있고, String 배열은 String만 μ €μž₯ν•  수 μžˆλ‹€. λ§Œμ•½ λ‹€λ₯Έ νƒ€μž…μ˜ 값을 μ €μž₯ν•˜λ €κ³  ν•˜λ©΄ Type mismatch둜 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
    λ°°μ—΄μ˜ νƒ€μž…μ€ 배열이 선언됨과 λ™μ‹œμ— κ²°μ •λ˜λŠ”λ° μ΄λŠ” μ•„λž˜μ—μ„œ 확인할 수 μžˆλ‹€.
  2. λ°°μ—΄μ˜ indexλŠ” 0λΆ€ν„° μ‹œμž‘μ΄λ‹€.
    μ˜ˆμ‹œμ—μ„œ μ–ΈκΈ‰ν–ˆμ§€λ§Œ λ°°μ—΄μ˜ indexλŠ” 1이 μ•„λ‹Œ μ•„λž˜μ™€ 같이 0λΆ€ν„° μ‹œμž‘λœλ‹€.
data   1   2   3   4   5  
index [0] [1] [2] [3] [4]
  1. ν•œ 번 μƒμ„±λœ 배열은 길이λ₯Ό λ³€κ²½ν•  수 μ—†λ‹€.
    3개의 값을 μ €μž₯ν•˜λŠ” 배열을 μƒμ„±ν•˜λ©΄ 도쀑에 5개의 값을 μ €μž₯ν•˜λŠ” λ°°μ—΄λ‘œ μˆ˜μ •ν•  수 μ—†κ³ , κ·Έ λ°˜λŒ€λ„ λ§ˆμ°¬κ°€μ§€λ‹€.
    λ§Œμ•½ 5개의 값을 μ €μž₯ν•΄μ•Όν•  경우, 길이 5의 μƒˆλ‘œμš΄ 배열을 μƒμ„±ν•˜κ³  κΈ°μ‘΄ ν•­λͺ©μ„ μƒˆλ‘œ μƒμ„±ν•œ λ°°μ—΄λ‘œ 볡사해야 ν•œλ‹€.

  2. λ°°μ—΄ λ³€μˆ˜λŠ” μ°Έμ‘° λ³€μˆ˜μ— μ†ν•œλ‹€.
    배열도 κ°μ²΄μ΄λ―€λ‘œ Heap μ˜μ—­μ— μƒμ„±λ˜κ³ , λ°°μ—΄ λ³€μˆ˜λŠ” Heap μ˜μ–΅μ˜ λ°°μ—΄ 객체λ₯Ό μ°Έμ‘°ν•˜κ²Œ λœλ‹€. μ—¬κΈ°μ„œ μ°Έμ‘°ν•  λ°°μ—΄ 객체가 μ—†λ‹€λ©΄ λ°°μ—΄ λ³€μˆ˜λŠ” null κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”λ  수 μžˆλ‹€.

3. λ°°μ—΄μ˜ μ„ μ–Έ

배열을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ°°μ—΄ λ³€μˆ˜λ₯Ό μ„ μ–Έν•΄μ•Ό ν•œλ‹€. 두 κ°€μ§€ 방법이 μžˆλŠ”λ°,

νƒ€μž…[] λ³€μˆ˜;                         νƒ€μž… λ³€μˆ˜[]
int[] intArray;                     int intArray[];
double[] doubleArray;               double double[];
String[] strArray;                  Strubg strArray[];

μœ„μ™€ 같이 배열을 μ„ μ–Έν•  수 μžˆλ‹€.

1. λ°°μ—΄μ˜ 값을 μ•Œκ³  μžˆμ„λ•Œ κ°’ λͺ©λ‘μœΌλ‘œ 배열을 μƒμ„±ν•˜λŠ” 법

λ°°μ—΄ ν•­λͺ©μ— μ €μž₯될 value의 listκ°€ μžˆλ‹€λ©΄ λ‹€μŒκ³Ό 같이 κ°„λ‹¨ν•˜κ²Œ λ°°μ—΄ 객체λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

λ°μ΄ν„°νƒ€μž…[] λ³€μˆ˜ = {value0, value1, value2, value3, ...

int[] scores = {83, 90, 87}

μœ„μ™€ 같은 경우, scoresλΌλŠ” λ³€μˆ˜μ— 83, 90 , 87의 값이 μ €μž₯λ˜λŠ” 길이 3의 배열이 μžλ™μœΌλ‘œ μƒμ„±λœλ‹€.
배열이 λ¨Όμ € μƒμ„±λ˜κ³  value listκ°€ λ‚˜μ€‘μ— κ²°μ •λ˜λŠ” 상황이라면 λ‹€μŒμ˜ 방법을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.

2. new μ—°μ‚°μžλ‘œ λ°°μ—΄ 생성

value listλŠ” μ—†μ§€λ§Œ, λ‚˜μ€‘μ— valueλ₯Ό μ €μž₯ν•  배열을 미리 λ§Œλ“€κ³  μ‹Άλ‹€λ©΄ new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄ λ°°μ—΄ 객체λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

νƒ€μž…[] λ³€μˆ˜ = new νƒ€μž…[길이];

int[] intArray = new int[5];

μœ„μ˜ κ²½μš°μ—” 길이가 5인 λ°°μ—΄, intArrayκ°€ μƒμ„±λœλ‹€. μ—¬κΈ°μ„œ κΈΈμ΄λž€, 배열이 μ €μž₯ν•  수 μžˆλŠ” κ°’μ˜ 수λ₯Ό λ§ν•œλ‹€.
μœ„μ—μ„œ λ§ν–ˆλ“―μ΄ λ‚˜μ€‘μ— valueλ₯Ό μ €μž₯ν• λ•Œ new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄ 배열을 μƒμ„±ν•˜λŠ”λ°, μ΄λ•Œ λ°°μ—΄μ˜ valueλŠ” 0으둜 μ΄ˆκΈ°ν™”λœλ‹€.
μ΄λ ‡κ²Œ μƒμ„±λœ 배열에 valueλ₯Ό μ €μž₯ν•˜λ €λ©΄ λŒ€μž… μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄λœλ‹€.

λ³€μˆ˜[index] = value;  

intArray[0] = 1;

μœ„μ˜ κ²½μš°μ—” 생성해둔 intArray의 0번 인덱슀, 즉 첫번째 μœ„μΉ˜μ— 1μ΄λΌλŠ” valueλ₯Ό μ €μž₯ν•œλ‹€λŠ” 뜻이 λœλ‹€.

3. λ°°μ—΄μ˜ 길이

λ°°μ—΄μ˜ κΈΈμ΄λž€ 배열에 μ €μž₯ν•  수 μžˆλŠ” ν•­λͺ© 수λ₯Ό λ§ν•œλ‹€. μ½”λ“œμ—μ„œ λ°°μ—΄μ˜ 길이λ₯Ό μ–»μœΌλ €λ©΄ λ°°μ—΄ 객체의 length fieldλ₯Ό 읽으면 λœλ‹€.
λ°°μ—΄μ˜ length fieldλ₯Ό 읽으렀면 λ°°μ—΄ λ³€μˆ˜μ— '.' μ—°μ‚°μžλ₯Ό 뢙이고 lengthλ₯Ό 적어주면 λœλ‹€.

int[] intArray = {10, 20, 30};
int num = intArray.length;
System.out.println(num);

// intArray.length = 10; β†’ μ—λŸ¬ λ°œμƒ

μœ„μ™€ 같이 μ‚¬μš©ν•  수 μžˆλŠ”λ° μ΄λ•Œ, length fieldλŠ” 읽기 μ „μš©μ΄κΈ° λ•Œλ¬Έμ— 값을 λ°”κΏ€ μˆ˜κ°€ μ—†λ‹€. λ•Œλ¬Έμ— μœ„ μ—λŸ¬ λ°œμƒ ν–‰κ³Ό 같이 μž‘μ„±ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
μ•„λž˜λŠ” 학생 5λͺ…μ˜ μ˜μ–΄ μ μˆ˜μ™€ κ΅­μ–΄ 점수λ₯Ό λ°°μ—΄λ‘œ ν™œμš©ν•  λ•Œμ˜ μ˜ˆμ‹œμ΄λ‹€.

public class Score {
 public static void main(String[] args) {

 //학생 5λͺ…μœΌλ‘œ μ˜μ–΄ 점수의 값을 λͺ¨λ₯Όλ•Œ
 int[] engScore = new int [5];
 
 //engScore λ°°μ—΄μ˜ 각 index에 value μ €μž₯
 engScore[0] = 100;
 engScore[1] = 90;
 engScore[2] = 80;
 engScore[3] = 70;
 engScore[4] = 60;
 
 //학생 5λͺ…μ˜ κ΅­μ–΄ μ‹œν—˜ 점수의 값을 μ•Œκ³  μžˆμ„λ•Œ
 //λ°°μ—΄μ˜ μ„ μ–Έκ³Ό λ™μ‹œμ— koreanScore λ°°μ—΄μ˜ 각 indexλ₯Ό μ΄ˆκΈ°ν™”ν•  수 μžˆλ‹€.
 int[] koreanScore = {80, 70, 60, 50, 40};

 //μ„Έλ²ˆμ§Έ ν•™μƒμ˜ μ˜μ–΄ μ μˆ˜λŠ”?
 System.out.println(engScore[2]);

 //κ΅­μ–΄ 점수의 총합은?
 int krTotal = 0;
 for (int i = 0; i < koreanScore.length; i++) {
  krTotal += koreanScore[i];
 }
  System.out.printf("κ΅­μ–΄ 점수의 총합은 %d점", krTotal);
 }
}

4. 닀차원 λ°°μ—΄

값듀이 ν–‰κ³Ό μ—΄λ‘œ κ΅¬μ„±λœ 배열을 2차원 배열이라고 ν•œλ‹€. κ³ λ“±ν•™κ΅μ—μ„œ λ°°μš°λŠ” 행렬을 μƒκ°ν•˜λ©΄ λœλ‹€.
이 κ²½μš°μ—λŠ” κ°€λ‘œ index와 μ„Έλ‘œ indexλ₯Ό μ‚¬μš©ν•˜λŠ”λ°, μžλ°”μ—μ„œλŠ” 쀑첩 λ°°μ—΄ λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•œλ‹€. 예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

int[][] scores = new int [2][3] // 2ν–‰ 3μ—΄ ꡬ쑰의 2차원 λ°°μ—΄ 생성

이 μ½”λ“œλŠ” λ©”λͺ¨λ¦¬ μ˜μ—­ μ€‘μ—μ„œλ„ heap μ˜μ—­(배열은 μ°Έμ‘° λ³€μˆ˜μ΄λ―€λ‘œ)에 λ°°μ—΄ 객체가 μ„Έ 개 μƒμ„±λœλ‹€. νŽΈμ˜μƒ A, B, C라고 λΆ€λ₯΄κ² λ‹€. λ°°μ—΄ λ³€μˆ˜μΈ scoresλŠ” λ¨Όμ € lengthκ°€ 2인 λ°°μ—΄ Aλ₯Ό λ¨Όμ € μ°Έμ‘°ν•˜λŠ”λ°, μ—¬κΈ°μ„œ scores[0]은 λ‹€μ‹œ lengthκ°€ 3인 λ°°μ—΄ Bλ₯Ό μ°Έμ‘°ν•œλ‹€. 그리고 scores[1] λ˜ν•œ lengthκ°€ 3인 λ°°μ—΄ Cλ₯Ό μ°Έμ‘°ν•˜λŠ” λ°©μ‹μœΌλ‘œ 닀차원 배열이 μž‘λ™ν•˜κ²Œ λœλ‹€.
닀차원 λ°°μ—΄ λ˜ν•œ λ°°μ—΄κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ value listλ₯Ό κ°€μ§€κ³  μžˆλƒ 없냐에 따라 λ‹€μ–‘ν•˜κ²Œ 생성할 수 μžˆλŠ”λ°, value listκ°€ μžˆμ„λ•Œλ„

νƒ€μž…[][] λ³€μˆ˜ = { {value0a, value0b, value0c ...}, {value1a, value1b, value1c} };

μœ„μ™€ 같이 생성할 수 μžˆλ‹€. μ‚¬μš© μ˜ˆμ‹œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

int[][] scores = { {95, 80}, {92, 96} };

//μœ„ scores λ°°μ—΄μ—μ„œ ν•­λͺ©κ°’ 뢈러였기

int score = scores[0][0]; //좜λ ₯ κ°’: 95
int score = scores[1][1]; //좜λ ₯ κ°’: 96

μœ„ μ˜ˆμ‹œλ₯Ό 톡해 scores 배열은

     0μ—΄   1μ—΄
0ν–‰   95   80
1ν–‰   92   96

이와 같은 2*2 ν˜•νƒœμ˜ λ°°μ—΄λ‘œ μƒμ„±λ˜μ—ˆλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.