[JAVA] 자바 패키지(1)

msung99·2022년 5월 25일
0
post-thumbnail

java.lang, java.util

  • 패키지

java.lang

  • 자동으로 import 됨. import 문 필요x
  • 주요 클래스
  1. Object
  2. StringBuffer, StringBuilder
  3. Math
  4. Wrapper

Object 클래스

  • 모든 클래스의 최상위 부모 클래스

  • 자바의 객체들이 최소한으로 요구될 메소드를 보유

  • Object 클래스에서 제공하는 기본 메소드들을 그냥 사용해도 되지만, 필요에 따라 오버라이딩 해서 사용

메소드 종류

  • getClass() : 클래스 이름

    • 객체는 내부적으로 "Class" 라는 클래스를 가지고 있다.
    • 내부적으로 보유한 Class 클래스를 리턴받는다.
  • hashCode() : 해시코드값 리턴

  • toString() : 객체를 문자열로 만들어 출력

    • 출력형태 : "클래스명@기본 해시코드를 16진수로 변환한 값"
  • 객체 자체를 호출시 => 내부적으로 toString() 을 호출

obj.getClass().getName() : 내부적으로 보유한 Class 라는 클래스를 getClass() 로 리턴받고, getName() 으로 리턴받은 Class 클래스의 이름을 리턴받음


toString()

  • 객체를 문자열로 변환

  • 출력형태 : "클래스명@기본 해시코드를 16진수로 변환한 값"

  • 아래 예제는 Object 클래스의 toString() 을 오버라이딩한것.


equals()

  • == 연산자

    • 참조하는 객체가 동일한지를 비교 (동일한 객체를 가리키는지 비교)
  • equals()

    • 기본적으로는 == 랑 동일하게 동작함.

    • 물리적으로 다른 메모리 객체를 가질지라도, 그 안의 데이터가 동일한지를 비교를 하고싶은 경우 오바라이딩 해줄것!

예제

Member 클래스에서 equals 를 재정의

내 id 와 인자로 전달받은 obj 의 id 가 일치한다면 true 리턴
(즉 문자열 id 가 일치하면 동인한 객체라고 판단)


hashCode()

  • 두 객체가 동일한지 판단할때 사용
    • 해시코드가 다르다면 무조건 다른 객체
    • 해시코드가 같다면 equals() 의 리턴값을 또 비교. equals() 로 리턴받은 값까지 동일하다면 동일한 객체라고 판단하게 됨

Object"s" 클래스

메소드

  • 모든 매개변수의 타입은 무조건 Object 이다.

Object 클래스 vs Objects 클래스

Object 클래스

  • 객체를 하나 생성하면, 이 객체는 Object 클래스를 내부적으로 가지고 있어서, Object 클래스로 부터 물려받은 애들을 수행가능

Objects 클래스

  • 두 객체 사이에 어떤 동작(ex.비교연산)을 수행하기 위한 보조느낌
  • 객체 외부에서 수행한다. => 객체를 인자(매개변수)로 전달받음
  • 매개변수는 모두 Object 타입이다. => 모든 클래스의 객체 타입을 다 받을 수 있기때문

  1. Objects.equals(Object a, Object b)
  • 두 객체의 동등비교
  • 앞서 살핀 equals 와 동일 => a.equals(b) 와 동일하다.
  1. deepEquals(Object a, Object b)
  • 두 객체의 동등 비교

  • 비교할 객체가 배열일 경우 항목 값을 모두 비교
    => Arrays.deepEquals(a, b) 라는 것을 호출함

  • 전달받은게 배열이 아니면, a.equals(b) 로 동작

  • 전달받은 인자가 둘다 정상적인 객체( = NULL이 아닌것) 일때 비교연산을 수행한 결과를 리턴 ( a.equals(b) 결과를 리턴 )
  • 인자중에 둘 중 하나라도 NULL 이라먼 false 리턴
  • 반면 둘 다 null 이여도 true 를 리턴


예제

  1. Wrapper 클래스 안의 Interger 클래스 안에서 equals 가 어떻게 재정의(오버라이딩) 되었는지 살펴보자.
  • 해당 클래스가 가지고 있는 값이 동일하면 true 리턴
    (기존의 equals 는 참조 객체가 동일한지를 봤지만, Integer 클래스는 이 기능을 오버라이딩 해서 참조 객체가 아니라 그 객체 안에 있는 값이 동일한지를 본다.)

    • 두 Integer 객체는 다른 객체를 가지고 있지만, 안에 1000 이라는 동일한 값을 가지고 있어서 equals(o1, o2) 가 true 가 리턴된다.
  1. deepEuals 는 두 인자가 배열이 아니라면 equals 와 동일하게 동작 연산을 수행

    배열이 인자인 경우는 배열의 모든 값을 비교한다.
    (물리적으로 다른 메모리에 위치해도 모든 값이 동일하면 true 리턴 )


해시코드 생성

  • 기본적으로 제공되는 해시코드 (메모리 주소에 기반한 해시코드값) 을 쓰는게 아니라, 내가 직접 hash해시코드값을 지정해보자!

  • Object 클래스의 hashCode() 는 해당 객체의 메모리 주소에 기반한 해시코드값을 생성

  • Objects 클래스의 hash() 는 해당 객체의 인자로 주어진 배열의 값들을 기반으로 해시코드를 생성


  • Objects.hash( Object ... values )

    • 인자로 배열 객체를 받음
    • 매개값으로 주어진 배열의 값들을 해시함수에 던져서 해시코드값을 얻어옴
  • Objects.hashCode(Object o)

    • 인자로 전달받은 객체에 대해 Object 클래스의 hashcode()를 호출함
      => 즉, o.hashCode() 를 호출하고 받은 값을 리턴
    • 매개값이 null 이면 0을 리턴

  • 최상위 클래스인 Object 클래스로부터 상속받은 메소드 hashCode() 를 오버라이딩함.

    • 오버라이딩 내용 : Objects 의 hash 메소드를 인자 2개를 넣어주면서 호출함으로써 받은 해시코드 값을 리턴해준다.

    • 오버라이딩을 안했다면, 객체의 메모리 주소를 Object 클래스의 hashCode() 함수에 인자로 넣어서 나온 해시코드값을 리턴해줌

    • 즉, Objects 클래스의 hash() 를 활용해 오버리이딩을 함으로써, 해당 객체의 번호와(sno) 이름(name) 을 넣어서 해시코드값을 형성하는 기능을 구현한 것이다.

  • s1.hashCode() 를 호출하는 것은 Object 클래스로 부터 상속받은 hashCode() 를 오바라이딩해서 호출하는 것이다. 즉, 코드상에서 보이는 오버라이딩된 hashCode() 가 호출된다.

  • s2.hashCode() 를 호출하는 것은 Objects 클래스에 있는 hashCode() 가 호출되는 것이다!!

  • 결론적으로 객체 s1, s2 는 서로 다른 객체라고 다른 메모리 공간에 생성될지 몰라도 그 안에 1, "홍길동" 이라는 동일한 값을 가지기 때문에 동일한 해시코드값이 생성된다.
profile
블로그 이전했습니다 🙂 : https://haon.blog

0개의 댓글