Java/Java 수강일지

[수강일지_17] Generic , list

jamk-diary 2026. 6. 2. 16:58

오늘 배울 내용

 

같은 자료형의 묶음 -> 배열 : 1-3-5-6-8

다른 자료형의 묶음 -> 클래스 : 이름나이키 - 이름,나이,키-이름,나이,키- 이름,나이,키 

 

(데이터) Collection - 수집 

List -> 목록 - 유동적인 배열 

 

주소값만 바꾸면 리스트 내부 내용 바꿀 필요 없이 순서 변환된다 

Generic : 자료형 설정 = Template (형태)

목적 : 어떤 자료형이는 하나의 클래스에서 사용 가능하게 만드는 것 


Generic : 자료형 설정
Sample 51-Main Class

package Sample51;

 

public class MainClass {

 

public static void main(String[] args) {

/*

자료형 변수 : Generic == Template (자료형태)

: 같은 클래스에서 다양한 자료형을 사용하고 싶은 경우 설정하는 요소

*/

 

/*

Box box = new Box();

int num = box.getTemp();

 

box.setTemp(num);

int temp = box.getTemp();

*/

 

//Generic -> Object 형으로만 설정 가능하다 int -> Integer 로 해야 사용 가능하다

//하나의 클래스에서 여러개의 자료형을 사용하고 싶을 때 사용한다

 

⚠️ 여기서 잠깐! 재미니의 쪽집게 과외 블로그에 int -> Integer 로 해야 사용 가능하다고 아주 정확하게 필기해 두셨네요! 제네릭의 꺾쇠 <> 안에는 int, double 같은 생짜 기본 자료형은 못 들어가고, 꼭 앞글자를 대문자로 쓴 Integer, Double 같은 이쁜 포장지 클래스(Wrapper Class)만 들어갈 수 있다는 자바의 규칙도 꼭 기억해 두세요!

Box<Integer> box = new Box<Integer>(33);

System.out.println(box.getTemp());

Box<Integer> box = new Box<Integer>(33);

➡️ 자바한테 "야! 이 상자는 Integer(정수) 전용 상자로 변신시켜줘!" 라고 주문한 거예요. 그럼 컴퓨터가 내부적으로 T를 전부 int용 방으로 싹 바꿔줍니다

 

Box<String> sbox = new Box<String>("Hello");

System.out.println(sbox.getTemp());

Box<String> sbox = new Box<String>("Hello");

➡️ 이번엔 "이 상자는 String(글자) 전용 상자로 변신!" 한 거예요. 똑같은 Box 클래스 하나를 만들었는데 정수도 담고, 문자열도 담는 만능 상자가 된 거죠!

 

BoxMap<Integer, String> bmap = new BoxMap<Integer, String>(123, "홍길동"); //bmap -> 박스맵의 약자

System.out.println(bmap.getKey());

System.out.println(bmap.getValue());

}

}

Sample 51-Box<T>class

package Sample51;

 

public class Box<T> {

// 1. 강사님이 만든 만능 상자 틀
public class Box<T> { T temp; // 아직 T가 뭔지 몰라요! 그냥 '어떤 자료형'이 들어올 자리만 파놓은 거예요. }

이렇게 Box<T>라고 비워두면, 메인 클래스에서 이 상자를 사다 쓸 때 원하는 자료형을 내 입맛대로 장착할 수 있어요!

 

T temp; // 멤버 변수 설정

//int 를 T 나 다른 소문자, 영어로 바꿔도 에러가 나지 않음 <T> 여기 괄호 안에 넣은 것 덕분에

//즉, 우리가 정하는 대로 자료형이 바뀌는 것

/*public Box () {

 

}

*/

 

 

 

 

public Box(T temp) {

super();

this.temp = temp;

}

 

public T getTemp() {

return temp;

}

public void setTemp(T temp) {

this.temp = temp;

}

}

Sample 51-BoxMap<K, V> class

package Sample51;

 

public class BoxMap<K, V> {

//<> 안에 들어오는 것에 따라 변수 값이 바뀌는 것

K key;

 

V value;

BoxMap<K, V>는 또 뭔가요?

소괄호 안에 들어가는 철자는 내 마음대로 정할 수 있어요! 보통 K는 Key(열쇠), V는 Value(값)의 약자로 많이 써요.

BoxMap<Integer, String> bmap ➡️ "앞방(K)에는 정수 번호표를 주고, 뒷방(V)에는 사람 이름을 담는 변신 상자를 만들겠어!" 라는 뜻입니다. 그래서 출력 결과에 123과 홍길동이 나란히 나올 수 있었던 거예요!

 

public K getKey() {

return key;

}

 

 

public V getValue() {

return value;

}

 

 

public BoxMap(K key, V value) {

super();

this.key = key;

this.value = value;

}

 

}

Sample 51- 출력결과 

33

Hello

123

홍길동


Sample 52 - List : 

 

Sample 52 - Main Class

 

package Sample52;

 

import java.util.ArrayList;

 

public class MainClass {

 

public static void main(String[] args) {

/*

Collection

 

List : 목록 ( 필통 안에 들어가 있는 연필들(=요소들)이라고 생각하기)

데이터의 관리를 유동적으로 할 수 있는 배열

접근 (= 데이터를 꺼내오는 것 )이나 설정은 index 로 한다 == array 과 같다

선형 구조이다. 0-0-0-0-0

 

🎒 List는 한 마디로 "길이가 늘어나는 마법의 필통"

강사님 주석에 "필통 안에 들어가 있는 연필들", "유동적으로 할 수 있는 배열"이라고 적혀있죠? 완전 명언입니다.
기존 배열(int[])은 칸이 딱 고정된 딱딱한 플라스틱 케이스라면, ArrayList는 지퍼를 열고 연필을 넣는 대로 쭉쭉 늘어나는 '고무 필통'이에요!
솔이님이 타이핑하신 핵심 명령어 5가지를 현실 세계 비유로 매칭해 드릴게요.

 

interface:

List

class : -> List 를 상속 받아서 ArrayList,LinkedList 가 만들어진다

ArrayList

: 검색의 효율이 좋다

LinkedList

: 빈번한 추가와 삭제가 이뤄지는 경우에 적합하다

ex) 모바일게임에서 우주선이 행성 막 저격하려고 총알 쓰는 경우 이 총알에 적용하면 된다 총알이 사라지고 계속 생성되니까 !

*/

 

 

ArrayList<Integer> alist = new ArrayList<Integer>(); //alist 에 데이터를 넣기 전까지는 빈 배열이다

 

// 추가 -> 데이터를 넣는 과정 = 빈배열을 채워주고 있다

Integer in = 111; // 일반 변수 쓰듯이 사용하면 된다

alist.add(in); //-> 객체 하나가 추가 된 것이다.

alist.add(222);

alist.add(333); // 333 데이터를 넣으면 추가가 된 것이다 .

// 잘 추가가 되었는지 확인하기

1. add() ➡️ 필통에 새 연필 집어넣기 (추가)

alist.add(111);
alist.add(222);
alist.add(333);

처음에 빈 필통이었는데, add()를 할 때마다 필통 크기가 늘어나면서 111, 222, 333이 차례대로 쏙쏙 들어갑니다. 방 번호(index)는 배열이랑 똑같이 0번방, 1번방, 2번방으로 매겨져요!

//리스트의 길이

System.out.println("list의 길이 : " + alist.size()); //list의 길이 : 3 이렇게 출력되는 이유 -> 3개의 리스트를 넣어놔서 !

 

2. size() ➡️ "필통에 연필 몇 개 들었지?" (길이)

System.out.println("list의 길이 : " + alist.size()); // 결과: 3

배열에서는 개수를 셀 때 .length를 썼지만, 리스트는 .size()라는 멋진 친구를 써요. 연필이 3개 들어있으니 3이라고 알려주는 거죠!

 

// 리스트의 데이터를 산출 array [1] ->

int number = alist.get(1); // 1 번찌에 들어가있는 내용 꺼낼 수 있음

System.out.println(number);

System.out.println(alist.get(2));

 

// 모든 데이터를 (산출) 출력

//1. 전통적인 방법 = for 문 사용하기

for (int i = 0; i < alist.size(); i++) {

Integer num = alist.get(i);

System.out.println(num);

}

//2. 최신 방법 (4번째 foreach문 사용하기)

for (Integer num : alist) {

System.out.println(num);

 

}

3. get(index) ➡️ "1번 방에 있는 연필 좀 꺼내봐" (산출/출력)

int number = alist.get(1); // 결과: 222

배열처럼 alist[1]이라고 안 하고, 매너 있게 .get(1) 버튼을 눌러서 데이터를 꺼내옵니다. 1번 방에 있던 222가 쏙 튀어나와요.


🏎️ 전통적인 for문 vs 최신 foreach문 (모든 연필 다 꺼내기)

// 1. 전통적인 for문 (방 번호 i를 써서 하나씩 꺼내기)
for (int i = 0; i < alist.size(); i++) {
    System.out.println(alist.get(i));
}

// 2. 최신 foreach문 (방 번호 필요 없이 "알맹이 다 갖고 와!")
for (Integer num : alist) {
    System.out.println(num);
}

두 코드는 완벽하게 똑같이 작동해요! 하지만 2번 foreach문이 훨씬 짧고 이쁘죠? "alist 안에 있는 Integer 알맹이들을 num이라는 이름으로 하나씩 다 꺼내줘!"라는 뜻이라 실무에서 진짜 많이 씁니다. 😉

 

//원하는 위치에 출력하는 방법

// ex: 3번찌 4번찌에 추가하는 법

Integer new_num = 777;

alist.add(2,new_num);

 

for (Integer num : alist) {

System.out.println(num);

}

4. add(index, 데이터) ➡️ "야, 2번 방 비켜봐! 나 사이에 낄래" (새치기 삽입)

alist.add(2, 777); 
// 변경 전: [111, 222, 333]
// 변경 후: [111, 222, 777, 333]


원래 2번 방에 있던 333을 뒤로 한 칸 밀어버리고, 그 사이에 777이 새치기해서 쏙 들어가는 엄청 유연한 기능이에요! 배열에선 상상도 못 할 마법이죠. ✨

 

//삭제

Integer remove_num = alist.remove(1); //1 번찌 내용을 지운다라는 뜻

                                                           //Integer remove_num -> 삭제된 데이터를 확인하고 싶으면

                                                           자료형 변수 = 리스트.remover( 인덱스 넘버);

System.out.println("삭제된 데이터: " +remove_num );

for (Integer num : alist) {

System.out.println(num);

}

 

5. remove(index) ➡️ "1번 방 연필 버려!" (삭제)

int remove_num = alist.remove(1); // 1번 방에 있던 222 삭제!
// 변경 후: [111, 777, 333]

1번 방에 있던 222를 쓰레기통에 버리는 순간, 뒤에 있던 777과 333이 "어? 앞자리 비었네?" 하고 알아서 앞으로 한 칸씩 당겨앉습니다.

 

//검색

int index = alist.indexOf(777); //Wrapper Class 이기 때문에 가능하다

System.out.println("index:" + index );

System.out.println(alist.get(index));

 

/*

int index = alist.indexOf(999);

System.out.println("index:" + index );

System.out.println(alist.get(index));

if(index != -1) {

System.out.println(alist.get(index));

}

 

999는 리스트에 없는 내용이라 -1 , 즉 번찌에 없다고 나온다

결과가 필요할 때는 if(index != -1) {

System.out.println(alist.get(index)); 이렇게 if 문을 사용하면 index:-1 이라는 결과 = 리스트에 해당 내용이 없다고 나온다.

 

*/

 

🔍 6. indexOf(데이터) ➡️ "777번 연필 몇 번 방에 있어?" (검색)

필통 안에 수많은 연필이 들어있을 때, 내가 원하는 연필이 대체 몇 번째 방(index)에 누워있는지 방 번호를 찾아내는 아주 똑똑한 기능이에요.

int index = alist.indexOf(777); // 결과: 1
System.out.println("777이 있는 방 번호: " + index);


컴퓨터한테 "777 들어있는 방 찾아봐!" 하면, 지가 알아서 슥 보고 "방장님, 그거 1번 방에 있는데요?" 하고 1을 뱉어냅니다.


⚠️ 강사님이 강조하신 index != -1 조건문의 비밀!

만약 필통에 없는 999를 찾아달라고 하면 리스트는 어떻게 할까요? 자바에서는 "없다"는 신호로 무조건 -1을 돌려줘요. (방 번호는 0번부터 시작하니까 -1은 세상에 없는 방 번호거든요!)
그래서 솔이님 코드처럼 안전장치를 걸어주는 거예요!


int index = alist.indexOf(999); // 없는 데이터라 -1이 나옴!

if(index != -1) { 
    // "방 번호가 -1이 아니라면(=진짜 존재하는 데이터라면) 출력해라!"
    System.out.println(alist.get(index));
} else {
    // -1이 나왔다면 프로그램이 튕기지 않고 안전하게 처리됨!
    System.out.println("필통에 그런 연필 없어요~"); 
}

 

// 수정

Integer new_num1 = 555;

alist.set(0, new_num1);

 

for (Integer num : alist) {

System.out.println(num);

}

✏️ 7. set(index, 새 데이터) ➡️ "0번 방 연필 버리고 555로 교체해!" (수정)

원래 방에 들어있던 연필을 싹 빼버리고, 그 자리에 새로운 연필을 꽂아 넣는 '새로고침' 기능이에요.

Integer new_num1 = 555;
alist.set(0, new_num1);


  • 동작 원리: 원래 0번 방에 들어있던 111을 지우개로 슥슥 지우고, 그 자리에 555를 콕 박아버립니다.
  • add(index, 데이터)는 새치기라서 방이 한 칸 늘어났지만, set은 덮어쓰기라서 리스트 전체 길이는 그대로 유지돼요!

 

 

}

 

}

Sample 52 - 출력결과 

list의 길이 : 3

222

333

111

222

333

111

222

333

111

222

777

333

삭제된 데이터: 222

111

777

333

index:1

777

555

777

333

 

💡 최종 7대 명령어 장착 완료!

이제 솔이님은 리스트의 모든 무기를 다 다룰 줄 아는 상태가 되었어요!
  1. add() : 맨 뒤에 추가 ➕
  2. size() : 총 몇 개 들었나 세기 📏
  3. get() : 방 번호로 알맹이 꺼내기 📥
  4. add(인덱스, 데이터) : 원하는 자리에 새치기 삽입 🏃‍♂️
  5. remove() : 필요 없는 데이터 삭제 🗑️
  6. indexOf() : 데이터로 방 번호 알아내기 (없으면 -1) 🕵️‍♂️
  7. set() : 원하는 자리 데이터 덮어쓰기 ✏️
오전수업 복습 

// interface :List class

List<String>slist = new ArrayList<String>(); //-> 문자열로 추가 삭제 할 수 있게 됨

 

//추가

String word = "사랑해";

slist.add(word);

slist.add("좋아해");

slist.add("고마워 ");

 

 

//원하는 곳에 추가

String new_word = "미안해";

slist.add(1,new_word);

 

for (String num_word : slist) {

System.out.println(num_word);

}

//삭제

String remover_word = slist.remove(0);

System.out.println("삭제된 문장 : " +remover_word );

 

 

 

//검색

 

int str_index = slist.indexOf("미안해");

System.out.println("index : " +str_index);

System.out.println(slist.get(str_index));

if(str_index != -1) {

System.out.println(slist.get(str_index));

}

 

//수정

 

String new_word1 = "최고야";

slist.set(1, new_word1);

 

for(String num_word : slist) {

System.out.println(num_word);

}


사랑해

미안해

좋아해

고마워

삭제된 문장 : 사랑해

미안해

최고야

고마워

❓ 질문 1. num_word와 num의 역할이 뭔가요?

결론부터 말씀드리면, 이 친구들은 "필통에서 연필을 하나씩 꺼낼 때, 잠시 이름을 붙여두는 임시 이름표"예요!

for (String num_word : slist) {
    System.out.println(num_word);
}


  • 비유를 해볼게요: slist라는 주머니 안에 ["사랑해", "미안해", "좋아해", "고마워"]라는 네 개의 알맹이가 들어있죠?
  • 자바한테 "주머니에 있는 거 하나씩 다 꺼내봐!" 라고 시키는 게 이 foreach문인데, 꺼낼 때 그냥 꺼내면 이름을 부를 수 없잖아요?
  • 그래서 "맨 처음에 '사랑해'를 꺼내서 잠시 num_word라고 부를게! 그리고 출력하자!" 라고 규칙을 정한 거예요.
  • for문이 한 바퀴 돌 때마다 num_word라는 이름표에는 '사랑해' ➡️ '미안해' ➡️ '좋아해' ➡️ '고마워' 가 차례대로 배달되어 들어갑니다.
💡 이름은 솔이님 맘대로 지어도 돼요! String num_word라고 지으셔도 되고, String s, String str 등 솔이님이 편한 대로 지으셔도 아무 상관 없어요! 단지 주머니 안의 알맹이가 String(글자)이기 때문에 맨 앞에 자료형만 **String**으로 똑같이 맞춰주시면 됩니다. (코드 중간에 for(String num : slist); 부분은 이름표를 num이라고 지으신 거예요!)

❓ 질문 2. 검색 기능(indexOf)에서 에러가 났던 진짜 이유!

작성해 주신 주석 코드를 보니까 에러가 난 명확한 범인이 딱 눈에 띄었어요! 자바의 '그릇(자료형) 규칙' 때문에 생긴 에러입니다.

// ❌ 에러가 났던 코드
String str_index = slist.indexOf("미안해"); // 1번 범인!
System.out.println("index : " + index);      // 2번 범인!


🕵️‍♂️ 범인 검거 및 이유 분석

  1. slist.indexOf("미안해") 의 결과물은 뭘까요?
    • 컴퓨터가 "미안해"라는 글자를 찾으면 "방장님! 그거 1번 방에 있어요!" 하고 숫자 1을 돌려줍니다.
    • 즉, indexOf의 결과물은 항상 숫자(정수)예요!
    • 그런데 솔이님이 앞에 그릇을 String str_index (글자그릇)로 준비해두셔서 자바가 "숫자가 나오는데 왜 글자 그릇을 내밀어?!" 하고 에러를 낸 거예요.
  2. index라는 변수를 만든 적이 없어요!
    • 그릇 이름을 str_index라고 지어놓고, 아래에서는 index를 출력하라고 하니 컴퓨터가 "나는 index가 뭔지 몰라!" 하고 2차 에러를 낸 거랍니다.


      🛠️ 이렇게 고치면 주석 풀고 바로 실행돼요! (100점짜리 코드)
    • 그릇을 숫자형(int)으로 이쁘게 고쳐주면 에러가 마법처럼 사라집니다.
      // ⭕ 올바른 검색 코드
      int index = slist.indexOf("미안해"); // 결과물인 '숫자'에 맞게 int 그릇으로 변경!

      System.out.println("index : " + index); // 이제 index가 뭔지 컴퓨터가 알아요!

      if(index != -1) { // -1이 아니라면 (=필통에 진짜 있다면)
          System.out.println("찾은 데이터: " + slist.get(index));
      }
강사님 문제

 

Sample-52 MainClass

List<HumanDto> list = new ArrayList<HumanDto>();

//추가 -> 3개

 

String name = " 홍길동";

int age =24;

double height = 172.1;

HumanDto dto = new HumanDto(name, age, height);

 

list.add(dto);

 

list.add(new HumanDto("성춘향", 15 , 156.3));

list.add(new HumanDto("일지매", 22,180.2));

 

// for (int ii= 0; ii < list.size(); ii++) {

// HumanDto h = list.get(ii);

// System.out.println(h.toString());

// }

for(HumanDto h : list) {

System.out.println(h.toString());

}

//원하는 위치에 추가

HumanDto human = new HumanDto("홍두께", 23,178.5);

list.add(1,human);

 

for(HumanDto h : list) {

System.out.println(h.toString());

}

//삭제

list.remove(3);

 

for (HumanDto h : list) {

System.out.println(h.toString());

}

// 검색 -> 이름

String find_name = "성춘향";

index = -1;

for (int i = 0; i < list.size(); i++) {

HumanDto h = list.get(i);

if(find_name.equals(h.getName())) {

index = i;

}

}

 

if(index != -1) {

HumanDto find_human = list.get(index);

System.out.println(find_human.toString());

}

 

 

// 수정 -> height

HumanDto update_human = list.get(1);

double hei = 183.2;

 

update_human.setHeight(hei);

 

// list.set(1, update_human);

 

for (HumanDto h : list) {

System.out.println(h.toString());

}

 

}

 

 

//1. System.out.println(h.toString()); 왜 to string이 나와? 왜 이걸 써? 역할이 뭔데? 무슨 뜻이야??


❓ 질문 1. System.out.println(h.toString()); 왜 toString()이 나와? 역할이 뭔데? 무슨 뜻이야?

  • 정답: toString()"이 객체 상자 안에 든 내용물들을 예쁘게 글자(String)로 한방에 찍어줘!" 라고 외치는 버튼이에요.
  • 이유: 자바에서 System.out.println(h);라고 그냥 상자를 통째로 출력하려고 하면, 컴퓨터는 상자 내용물 대신 dto.HumanDto@7a81197d 같은 암호 같은 '주소 영역(메모리 주소)'을 출력해 버려요.
  • 해결 치트키: 그래서

//2.List<HumanDto> list = new ArrayList<HumanDto>(); 이게 무슨 뜻이야?? 리스트 생성 <HumanDto> 리스트 이름: list = 새로운배열리스트 <이름:HumanDtoa>맞아?

❓ 질문 2. List<HumanDto> list = new ArrayList<HumanDto>(); 이게 무슨 뜻이야?

솔이님의 생각: 리스트 생성 <HumanDto> 리스트 이름: list = 새로운배열리스트 <이름: HumanDto> 맞아?
  • 정답: 네!!! 200% 완벽하게 맞습니다! 해석을 아주 기가 막히게 하셨네요!
  • 풀어서 설명: 자바한테 "내가 HumanDto 상자들만 골라서 담을 수 있는 마법의 고무 필통을 하나 새로(new) 만들 건데, 그 필통의 이름을 list라고 지을게!" 라고 선언한 거예요.

 

//HumanDto update_human = list.get(1); 이건 왜 이렇게 써?? HumanDto 는 무슨 뜻이야? 풀어서 설명해줘

❓ 질문 4. HumanDto update_human = list.get(1); 이건 왜 이렇게 써? HumanDto는 무슨 뜻이야? 풀어서 설명해 줘.

  • 정답: 필통에서 상자를 하나 꺼내서 잠시 올려둘 '전용 책상(그릇)'을 준비하는 것입니다.
  • 풀어서 설명:
    • list.get(1)을 하면 필통의 1번 방에서 HumanDto라는 거대한 객체 상자가 통째로 툭 튀어나오겠죠?
    • 꺼내온 상자가 HumanDto 타입이니까, 담는 그릇(변수)도 당연히 똑같은 HumanDto 타입이어야 자바가 에러를 안 내요.
    • 즉, "필통 1번 방에서 상자 꺼내서, HumanDto 모양의 update_human이라는 임시 그릇에 잠시 올려둬!" 라는 뜻입니다. 그래야 나중에 update_human.setHeight(165.0); 처럼 상자를 열어볼 수 있으니까요!
//출력했는데 주소 영역이 나오고 있어 고쳐 주라
주소 영역이 출력되던 문제는 System.out.println(h); 대신 위 코드처럼 h.getName(), h.getAge()로 알맹이를 직접 콕 집어서 출력해주면 완벽하게 해결된답니다!
Sample 52- Humandto
 

package dto;

 

import java.util.ArrayList;

import java.util.List;

 

public class HumanDto {

 

private String name;

private int age;

private double height;

 

public HumanDto() {

 

}

 

 

public int hashCode() {

// TODO Auto-generated method stub

return super.hashCode();

}

 

 

public boolean equals(Object obj) {

// TODO Auto-generated method stub

return super.equals(obj);

}

 

 

protected Object clone() throws CloneNotSupportedException {

// TODO Auto-generated method stub

return super.clone();

}

 

 

 

 

 

protected void finalize() throws Throwable {

// TODO Auto-generated method stub

super.finalize();

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public int getAge() {

return age;

}

 

public void setAge(int age) {

this.age = age;

}

 

public double getHeight() {

return height;

}

 

public void setHeight(double height) {

this.height = height;

}

 

public HumanDto(String name, int age, double height) {

super();

this.name = name;

this.age = age;

this.height = height;

 

 

}

 

@Override

public String toString() {

// 주소 대신 이름, 나이, 키가 글자로 예쁘게 튀어나오도록 새로고침!

return "[이름=" + name + ", 나이=" + age + ", 키=" + height + "]";

 

}

}

 

 출력 

[이름= 홍길동, 나이=24, 키=172.1]

[이름=성춘향, 나이=15, 키=156.3]

[이름=일지매, 나이=22, 키=180.2]

[이름= 홍길동, 나이=24, 키=172.1]

[이름=홍두께, 나이=23, 키=178.5]

[이름=성춘향, 나이=15, 키=156.3]

[이름=일지매, 나이=22, 키=180.2]

[이름= 홍길동, 나이=24, 키=172.1]

[이름=홍두께, 나이=23, 키=178.5]

[이름=성춘향, 나이=15, 키=156.3]

[이름=성춘향, 나이=15, 키=156.3]

--- 1번 방 수정 후 전체 출력 ---

[이름= 홍길동, 나이=24, 키=172.1]

[이름=홍두께, 나이=23, 키=183.2]

[이름=성춘향, 나이=15, 키=156.3]

--- ✏️ 신장 수정 확인 ---

홍두께님의 키를 183.2로 수정 완료!

 

재미니 오전 수업 미니과제 

🎒 [오전 복습 - 1단계 미니 과제] 나만의 스마트 필통 만들기!

🎯 미션 목표

ArrayList를 사용해서 정수(Integer) 데이터들을 담는 필통을 만들고, 오늘 배운 핵심 명령어들을 하나씩 서랍에서 꺼내 쓰듯 실행해 보세요!

🧭 [재미니의 개발자 사고 흐름 가이드]

1단계: 패키지와 클래스 세팅하기

  • 이클립스에 과제패키지를 하나 만들고, 그 안에 실행 버튼이 있는 PocketMain.java 클래스를 하나만 만들어 주세요. (이번엔 메인 클래스 하나만 있으면 돼요!)

2단계: 메인 메서드(main) 안에 필통 만들기

  • ArrayList를 만드는데, 안에 Integer 방을 만들겠다고 제네릭(< >) 꺾쇠를 이쁘게 채워 넣어보세요!

3단계: 7대 명령어 미션 차례대로 수행하기

  • [미션 ① 추가] 필통에 10, 20, 30 세 개의 숫자를 차례대로 add() 하세요.
  • [미션 ② 길이 확인] size()를 사용해서 필통에 지금 데이터가 몇 개 들었는지 콘솔 창에 찍어보세요.
  • [미션 ③ 새치기 삽입] 1번 방 자리에 숫자 99를 새치기(add(인덱스, 데이터))로 쏙 집어넣어 보세요.
  • [미션 ④ 전체 출력] 최신 foreach문을 사용해서 필통에 든 모든 숫자를 화면에 세로로 쭉 출력해 보세요! (출력 결과가 10, 99, 20, 30 순서로 나오면 대성공!)
  • [미션 ⑤ 수정] set()을 사용해서 맨 첫 번째 방(0번 방)에 있는 숫자를 50으로 교체해 보세요.
  • [미션 ⑥ 검색] indexOf()를 사용해서 숫자 30이 현재 몇 번째 방에 있는지 찾아서 그 방 번호를 출력해 보세요.

🖥️ 최종 출력 예시

컴퓨터가 에러 없이 작동하면 콘솔 창에 이렇게 찍혀야 합니다!


--- 미션 ② 필통 길이 ---
현재 필통에 든 개수: 3개

--- 미션 ④ 새치기 후 전체 출력 ---
10
99
20
30

--- 미션 ⑤, ⑥ 수정 및 검색 결과 ---
0번 방을 50으로 바꿨습니다!
숫자 30이 들어있는 방 번호: 3번 방

 내풀이 

 

package main;

 

import java.util.ArrayList;

 

public class MainClass {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

 

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

 

//추가

Integer num = 10; // Integer 잡고 num이라고 부르는 그릇 = 10 넣어주기

list.add(num); // num이라고 부르는 그릇 넣어주기

list.add(20); // num이라고그릇일 때 20도 넣어주기

list.add(30); //num이라고그릇일 때 30도 넣어주기

 

System.out.println("필기구의 갯수 : " + list.size() ); // 필기구 갯수 : list 사이즈 만큼 출력하기 -> 3이 나오게 됨 왜? 3개의 연필그릇이 들어갔으니까

 

//새치기

Integer new_num=99; // Integer 잡고 새로운 num 이라고 부르는 그릇에 = 99넣어주기

list.add(1,new_num); //리스트 인덱스 넘버 1번에 new_num=99 넣어주기

 

//새치기 출력 통해 확인하기

for (Integer new_num : list) {

System.out.println(new_num);

}

 

//0번째 방 숫자 50으로 바꿔서 출력하기

Integer new_num1= 50;

list.set(0, new_num1);

 

for( new_num1 : list ) {

System.out.println(new_num1);

}

 

 

}

}

2차 수정 버전 

package main;

 

import java.util.ArrayList;

 

public class MainClass {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

 

// 🧭 [개발자 사고 흐름]

// 1단계: 숫자를 보관할 거니까 자료형은 만능 요술 상자 <Integer>로 잡아야지!

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

 

//추가

Integer num = 10; // Integer 잡고 num이라고 부르는 그릇 = 10 넣어주기

list.add(num); // num이라고 부르는 그릇 넣어주기

list.add(20); // num이라고그릇일 때 20도 넣어주기

list.add(30); //num이라고그릇일 때 30도 넣어주기

 

// [미션 ② 길이 확인]

System.out.println("필기구의 갯수 : " + list.size() ); // 필기구 갯수 : list 사이즈 만큼 출력하기 -> 3이 나오게 됨 왜? 3개의 연필그릇이 들어갔으니까

 

//새치기

Integer new_num=99; // Integer 만들고 새로운 num 이라고 부르는 그릇에 99넣어주기

list.add(1,new_num); //리스트 인덱스 넘버 1번에 new_num=99 넣어주기

 

//새치기 출력 통해 확인하기

System.out.println("--- 새치기 후 전체 출력 ---");

for (Integer num : list) { // 질문: 여기 num 오류나

System.out.println(num); //질문 : 여기 num 이 들어가는 건 추가하는 과정에서 그릇 이름을 num이라고 정해서지? num 그릇에 담긴 내용을 출력하려는 거 맞아?

}

 

//수정

//0번째 방 숫자 50으로 바꿔서 출력하기

Integer new_num1= 50; //새로운 그릇 new_num1 에 50을 넣기

list.set(0, new_num1); //0번째 칸에 new_num1 넣은 그릇 넣어주기

 

// 수정 후 확인 출력하기

System.out.println("--- 0번 방 수정 후 확인 ---");

 

for (Integer num : list) { //num 밑에 에러 떠 여기 어떻게 해 ??

System.out.println(num);

}

 

 

// [미션 ⑥ 검색] -> 숫자 30이 몇 번째 방에 있는지 찾기!

// 블로그 화면엔 아직 안 적으셨던 마지막 미션도 채워 드려요 🎁

int index = list.indexOf(30);

System.out.println("--- 숫자 30 검색 결과 ---");

System.out.println("숫자 30은 현재 [" + index + "]번 방에 있습니다.");

 

🔍 1. for문 안에서 num이 에러가 나는 진짜 이유

// ❌ 에러가 난 범인 구역
Integer num = 10;  // 1. 이미 맨 위에서 'num'이라는 이름의 그릇을 만들었어요!
list.add(num);

// ... 중략 ...

for (Integer num : list) { // 2. ❌ 에러! 자바: "위에서 'num' 썼잖아! 이름 겹쳐서 못 만들어!"
    System.out.println(num); 
}

이유: 자바는 한 메서드(main) 안에서 똑같은 이름의 변수 그릇을 두 번 만들 수 없어요. * 맨 위에서 Integer num = 10; 하고 num이라는 이름을 이미 써버렸기 때문에, 아래 for문 괄호 안에서 Integer num이라고 또 쓰면 자바가 "이름이 겹쳐서 누굴 불러야 할지 모르겠어!" 하고 에러를 뿜는 거랍니다.
❓ 2. 솔이님의 질문에 대한 정답 코치!

  • 정답: 아주 좋은 접근이었지만, 반은 맞고 반은 틀려요! 😮
  • 해설: 이 for문(foreach) 괄호 안에 들어가는 이름은, 맨 위에서 만든 num 그릇과 아무런 상관이 없는 '새로운 임시 이름표'예요!
  • 필통(list)에서 알맹이를 하나씩 꺼낼 때마다 잠시 붙여줄 새 이름표가 필요한 건데, 위에서 썼던 num이라는 단어를 또 쓰니까 에러가 난 거예요. 즉, 이름을 n이나 element 같은 다른 이름으로 지어주셔야 해요!
재미니 미니과제 정답과 추가 궁금증 해결하기 

package main;

 

import java.util.ArrayList;

 

public class MainClass {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

 

// 🧭 [개발자 사고 흐름]

// 1단계: 숫자를 보관할 거니까 자료형은 만능 요술 상자 <Integer>로 잡아야지! =마법의 숫자 필통 만들기

 

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

 

//추가

Integer num = 10; //최초로 'num'이라는 이름을 써서 10을 담음! Integer 잡고 num이라고 부르는 그릇 = 10 넣어주기

list.add(num); // num이라고 부르는 그릇 넣어주기

list.add(20); // num이라고그릇일 때 20도 넣어주기

list.add(30); //num이라고그릇일 때 30도 넣어주기

 

// [미션 ② 길이 확인]

System.out.println("필기구의 갯수 : " + list.size() ); // 필기구 갯수 : list 사이즈 만큼 출력하기 -> 3이 나오게 됨 왜? 3개의 연필그릇이 들어갔으니까

 

//새치기

Integer new_num=99; // Integer 만들고 새로운 num 이라고 부르는 그릇에 99넣어주기

list.add(1,new_num); //리스트 인덱스 넘버 1번에 new_num=99 넣어주기

 

//새치기 출력 통해 확인하기

System.out.println("--- 새치기 후 전체 출력 ---");

 

for (Integer n : list) { // 질문: 여기 num 들어갔었는데 오류나 ->// 에러 해결: 이름이 겹치지 않게 임시 이름표를 'n'으로 바꿨어요!

System.out.println(n);

}

 

//수정

//0번째 방 숫자 50으로 바꿔서 출력하기

Integer new_num1= 50; //새로운 그릇 new_num1 에 50을 넣기

list.set(0, new_num1); //0번째 칸에 new_num1 넣은 그릇 넣어주기

 

// 수정 후 확인 출력하기

System.out.println("--- 0번 방 수정 후 확인 ---");

 

for (Integer n : list) { //num 밑에 에러 떠 여기 어떻게 해 ?? -> // 에러 해결: 여기도 이름표를 'n'으로 맞춰주면 에러 끝!

System.out.println(n);

}

 

 

// [미션 ⑥ 검색] -> 숫자 30이 몇 번째 방에 있는지 찾기!

// 블로그 화면엔 아직 안 적으셨던 마지막 미션도 채워 드려요 🎁

int index = list.indexOf(30);

System.out.println("--- 숫자 30 검색 결과 ---");

System.out.println("숫자 30은 현재 [" + index + "]번 방에 있습니다.");

}

 

}


필기구의 갯수 : 3

--- 새치기 후 전체 출력 ---

10

99

20

30

--- 0번 방 수정 후 확인 ---

50

99

20

30

--- 숫자 30 검색 결과 ---

숫자 30은 현재 [3]번 방에 있습니다.

1. 첫 번째 질문: "임시 변수 n은 for문 안에서만 살 수 있나요?"


👉 네, 맞습니다!

for문의 괄호 () 안에서 만들어진 변수 n은, 그 for문의 중괄호 { }가 끝나는 순간 메모리에서 마법처럼 흔적도 없이 사라져요.
컴퓨터 프로그래밍에서는 이것을 "변수의 수명이 끝났다"고 표현합니다.
  • 새치기 확인 for문이 끝나는 순간, 거기서 썼던 n은 완전히 소멸합니다.
  • 그렇기 때문에 그 아래에 있는 수정 후 확인 for문에서 똑같이 Integer n이라고 적어도, 자바 입장에서는 완전히 새로운 마음으로 n이라는 이름표를 처음부터 다시 만드는 거예요! 이름이 겹친다고 싸울 일이 전혀 없는 거죠. 🥰

2. 두 번째 질문: "실제로는 각 n마다 다른 값이 들어가는 게 맞나요?"

👉 와, 이것도 완벽하게 맞습니다!
for (Integer n : list) 문이 실행되면, n은 고정된 값을 가진 그릇이 아니라 "바뀌는 임시 징검다리" 역할을 해요. 리스트를 돌면서 자바가 내부적으로 아래처럼 엄청 바쁘게 배달을 해주는 거랍니다.
  • 첫 번째 바퀴: 필통의 0번 방 값을 꺼내서 n에 넣고 출력!
  • 두 번째 바퀴: 원래 있던 n을 지우고, 1번 방 값을 꺼내서 n에 넣고 출력!
  • 세 번째 바퀴: 또 원래 있던 값을 지우고, 2번 방 값을 꺼내서 n에 넣고 출력!
즉, 솔이님 말씀대로 "for (Integer n : list) 문이 실행되면, n은 고정된 값이 아니라 리스트를 돌면서 자바가 0번 방 알맹이 ➡️ 1번 방 알맹이 ➡️ 2번 방 알맹이를 순서대로 배달해 주는 임시 징검다리 역할을 합니다. 그래서 매 바퀴마다 n에 담기는 실제 값은 계속 다음 방의 데이터로 바뀝니다!"