Chapter 12. 자바 기본 API (1)

SeungHyun Son·2021년 6월 28일
0

java.lang 패키지

자바 API는 다양한 클래스들을 제공하는데 그 중 가장 기본적인 클래스들이 java.lang 패키지에 포함되어 있다. java 프로그래밍의 기본이 되는 패키지이므로 별도의 import 없이 사용 가능하다.

Object 클래스

자바의 모든 클래스가 직, 간접적으로 상속 받는 최상위 클래스
자바의 모든 클래스의 기본 특징을 결정한다.

재정의 가능한 메소드

  • protected Object clone() throws CloneNotSupportedException()

    • 객체를 복사하여 전환
  • public boolean equals(Object obj)

    • 객체가 동일한지 확인하여 결과 반환
  • protected void finalize() throws Throwable

    • 가비지 컬렉션이 수행될 때 자동으로 호출
  • public final Class getClass()

    • 객체의 실행 클래스 반환
  • public int hashCode()

    • 객체의 해시 코드 값 반환
  • public String tostring()

  • 객체를 대표하는 문자열로 변환

clone() : 객체의 참조(주소)값만 복사하는 얕은 복사가 아닌 참조 대상 값(메모리)을 복사하는 깊은 복사

재정의 불가능한 메소드

동기화와 관련된 스레드 제어 메소드 들이다.

  • public final void notify()

  • public final void notifyAll()

  • public final void wait()

  • public final void wait(long timeout)

  • public final void(long timeout, int nanos)

test.clone.Point.java

01 package test.clone;
02
03 public class Point implements Cloneable { 
04     private int posX;
05     private int posY;
06
07     public Point(int posX, int posY) {
08          this.posX = posX;
09          this.posY = posY;
10     }
11     @Override // clone 메소드 재정의
12     public Object clone() throws CloneNotSupportedException {
13         return super.clone();
14     }
15     /*** pos X, Y Getter & Setter ***/
16     public int getPosX() {
17         return posX;
18     }
19     public void setPostX(int posX) {
20         this.posX = posY;
21     }
22     public int getPosY() {
23         return posY;
24     }
25     public void setPosY(int posY) {
26         this.posY = posY;
27     }
28 }

test.clone.CloneEx.java

01 package test.clone
02
03 public class CloneEx {
04     public void testClone() {
05         point p1 = new Point(10, 20);
06         Point p2 = p1; // 얕은 복사 : p1의 주소를 복사한다.
07         Point p3 = null;
08
09         try {
10             p3 = (Point) p1.clone(); // 깊은 복사 : p1의 주소가 가리키는 값을 복사한다.
11         } catch(CloneNotSupportedException e) {
12             e.printStackTrace();
13     }
14
15     // p2는 주소를 공유하므로 영향을 받지만, p3는 영향을 받지 않음
16     p1.setPosX(111);
17     p1.setPosY(222);
18
19     System.out.println("p1 = " + p1 + " : (" + p1.getPosX() + ", " + p1.getPosY() + ")");
20     System.out.println("p2 = " + p2 + " : (" + p2.getPosX() + ", " + p2.getPosY() + ")");
21     System.out.println("p3 = " + p3 + " : (" + p3.getPosX() + ", " + p3.getPosY() + ")"); 
22     }
23 }

test.main.Main.java

01 package test.main;
02
03 import test.clone.CloneEx;
04
05 public class Main {
06     public static void main(String[] args) {
07         new CloneEx().testClone();
08         // Point 객체의 참조값은 컴퓨터에 따라 다를 수 있다.
09    }
10 }
------
p1 = test.clone.Point@7852e922 : (111, 222)
p2 = test.clone.Point@7852e922 : (111, 222)
p3 = test.clone.Point@4e25154f : (10, 20)

clone() 함수를 재정의하려면 Cloneable 인터페이스를 상속 받아야 한다. 그렇지 않으면 CloneNotSupportedException 예외가 발생하며 이에 따른 예외 처리 구문도 필요하다.

equals

기본 타입 변수의 값이 같은지 비교할 때, '==' 연산자를 이용하지만 참조 타입 변수일 경우에 '==' 연산자 사용 시 참조하고 있는 대상이 같은지를 비교하게 된다.
아래 예제를 보면, str1과 str2는 서로 다른 주소를 가지므로 둘을 단순 비교하면 False이지만, equals()를 사용하면 참조 타입 변수가 가리키는 값이 참조 대상의 값과 동일한 지 비교하므로 true를 리턴하는 것을 볼 수 있다.

test.equals.EqualsEx.java

01 package test.equals;
02
03 public class EqualsEx {
04 public void testEquals() {
05     String str1 = new String("Apple");
06     String str2 = new String("Apple");
07
08     System.out.println("str1 == str2 : " + (str1 == str2));
09     System.out.println("str1.equals(str2) : " + str1.equals(st2));
10     }
11 }

test.main.Main.java

01 package test.main;
02
03 import test.equals.EqualsEx;
04
05 public class Main {
06     public static void main(String[] args) {
07     new EqualsEx().testEquals();
08     }
09 }
------
st1==str2 : false
st1.equals(str2) : true

getClass()

Object의 runtime class를 반환
JVM에 로딩되어 있는 대상 클래스의 정보를 반환한다.

test.getClass.GetClassEx.java

01 package test.getClass;
02
03 import java.lang.reflect.Field;
04 import test.clone.Point; // 포인트 객체는 clone 예제의 Point Class와 동일
05
06 public class GetClass {
07     public void testGetClass() {
08         Point point = new Point(10, 20);
09
10         Class cls = point.getClass();
11
12         System.out.println("getName() : " + cls.getName()); // 객체의 클래스 이름
13         System.out.println("getSuperclass() : " cls.getSuperclass()); // 상위 클래스 이름
14
15         Field[] fields = cls.getDeclaredFields();
16         for (field f : fields) {
17         System.out.println("Field : " + f);
18         }
19     }
20 }

test.main.Main.java

01 package test.main;
02
03 import test.getClass.GetClass;
04
05 public class Main {
06     public static void main(String[] args) {
07         new GetClass().testGetClass();
08     }
09 }
------
getName() : test.getclass.Point
getSuperclass() : class.java.lang.Object
Field : private int test.getclass.Point.posX
Field : private int test.getclass.Point.posY

hashCode()

객체가 할당 받은 메모리에 맵핑되는 유일한 정수를 해시값으로 반환
메모리 사용의 안정성을 위해 프로그램이 메모리에 직접 접근하는 것을 막고 있으며 new 연산자를 이용해 메모리를 할당할 때 메모리에 접근할 수 있는 코드인 해시 코드를 생성한다.

test.hashcode.GetHashCodeEx.java

01 package test.hashcode;
02
03 public class GetHashCodeEx {
04     public void testHashCode() {
05         Point point = new Point(10, 20);
06
07         System.out.println(point.hashcode());
08     }
09 }
10 class Point { // Point 객체를 선언하여 hashCode 재정의
11     int posX;
12     int PosY;
13
14     public Point(int posX, int posY) {
15         this.posX = posX;
16         this.posY = posY;
17     }
18
19     @Override
20     public int hashCode() { // hashCode 메소드 재정의
21         return "point HashCode : " + super.hashCode();
22     }
23 }

test.main.Main.java

01 package test.main;
02
03 import test.hashcode.GetHashCodeEx;
04
05 public static void main(String[] args) {
06     public static void main(String[] args) {
07         new GetHashCodeEx().testHashCode();
08         // 실행 결과는 컴퓨터에 따라 다를 수 있다.
09     }
10 }
------
point HashCode : 2018699554

toString()

객체의 정보를 원하는 형태로 반환시키고자 할 때 사용

Object 클래스에 정의된 toString()

public String toString() {
    return getClass().getName() + "@"
        + Integer.toHexString(hashCode());
}

toString을 오버로딩 해서 사용하지 않으면 클래스 이름과 16진수 hashCode를 반환

test.toString.ToStringEx.java

01 package test.toString;
02
03 public class ToStringEx {
04     public void testToString() {
05         Point point = new Point(10, 20);
06
07         System.out.println(point);
08         // System.out.println(point.toString());
09     }
10 }
11
12 class Point {
13     int posX;
14     int posY;
15
16     public Point(int posX, int posY) [
17         this.posX = posX;
18         this.posY = posY;
19     }
20
21     @Override
22     public String toString() { // toString 메소드 재정의
23         return "point 객체 : (" + posX + ", " + posY + ")"
24     }
25 }

test.main.Main.java

01 package test.main;
02
03 import test.toString.ToStringEx;
04
05 public class Main {
06     public static void main(String[] args) {
07         new ToStringEx().testToString();
08     }
09 }
------
point 객체 : (10, 20)

0개의 댓글

관련 채용 정보