728x90
반응형

int indexOf(Object o)

 

역할 : ArrayList, String 등의 배열_관리_클래스의 메소드인 IndexOf(Object o)객체를 넣으면, 그 객체가 배열에 있으면 해당 배열번호를 리턴해 옵니다. 없으면 -1를 리턴합니다. [예를 들면 String s = new String("abcbe");에서 s.indexOf('b');를하면 1 리턴한다.] 그런데, 어떻게 같은지 알아올까요?

 

_________________________________________________________________________________________________________________________

 

아래에 나올 MyType에는 예를 들어 아래의 필드를 가지고 있다고 가정합니다. 내부에 사용자가 만든 타입 Body의 필드를 포함합니다.

class MyType{

private int x;

private int y;

private String n; //이름

private Body b; // 다른 코드파일에 Body class가 있는 상황.

}

class Body {

private int h; //키

private int w;//몸무게

}

________________________________________________________________________________________________________________________

ArrayList<MyType> myAL = new ArrayList<MyType>();

/*생략*/

myAL.indexOf(new MyType(2, 4, "바둑이", new Body(100, 10)));

_______________________________________________________________________________________________________

 

같은지 알아오는법 :

  특정 객체를 포함하고있나 확인하기 위해, 위와같이 합니다. 그러면 indexOf()는 매개변수로 받은 객체의 각 필드 x, y, n, b myAL객체 내부의 모든 객체랑 equals() 이용해 비교하는것으로, 처음으로 모든 필드의 비교에 true가 나오는 객체의 번호를 리턴해줍니다.

이걸 통해 우리는 우리가 찾는게 몇번째에 있는지 또는 없다는것을 알 수 있습니다.

 

이 예제에서의 문제 :

  String 같은 class는 미리 제작자가 equals() 에서 문자배열만 같으면 true를 리턴하도록 만들어 나서 상관없지만, 나머지 프로그래머가 추가로 만든 class들(여기서 Body같은 경우)은 equals()가 주소가 같은 객체를 가리킬 때만 true를 리턴하도록 해두고 있습니다.

[String s1 = new String("abcde"); String s2 = s1;를 하게되면 s1, s2는 서로 같은 객체(같은 메모리주소)를 가리키게된다.] 그래서 아무리 필드가 같은 객체를 매개변수로 넣아도 x, y, n은 true를 리턴하지만 b는 넣아준 객체의 메모리주소와 myAL에 있는 객체의

b와 메모리주소는 다르므로  false를 리턴하게되고 결과적으로 myAL의 모든객체와 false이기에 indexOf()는 -1를 리턴하게됩니다. 

 

이렇게 해결 :

그래서 프로그래머는 ArrayList()의 IndexOf() 를 쓸 일이 있으면 반드시 필드에 사용자가 새로 만든 타입(여기서 Body)에 equals()를

오버라이딩 해야합니다.

 

Body는 단순하게 h, w가 서로 같으면 true를 리턴하도록 만들었다.

class Body{

private int h;

private int w;

public boolean equals(Object o){

return ( h == ((Body)o).h && w == ((Body)o).w );

}

}

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,