TIL-Java의 "==" 연산자와 equals 메서드
2024-04-23
오늘의 학습 🌠
Java 학습 📂
리스트(ArrayList)
배열은 최초 길이를 알아야 하지만 List는 처음 길이를 몰라도 만들 수 있습니다.
- Array : 정적 배열
- 주요 메서드
- 리스트에 추가 : add()
- 값 변경 : set()
- 리스트 삭제 : remove()
- 리스트 전체 값 삭제 : clear()
스택(stack)
FILO : First In Last Out
최근 저장된 데이터를 나열하고 싶거나, 데이터의 중복 처리를 막고 싶을 때 사용합니다.
스택(stack) : 스택은 나중에 들어온 자료가 먼저 나오는 형태의 자료구조로 ‘후입선출’ 구조
→ 이해가 되나요? ..? 다시 말해 먼저 입력한 데이터를 제일 나중에 꺼낼 수 있습니다!
각티슈를 생각해보면 티슈를 만들 때 먼저 넣은 티슈가 제일 아래에 위치하고 티슈를 사용할 때는 가장 위에 있는 티슈부터 사용할 수 있겠죠. 이렇게 먼저 들어간 것이 마지막에 나오는 규칙을 말합니다.
- 01단계 : 초기 빈 스택
- 02단계 : 1 Push
- 03단계 : 2 Push
- 04단계 : 2 Pop (위에 데이터가 빠져나오게 됨)
- 05단계 : 3 Push
- 06단계 : 3 Pop (위에 데이터가 빠져나오게 됨)
- 07단계 : 1Pop
- 08단계 : 빈 스택
Push : 이미 만들어져 있는 데이터 그 위에 새로 넣는 동작만 가능, 스택에 데이터를 넣을 때에는 top 위에 쌓입니다.
top : 가장 위에 있는 데이터에 접근, 삽입과 삭제가 일어나는 위치로 스택 내부의 데이터는 top을 통해서만 접근 가능합니다.
pop : 가장 위에 있는 데이터를 제거, 스택에서 데이터를 삭제할 때는 top에 위치한 데이터를 삭제합니다.
주요 메서드
- add() : 값을 넣어줌
- pop() : 스택에서 맨 위에 있는 값을 꺼내줌
- peek() : 스택의 맨 위에 있는 값을 꺼내지 않고 어떤 값인지 보여줌
- size() : 스택에 들어가 있는 값의 개수를 출력
- empty() : 비어있으면 true, 비어있지 않으면 false를 출력
- 출력 : 1 15 10 1 3
큐(Queue)
- FIFO
- 주요 메서드
add() : 데이터 추가
- peek() : 먼저 들어온 데이터가 출력
- poll() : 큐의 첫 번째 요소를 삭제
- remove() : 데이터 제거
생성자가 없는 인터페이스
- 생성자가 없기 때문에 new 키워드로 만들 수 없음 -> new LinkedList 사용합니다.
집합(Set)
순서 없고 중복 없음
순서가 보장되지 않는 대신 중복을 허용하지 않도록 하는 프로그램에서 사용할 수 있는 자료구조
Map
과제에 대해서 💦
- 입력값
- 저장할 자료구조명을 입력합니다. (List / Set / Map)
- 내가 좋아하는 요리 제목을 먼저 입력합니다.
- 이어서 내가 좋아하는 요리 레시피를 한 문장씩 입력합니다.
- 입력을 마쳤으면 마지막에 “끝” 문자를 입력합니다.
- 출력값
- 입력이 종료되면 저장한 자료구조 이름과 요리 제목을 괄호로 감싸서 먼저 출력해 줍니다.
- 이어서, 입력한 모든 문장 앞에 번호를 붙여서 입력 순서에 맞게 모두 출력해 줍니다. </aside>
해결 방법은 오늘 들은 강의를 토대로 if문과 switch문 2가지 방법으로 해결하였습니다.
- if문 해결 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package week02;
import java.util.*;
public class Col3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //선언
ArrayList<String> aList = new ArrayList<>(); //List 선언 + 생성
Set<String> set = new HashSet<>(); //Set 선언 + 생성
Map<Integer,String> map = new HashMap<>(); //Map 선언 + 생성
//저장할 자료구조명 입력
String str = sc.nextLine(); //사용자로부터 한 줄 입력 받음
//제목 입력
String title = sc.nextLine(); //사용자로부터 문자열 입력 받음
//자료구조명 입력에 따라 나누기 위해 조건문 설정
if(Objects.equals(str,"List")) //List 문자열을 입력했을 경우
{
//"끝" 문자가 들어오기 전 까지 무한 반복
while(true)
{
//내용 입력
String text = sc.nextLine(); //사용자로부터 문자열을 입력 받음
//끝이라는 문자열이 입력되면 탈출
if(Objects.equals(text,"끝"))
{
break; //종료
}
aList.add(text); //리스트에 추가
}
//제목 결과값 출력
System.out.println("[ List 으로 저장된 "+title+" ]");
for(int i=0;i<aList.size();i++) //리스트의 수만큼 반복
{
System.out.println(i+1+". "+aList.get(i)); //결과값 출력
}
}
//자료구조를 Set으로 입력했을 경우
else if(Objects.equals(str,"Set"))
{
while(true)
{
//내용 입력
String text = sc.nextLine(); //사용자로부터 문자열 입력 받음
//끝이라는 문자열이 입력되면 탈출
if(Objects.equals(text,"끝")){
break; //종료
}
set.add(text); //set에 추가
}
System.out.println("[ Set 으로 저장된 "+title+" ]"); //제목 출력
Iterator it = set.iterator(); //전체 객체를 대상으로 한 번씩 가져오는 반복자
for(int i=0;i<set.size();i++) //set의 크기만큼 반복
{
System.out.println(i+1+". "+it.next()); //결과 출력
}
}
//자료구조 Map이라고 입력했을 경우
else if(Objects.equals(str,"Map"))
{
int num =0;
while(true) //무한반복 -> 끝이라는 입력에 탈출하기 위해
{
String text = sc.nextLine(); //사용자로부터 문자열을 입력받음
if(Objects.equals(text,"끝")) //끝이라는 문자열을 입력했을 경우 탈출
{
break; //종료
}
map.put(num++,text); //map에 key, value 값 저장
}
System.out.println("[ Map 으로 저장된 "+title+" ]"); //제목 출력
for(int i=0;i<map.size();i++) //맵 크기 만큼 반복
{
System.out.println(i+1+". "+map.get(i)); //결과 출력
}
}
else{ //자료구조를 잘 못 입력했을 경우
System.out.println("입력이 잘못됐습니다."); //결과 출력
}
}
}
- switch문 해결 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package week02;
import java.util.*;
public class Col4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //선언
ArrayList<String> list = new ArrayList<String>(); //List 선언 + 생성
Set<String> set = new HashSet<String>(); //Set 선언 + 생성
Map<Integer,String> map = new HashMap<Integer,String>(); //Map 선언 + 생성
String str = sc.nextLine(); //자료구조를 입력 받기
String title = sc.nextLine(); //제목 입력 받기
switch(str)
{
case "List":
while(true)
{
String text = sc.nextLine(); //내용 입력 받기
if(Objects.equals(text,"끝")) //끝이라는 문자열을 입력하면
break;//탈출 -> 종료
list.add(text); //리스트에 text 추가
}
System.out.println("[ List 으로 저장된 "+title+" ]"); //제목 출력
for(int i=0;i<list.size();i++) //list 크기만큼 반복
{
System.out.println(i+1+". "+list.get(i)); //결과 출력
}
break;
case "Set":
while(true)
{
String text = sc.nextLine();
if(Objects.equals(text,"끝"))
break;
set.add(text);
}
System.out.println("[ Set 으로 저장된 "+title+" ]");
Iterator it = set.iterator(); //전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자
for(int i=0;i<set.size();i++)
{
System.out.println(i+1+". "+it.next());
}
break;
case "Map":
{
int num=0;
while(true)
{
String text = sc.nextLine(); //내용 입력 받기
if(Objects.equals(text,"끝")) //끝이라는 문자열을 입력하면
break;//탈출 -> 종료
map.put(num++,text); //map 에 추가
}
System.out.println("[ Map 으로 저장된 "+title+" ]"); //제목 출력
for(int i=0;i<map.size();i++) //Map 크기만큼 반복
{
System.out.println(i+1+". "+map.get(i)); //결과 출력
}
break;
}
}
}
}
잘못 생각했던 부분 💫
1️⃣. ’==’ 연산자와 euqals 메서드
if(str =="List")
가 가능하다고 생각했는데 if(Objects.equals(str, "List"))
로 if문을 변경해야 됐습니다.
Java에서 ’==’ 연산자는 두 개의 문자열이 메모리 상의 동일한 위치에 있는지를 비교하는 반면, ‘equals()’ 메서드는 두 문자열의 내용이 같은지를 비교합니다.
’==’ 연산자는 비교하고자 하는 두 개의 대상의 주소값을 비교하는데 반해 equals() 메서드는 비교하고자 하는 두 개의 대상의 값 자체를 비교합니다.
결론은 ‘==’ 연사자로 두 문자열을 비교할 경우, 두 문자열이 메모리 상의 동일한 위치를 참조하는지 확인하는 것이므로 예상과 다른 결과가 나올 수 있습니다.
따라서 문자열의 내용을 비교하려면 ‘equals()’ 메서드를 사용하는게 좋습니다.
if(str.equals("List"))
간결하게 다음과 같이도 쓸 수 있습니다.06번 String과 new String() 해당 링크의 “06번 String과 new String()의 차이점”을 읽어보는 것도,,
추가 : IntelliJ 코드 오류 해결 방법 : 마우스 커서 + alt + enter
2️⃣. Set 출력 방법
Set은 중복 값을 가질 수 없고 특정한 순서를 가질 수 없습니다. 또한 삽입 시 순서가 없기 때문에 배열이나 List처럼 .get(인덱스)로 값을 가져올 수 없기 때문에 Iterator를 통해 가져와야됩니다.
set.iterator()로 set 값을 iterator에 담은 후 .next를 통해 하나씩 뽑아내는 식입니다.
따라서 코드의 Set을 사용할 때
Iterator it = set.iterator();
을 사용하여 전체 객체를 대상으로 한 번씩 가져오는 반복자를 선언하고it.next()
로 결과를 출력했습니다.
추가 🕤
팀원 중 한 분이 문제를 풀 때 로직을 먼저 짜고 코드를 진행하는 것이 틀린 부분이나 부족한 부분을 알기 쉽다고 하여서 로직 설계나 알고리즘으로 풀어보기 등 해당 방법으로 문제 풀이를 연습해야겠다고 생각했습니다.
또한 과제가 주어졌을 때 하나의 풀이법이 아닌 배운 내용을 토대로 다양하게 풀이를 해야겠다고 느끼게 되었고 앞으로도 그러기로,, 다짐하며.. 오늘의 내용을 마무리합니다.
🐱🏍— —🤸🏻♀️ ~~~ 야~호~