Post

TIL-Java의 "==" 연산자와 equals 메서드

TIL-Java의 "==" 연산자와 equals 메서드

2024-04-23

오늘의 학습 🌠


1

Java 학습 📂

리스트(ArrayList)

  • 배열은 최초 길이를 알아야 하지만 List는 처음 길이를 몰라도 만들 수 있습니다.

  • Array : 정적 배열
  • List(ArrayList) : 동적 배열 (크기가 가변적으로 늘어남) 1

  • 주요 메서드
    • 리스트에 추가 : add()
    • 값 변경 : set()
    • 리스트 삭제 : remove()
    • 리스트 전체 값 삭제 : clear()

스택(stack)

  • FILO : First In Last Out

  • 최근 저장된 데이터를 나열하고 싶거나, 데이터의 중복 처리를 막고 싶을 때 사용합니다.

  • 스택(stack) : 스택은 나중에 들어온 자료가 먼저 나오는 형태의 자료구조로 ‘후입선출’ 구조

→ 이해가 되나요? ..? 다시 말해 먼저 입력한 데이터를 제일 나중에 꺼낼 수 있습니다!

각티슈를 생각해보면 티슈를 만들 때 먼저 넣은 티슈가 제일 아래에 위치하고 티슈를 사용할 때는 가장 위에 있는 티슈부터 사용할 수 있겠죠. 이렇게 먼저 들어간 것이 마지막에 나오는 규칙을 말합니다.

  • 스택 이해 1

    • 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

  • 출력 : 1 15 10 1 3

큐(Queue)

  • FIFO
  • 주요 메서드
    • add() : 데이터 추가

    • peek() : 먼저 들어온 데이터가 출력
    • poll() : 큐의 첫 번째 요소를 삭제
    • remove() : 데이터 제거
  • 생성자가 없는 인터페이스

  • 생성자가 없기 때문에 new 키워드로 만들 수 없음 -> new LinkedList 사용합니다.

1

집합(Set)

  • 순서 없고 중복 없음

  • 순서가 보장되지 않는 대신 중복을 허용하지 않도록 하는 프로그램에서 사용할 수 있는 자료구조

1

Map

1


과제에 대해서 💦

  • 입력값
    • 저장할 자료구조명을 입력합니다. (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() 로 결과를 출력했습니다.

추가 🕤


  • 팀원 중 한 분이 문제를 풀 때 로직을 먼저 짜고 코드를 진행하는 것이 틀린 부분이나 부족한 부분을 알기 쉽다고 하여서 로직 설계나 알고리즘으로 풀어보기 등 해당 방법으로 문제 풀이를 연습해야겠다고 생각했습니다.

  • 또한 과제가 주어졌을 때 하나의 풀이법이 아닌 배운 내용을 토대로 다양하게 풀이를 해야겠다고 느끼게 되었고 앞으로도 그러기로,, 다짐하며.. 오늘의 내용을 마무리합니다.

🐱‍🏍— —🤸🏻‍♀️ ~~~ 야~호~

This post is licensed under CC BY 4.0 by the author.