2016.08.17. Wed 열두 번째 수업!
오늘의 수업내용
- equals 대해 알아보자
- equals 예제를 통해 연습
- Access (접근지정자)의 대한 이해
1. equals 대해 알아보자
- equals()는 복제인간 수준으로 같은 객체는 같다고 본다.
- == 으로는 비교할 수 없기 때문에 equals가 등장했다.
- equals의 재정의에 대해 알아보자
예제
package com.javalesson.ch10object;
class Animal{
String name;
public Animal(String name){
this.name = name;
//필드는 전역변수이자 클래스가 갖는 성질, 성격의 모든 것
//그렇다면 equals로 비교해야하는 것?
}//생성자 end
@Override
public boolean equals(Object obj) {
boolean flag = true;
Animal a = (Animal) obj;//기본데이터타입에서 casting과 같은 상태
//Object class가 모든 클래스의 조상이기 때문에 가
if(this.getClass()!=a.getClass()){
flag = false;
}
if(!this.name.equals(a.name)){
flag = false;
}
return flag;
}
}//class end
public class L04Equals {
public static void main(String[] args) {
String a = "hi";
String b = new String("hi");
System.out.println(a);
System.out.println(b);
System.out.println(a==b);
System.out.println(a.equals(b));
Animal cat = new Animal("페르시안");
Animal cat2 = new Animal("페르시안");
System.out.println(cat.equals(cat2));
}//main end
}//class end
2. equals 예제를 통해 연습
예제
package com.javalesson.ch10object;
import java.util.ArrayList;
class EqualsDemo{
String str_val;
int int_val;
ArrayList list_val;
Object obj_val;
public EqualsDemo(String str_val, int int_val, ArrayList list_val, Object obj_val){
this.str_val = str_val;
this.int_val = int_val;
this.list_val = list_val;
this.obj_val = obj_val;
}//생성자 end
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + int_val;
result = prime * result + ((list_val == null) ? 0 : list_val.hashCode());
result = prime * result + ((obj_val == null) ? 0 : obj_val.hashCode());
result = prime * result + ((str_val == null) ? 0 : str_val.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EqualsDemo other = (EqualsDemo) obj;
if (int_val != other.int_val)
return false;
if (list_val == null) {
if (other.list_val != null)
return false;
} else if (!list_val.equals(other.list_val))
return false;
if (obj_val == null) {
if (other.obj_val != null)
return false;
} else if (!obj_val.equals(other.obj_val))
return false;
if (str_val == null) {
if (other.str_val != null)
return false;
} else if (!str_val.equals(other.str_val))
return false;
return true;
}
}//class end
public class L05EqualsEx {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("list");
EqualsDemo ed1 = new EqualsDemo("demo", 30, list, "object");
EqualsDemo ed2 = new EqualsDemo("demo", 30, list, "object");
System.out.println(ed1.equals(ed2));
}//main end
}//class end
3. Access (접근지정자)의 대한 이해
- Access에서는 클래스별, 패키지별 접근 가능을 이해하기 위해 아래와 같이 패키지와 클래스를 생성한다.
- 같은 클래스, 동일 패키지 내의다른 클래스, 상속 받은 다른 패키지, 다른 패키지에서
- 접근 지정자의 접근 가능 여부를 알아보자.
|
(==)class |
(!=)class |
(!=)pack, extends |
(!=)package |
public |
o |
o |
o |
o |
protected |
o |
o |
o |
x |
default |
o |
o |
x |
x |
private |
o |
x |
x |
x |
예제
package com.javalesson.ch11access.same;
public class L01SameClass {
//서로 다른 접근지정자를 가진 메소드 4개를 만들고 자신 내부(class안)에서 접근시도
public L01SameClass(){
this.publicTest();
this.defaultTest();
this.protectedTest();
this.privateTest();
}
public void publicTest(){
System.out.println("publicTest() 접근");
}
void defaultTest(){
System.out.println("defaultTest() 접근");
}
protected void protectedTest(){
System.out.println("protectedTest() 접근");
}
private void privateTest(){
System.out.println("privateTest() 접근");
}
public static void main(String[] args) {
new L01SameClass();
}//main end
}//class end
package com.javalesson.ch11access.same;
public class L02OtherClass extends L01SameClass{
public L02OtherClass(){
//상속관계 접근지정자 확인
super.publicTest();
super.defaultTest();
super.protectedTest();
//super.privateTest(); -> 접근x 캡슐화(정보은닉, information hiding)
}//생성자 end
public static void main(String[] args){
L01SameClass sc = new L01SameClass();
sc.publicTest();
sc.defaultTest();
sc.protectedTest();
//sc.privateTest(); 접근X, private 접근지정자는 클래스 내부에서만 사용할 수 있다.
}//main end
}//class end
package com.javalesson.ch11access.other;
import com.javalesson.ch11access.same.L01SameClass;
public class L03OtherPackage extends L01SameClass{
public L03OtherPackage(){
//상속관계에서 다른 패키지의 클래스 접근 지정자 확인
super.publicTest();
//super.defaultTest(); 접근x 외부(다른패키지)에서 접근 불가능
super.protectedTest();
//super.privateTest(); 당연히 접근x
}//생성자 end
public static void main(String[] args){
L01SameClass sc = new L01SameClass();
sc.publicTest();
//sc.defaultTest();
//sc.protectedTest();
//sc.privateTest();
//public을 제외한 모든 접근지정자는 외부(다른패키지)에서 접근 불가능
}//main end
}//class end
*패키지명은 소문자로 작성한다. 클래스만 대문자를 사용하기 위해 패키지명을 소문자로 하여 구분하기 위함이다.
'IT story > Java' 카테고리의 다른 글
D+14 CollectionFramework(HashMap, HashSet) (0) | 2016.08.26 |
---|---|
D+13 Final(상수), Enum, Generic(제네릭), Collection Framework(ArrayList) (0) | 2016.08.22 |
D+11 Object, toString, hashCode (0) | 2016.08.17 |
D+10 Abstract(추상클래스), Anonymous(익명클래스), Interface(인터페이스) (0) | 2016.08.13 |
D+9 Extends (상속) Animal예제, Frame예제. (0) | 2016.08.11 |