IT story/Java

D+12 Equals & Access(접근지정자)

jason719 2016. 8. 18. 10:35

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

 protected

 default 

 private 

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




*패키지명은 소문자로 작성한다. 클래스만 대문자를 사용하기 위해 패키지명을 소문자로 하여 구분하기 위함이다.