오늘은 자바 문법중에 조건문, 반복문, 배열, 컬렉션에 대해 공부하고 간단한 예제를 진행해봤다!!
아무 문제가 없을줄 알았지만... 그녀석이 결국 나타나 버렸다..
뭐 어려운 문제는 아니었지만 내가 너무 안일하게 코딩을 해놓고 맞왜틀을 한번 더 외치기 시작했다..ㅎㅎ
예제설명!!
예제 내용은 자료구조( List / Set / Map) 중 하나를 선택해서 나만의 레시피 메모장을 만드는 예제를 진행했다.
● 입력값
● 저장할 자료구조명을 입력 (List / Set / Map)
● 내가 좋아하는 요리 제목을 입력
● 이어서 내가 좋아하는 요리 레시피를 한문장씩 입력
● 입력을 마쳤으면 마지막에 “끝” 문자를 입력
● 출력값
● 입력이 종료되면 저장한 자료구조 이름과 요리 제목을 괄호로 감싸서 출력
● 이어서, 입력한 모든 문장앞에 번호를 붙여서 입력 순서에 맞게 모두 출력
ex) 입력 예시
Set
백종원 돼지고기 김치찌개 만들기
돼지고기는 핏물을 빼주세요.
잘익은 김치 한포기를 꺼내서 잘라주세요.
냄비에 들기름 적당히 두르고 김치를 넣고 볶아주세요.
다진마늘 한스푼, 설탕 한스푼 넣어주세요.
종이컵으로 물 8컵 부어서 센불에 끓여주세요.
핏물 뺀 돼지고기를 넣어주세요.
된장 반스푼, 양파 반개, 청양고추 한개를 썰어서 넣어주세요.
간장 두스푼반, 새우젓 두스푼, 고춧가루 두스푼반 넣어주세요.
중불로 줄여서 오래 끓여주세요~!!
마지막에 파 쏭쏭 썰어서 마무리하면 돼요^^
끝
예시 출력
[ Set 으로 저장된 백종원 돼지고기 김치찌개 만들기 ]
1. 돼지고기는 핏물을 빼주세요.
2. 잘익은 김치 한포기를 꺼내서 잘라주세요.
3. 냄비에 들기름 적당히 두르고 김치를 넣고 볶아주세요.
4. 다진마늘 한스푼, 설탕 한스푼 넣어주세요.
5. 종이컵으로 물 8컵 부어서 센불에 끓여주세요.
6. 핏물 뺀 돼지고기를 넣어주세요.
7. 된장 반스푼, 양파 반개, 청양고추 한개를 썰어서 넣어주세요.
8. 간장 두스푼반, 새우젓 두스푼, 고춧가루 두스푼반 넣어주세요.
9. 중불로 줄여서 오래 끓여주세요~!!
10. 마지막에 파 쏭쏭 썰어서 마무리하면 돼요^^
문제점
다음과 같은 예제를 진행하는데 안일하게 코딩을 진행한 부분이 있어서 순간 맞왜틀을 외치게 되었다..
입력 예시를 보면 레시피를 한문장씩 적고 다 적었다면 "끝"이라는 단어와 함께 예시 출력과 같이 출력하는 부분이 있는데..
package homeworks.week2;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
public class homework2_List {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<String> strList = new ArrayList<String>();
String DataStructureName = sc.nextLine();
String name = sc.nextLine();
while (true) {
String recipe = sc.nextLine();
if (recipe.equals("끝")) {
break;
}
strList.add(recipe);
}
System.out.println("[" + DataStructureName + "로 저장된 " + name + "]");
Iterator iterator = strList.iterator();
for(int i = 0; i < strList.size(); i++) {
int count = i + 1;
System.out.println(count + ". " + iterator.next());
}
}
}
전체 코드 중 중간에 있는 if문에서 문제가 발생했다!! 원래 아는 내용이였는데.. 생각 없이 코딩을 했나보다 ㅎㅎ
while (true) {
String recipe = sc.nextLine();
if (recipe == "끝") {
break;
}
strList.add(recipe);
}
위와 같이 한문장씩 레시피를 반복하여 작성할 수 있도록 while문을 이용해 반복 입력하고 "끝"을 입력하면 출력해야 한다.
근데 안되는걸 확인하고 왜 안되는지 생각도 하지 않고 맞왜틀을 외쳐버린 나..
시도해본 것들
생각하면서 코드를 보다가 문득 생각이 나버렸다!!!!!!!!! ==와 equals()의 차이를 생각하고 코드를 바로 바꿔주었다.
아는 메소드 였지만 계속해서 사용해보지 않아서 까먹었던 메소드.. equals()... 이참에 잘 정리해서 까먹지 않기 위해
==와 equals()의 차이를 찾아보고 TIL에 작성하게 됬다. ==와 equals()의 차이에 대해서는 해결 파트에 작성하겠다.
해결
while (true) {
String recipe = sc.nextLine();
if (recipe.equals("끝")) {
break;
}
strList.add(recipe);
}
==와 equals()의 차이를 생각하고 if문 안에 코드를 보면 recipe == "끝" 코드를 recipe.equals("끝")코드로 변경해서 해결!!
알게된점
그럼 이제부터 ==와 equals()의 차이에 대해서 간략하게 작성해야지!!
==연산자와 equals()메소드의 가장 큰 차이점은 ==연산자는 비교하고자 하는 두개의 대상의 주소값을 비교하는데
equals()메소드는 비교하고자 하는 두개의 대상의 값 자체를 비교한다는 것이다.
기본 타입의 int형, char형 등은 Call by Value 형태로 기본적으로 대상에 주소값을 가지지 않는 형태로 사용된다.
하지만 String은 일반적인 타입이 아니라 클래스이고 클래스는 기본적으로 Call by Reference형태로 생성 시 주소값이
부여된다 그렇기에 String타입을 선언했을때는 같은 값을 부여하더라도 서로간의 주소값이 다르다!!
즉 int, char형 등은 주소값을 가지지 않는 형태이므로 ==을 쓰더라도 주소값이 같다 판단하여 ==연산자를 사용해도 된다.
하지만 String은 주소값이 부여되므로 같은 값을 부여하더라도 서로간의 주소값이 다르다는 것!!
그래서 String으로 선언하고 ==연산자를 사용하면 주소값으로 같은지 판별하기 때문에 같지 않다는 결과가 나와
if문이 실행되지 않았던 것이다... 하지만 equals()메서드는 주소가 뭣이든 ()안에 값으로만 판단을 하기 때문에
()안에 값만 같으면 조건을 만족하므로 if문을 정상적으로 실행할 수 있었던 것이다.
이번 예제를 통해서 알았던 내용을 한번 더 기억할 수 있게 되었고 equals()메서드를 사용하면 이렇게 되는구나!!
라는 것만 알았는데 왜 이런 결과가 나왔는지 더 상세하게 공부할 수 있어서 좋았던 하루였던거 같다.
'TIL, WIL > TIL' 카테고리의 다른 글
문시해알, 맞왜틀 TIL - 20230623 (0) | 2023.06.23 |
---|---|
문시해알, 맞왜틀 TIL - 20230622 (0) | 2023.06.22 |
문시해알, 맞왜틀 TIL - 20230526 (0) | 2023.05.26 |
문시해알, 맞왜틀 TIL - 20230525 (1) | 2023.05.25 |
문시해알, 맞왜틀 TIL - 20230523 (0) | 2023.05.23 |