Java - toString(),equals()

2020. 6. 27. 16:31Java

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
 
public class Ex {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        /*
         * java.lang.Object 클래스
         * -모든 클래스의 슈퍼클래스(java.lang 패키지 이므로 별도의 import 필요없음)
         * -Object 클래스의 모든 멤버는 다른 클래스에서 사용하거나 오버라이딩이 가능
         * 
         * 1. equals() 메서드
         * -두 객체가 같은지 동등비교(==) 수행
         * 즉, 두객체의 주소값을 비교하여 같으면 true, 다르면 false리턴
         * - 실제 두 객체가 같다라는 의미는 두 객체의 주소값이 아닌
         * 객체가 가지는 멤버변수가 같다는 의미로 사용됨
         * 따라서, 사용자가 정의하는 클래스에 equals() 메서드를 오버라이딩하여 
         * 각 개체의 멤버변수끼리 비교하도록 수정하여 사용함
         * -자바에서 제공하는 대부분의 클래스(API)들은 
         * equals()메서드가 오버라이딩 되어있으므로 객체 내의 내용 비교가 가능함
         * ex) String 클래스
         * equals() 메서드 자동 생성(오버라이딩) 기능을 활용하면 쉽게 구현가능
         * (Alt + Shift + S : H)
         */
        
 
        Person p1= new Person("이순신""바닷가");
        Person p2= new Person("이순신""바닷가");
        
        System.out.println("p의 객체 정보 : "+p1);
        System.out.println("p2의 객체 정보 : "+p2);
        
        if(p1==p2) {//참조변수에 대한 동등비교는 객체 p 와 p2에 저장된 주소값 비교1@#!@#%^^!
            System.out.println("두 객체의 주소값이 같다!");
        }else {
            System.out.println("두 객체의 주소값이 다르다!");
        }
        
        if(p1.equals(p2)) {// Person -> Object 로 업캐스팅!@#$#$@$%!#$
                            // 두 객체에 대한 내용비교를 수행함
                            //Object 클래스의 equals() 는 동등비교 수행함.
            System.out.println("두 객체의 주소값이 같다!");
        }else {
            System.out.println("두 객체의 주소값이 다르다!");
        }
        
        System.out.println("----------------------------");
        
        Person p3= p2;
        
        System.out.println("p2의 객체 정보 : "+p2);
        System.out.println("p3의 객체 정보 : "+p3);
        if(p2==p3) {
            System.out.println("두 객체의 주소값이 같다!");
        }else {
            System.out.println("두 객체의 주소값이 다르다!");
        }
 
        if(p2.equals(p3)) {
            System.out.println("두 객체의 주소값이 같다!");
        }else {
            System.out.println("두 객체의 주소값이 다르다!");
        }
        
        System.out.println("--------------------------");
        
        Person2 p10= new Person2("이순신""바닷가");
        Person2 p11= new Person2("이순신""바닷가");
        
        if(p10==p11) {
            System.out.println("두 객체의 주소값이 같다!");
        }else {
            System.out.println("두 객체의 주소값이 다르다!");
        }
        
        if(p10.equals(p11)) {
            System.out.println("두 객체의 내용이 같다!");
        }else {
            System.out.println("두 객체의 내용이 다르다!");
        }
        
    }
 
}
class Person{
    String name;
    String jumin;
    
    public Person(String name, String jumin) {
        super();
        this.name=name;
        this.jumin=jumin;
    }
    
}
 
class Person2{
    String name;
    String jumin;
    
    public Person2(String name, String jumin) {
        super();
        this.name=name;
        this.jumin=jumin;
    }
 
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((jumin == null) ? 0 : jumin.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
//equals() 메서드 자동 오버라이딩 단축키 : Alt + Shift + S = H
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person2 other = (Person2) obj;
        if (jumin == null) {
            if (other.jumin != null)
                return false;
        } else if (!jumin.equals(other.jumin))
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
 
 
//    //Object 클래스의 equals() 메서드 오버라이딩
//    @Override
//    public boolean equals(Object obj) {
//        //전달받은 객체(obj)의 멤버변수가 현재 인스턴스 내의 멤버변수와 같은 지 판별
//        //주의!! Object 타입으로 업캐스팅 되므로 Person 클래스 내의 멤버에 접근 불가능
//        //따라서 Object -> Person2 타입으로 다운캐스팅 필수
//        if(obj instanceof Person2) {//형변환 가능 여부 판별
//            Person2 p=(Person2)obj;//다운캐스팅
//            
//            // 두 객체의 name, jumin 변수 값 비교
//            if(name.equals(p.name)&&jumin.equals(p.jumin)) {//모두 같을 경우 true 리턴
//                return true;
//            }
//        }
//        
//    return false;
//    }    
}
 
 
public class Ex2 {
    public static void main(String[] args) {
        
        /*
         * toString() 메서드
         * -어떤 객체의 정보를 문자열로 변환하여 리턴
         * 기본적으로 Object 클래스의 toString()메서드는
         * 객체의 정보가 클래스명과 객체의 고유값(주소값)을 리턴하도록 정의되어 있음
         * 일반적으로 객체의 정보는 객체 내의 멤버변수에 저장된 데이터를 의미하므로
         * Object 클래스의 toString() 메서드를 오버라이딩하여
         * 객체 내의 멤버변수를 문자열로 결합하여 리턴하도록 해야함
         * -toString() 메서드를 출력문 내에서 호출하는 경우 생략 가능
         * 참조변수명만 지정하여 출력가능
         * 자바에서 제공하는 대부분의 클래스(API)들은 
         * toString() 메서드가 오버라이딩 되어있으므로 객체의 정보를 리턴받을 수 있음
         * ex) Stirng 클래스
         */
        
        Student s=new Student("20201111""이순신"50);
        System.out.println("학생 s의 정보 : "+s);//toString() 메서드 생략되어있음
        System.out.println("학생 s의 정보 : "+s.toString());
        
        System.out.println("학생s의 클래스명 : "+s.getClass().getName());
        System.out.println("학생s의 주소값 : "+s.hashCode());
        System.out.println("------------------------------");
        
        Student2 s2=new Student2("20201111""이순신"50);
        System.out.println("학생 s의 정보 : "+s2);
        System.out.println("학생 s의 정보 : "+s2.toString());
        
        //toString() 메서드 리턴값을 String 타입 변수에 저장
//        String studentInfo = s2;//변수에 저장하거나 메서드 파라미터에 전달 시 생략 불가
        String studentInfo = s2.toString();
        System.out.println(studentInfo);
        
        
    }
 
}
 
class Student{
    String id;
    String name;
    int age;
    
    public Student(String id,String name, int age) {
        super();
        this.age=age;
        this.id=id;
        this.name=name;
    }
}
 
 
class Student2{
    String id;
    String name;
    int age;
    
    public Student2(String id,String name, int age) {
        super();
        this.age=age;
        this.id=id;
        this.name=name;
    }
    //Object 클래스의 toString() 메서드 오버라이딩
    //현재 인스턴스의 멤버변수를 문자열로 결합하여 리턴
 
    @Override
    public String toString() {
        return "Student2 [id=" + id + ", name=" + name + ", age=" + age + "]";
    }
 
    
    
    
//    @Override
//    public String toString() {
//        // TODO Auto-generated method stub
//        return "학번 : "+id+", 이름 : "+name+", 나이 : "+age;
//    }
}
 
 
public class test {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        //String 객체(문자열) 생성 방법
        //1. 리터럴을 할당하는 방법
        //    -> 동일한 문자열이 있는지 상수풀(Constant Pool) 에서 검사하여
        //        동일한 문자열 존재할 경우 해당 위치의 주소값만 전달
 
        String s1="Hello";
        String s2="Hello";
        //생성된 s1과 s2는 문자열 내용도 같고, 주소값도 같다
        
        
        //2. new 연산자를 사용하는 방법
        //        ->동일한 문자열이 존재하더라도 새로운 메모리 공간에 문자열 생성.
        String s3=new String("Hello");
        String s4=new String("Hello");
        //생성된 s3와 s4는 문자열 내용은 같지만, 주소값이 다르다.
        
        if(s1==s2) {//String 객체의 동등비교 연산은 주소값 비교
            System.out.println("s1,s2의 주소값이 같다");
            
        }else {
            System.out.println("s1,s2의 주소값이 다르다");
        }
        
        if(s1.equals(s2)) {//String 객체의 equals()메서드는 내용(문자열) 비교
            System.out.println("s1,s2의 주소값이 같다");
            
        }else {
            System.out.println("s1,s2의 주소값이 다르다");
        }
        
            
        if(s3==s4) {
            System.out.println("s3,s4의 주소값이 같다");
            
        }else {
            System.out.println("s3,s4의 주소값이 다르다");
        }
        
        if(s3.equals(s4)) {//String 객체의 equals()메서드는 내용(문자열) 비교
            System.out.println("s1,s2의 주소값이 같다");
            
        }else {
            System.out.println("s1,s2의 주소값이 다르다");
        }
        
    }
 
}
cs

equlas()와 toString() 메서드에 대해 배워보았다. equals()는 변수에 저장된 내용이 같은지 비교하는 메서드였는데 단순 동등 비교 연산자는 변수의 주소 값을 비교하는데 반해 equals() 메서드는 안의 내용을 비교하는 연산을 수행하였다. 보통의 경우엔 오버 라이딩이 되어있지만 되어있지 않은 경우엔 Alt+Shift+S= H를 사용하여 오버 라이딩을 해주면 따로 설정하지 않아도 자동 적용이 되기 때문에 단축키는 잘 알아둬야 할거 같다. 웹페이지나 로그인 시에 활용을 많이 할 수 있을 거 같아서 잊어먹지 않게 활용하는 방안에 대해서도 잘 알아둬야 할 것 같다. 그리고 toString() 메서드는 객체 내의 저장된 데이터를 반환하는 메서드인데 이것 또한 오버 라이딩이 되어있지 않으면 주소 값만 반환하기 때문에 객체를 찍어 보았을 때 반환 값이 주소 값이라면 단축키를 사용하여 따로 오버 라이딩을 사용해 놓으면 객체의 이름을 찍는 것만으로 객체 내의 정보를 볼 수 있다. 다음에 이런 경우가 있다면 잊지 말고 오버 라이딩 이후 사용해 보아야겠다.

'Java' 카테고리의 다른 글

Java - JDBC  (0) 2020.06.29
Java - Set,List  (0) 2020.06.27
Java - 인터페이스, 마커(Marker)  (0) 2020.06.14
Java - 상수,인터페이스,implements  (0) 2020.06.14
Java - 추상화,final  (0) 2020.06.14