오늘 배울 내용
같은 자료형의 묶음 -> 배열 : 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);
|
}
}
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대 명령어 장착 완료!이제 솔이님은 리스트의 모든 무기를 다 다룰 줄 아는 상태가 되었어요!
|
오전수업 복습
// 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); }
💡 이름은 솔이님 맘대로 지어도 돼요! 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번 범인! 🕵️♂️ 범인 검거 및 이유 분석
|
강사님 문제
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()이 나와? 역할이 뭔데? 무슨 뜻이야?
|
//2.List<HumanDto> list = new ArrayList<HumanDto>(); 이게 무슨 뜻이야?? 리스트 생성 <HumanDto> 리스트 이름: list = 새로운배열리스트 <이름:HumanDtoa>맞아?
❓ 질문 2. List<HumanDto> list = new ArrayList<HumanDto>(); 이게 무슨 뜻이야?솔이님의 생각: 리스트 생성 <HumanDto> 리스트 이름: list = 새로운배열리스트 <이름: HumanDto> 맞아?
|
//HumanDto update_human = list.get(1); 이건 왜 이렇게 써?? HumanDto 는 무슨 뜻이야? 풀어서 설명해줘
❓ 질문 4. HumanDto update_human = list.get(1); 이건 왜 이렇게 써? HumanDto는 무슨 뜻이야? 풀어서 설명해 줘.
|
| 주소 영역이 출력되던 문제는 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단계: 패키지와 클래스 세팅하기
2단계: 메인 메서드(main) 안에 필통 만들기
3단계: 7대 명령어 미션 차례대로 수행하기
🖥️ 최종 출력 예시컴퓨터가 에러 없이 작동하면 콘솔 창에 이렇게 찍혀야 합니다!--- 미션 ② 필통 길이 --- 현재 필통에 든 개수: 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. 솔이님의 질문에 대한 정답 코치!
|
재미니 미니과제 정답과 추가 궁금증 해결하기
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문의 중괄호 { }가 끝나는 순간 메모리에서 마법처럼 흔적도 없이 사라져요. 컴퓨터 프로그래밍에서는 이것을 "변수의 수명이 끝났다"고 표현합니다.
|
2. 두 번째 질문: "실제로는 각 n마다 다른 값이 들어가는 게 맞나요?"👉 와, 이것도 완벽하게 맞습니다!for (Integer n : list) 문이 실행되면, n은 고정된 값을 가진 그릇이 아니라 "바뀌는 임시 징검다리" 역할을 해요. 리스트를 돌면서 자바가 내부적으로 아래처럼 엄청 바쁘게 배달을 해주는 거랍니다.
|
'Java > Java 수강일지' 카테고리의 다른 글
| [수강일지_19] (0) | 2026.06.05 |
|---|---|
| [수강일지_18] 실전! 주소록 프로그램 만들기 (0) | 2026.06.04 |
| [수강일지_16] 복습, 추상클래스 , interface , variavle, static, staticmethod, final (0) | 2026.06.01 |
| [수강일지_15] 상속성 ,다향성,오버라이드, 강제형변환(cats) (1) | 2026.05.29 |
| [수강일지_14] 학생정보 관리 프로그램 만들기 (1) | 2026.05.28 |