Java

[Java] Object 클래스, String 클래스, Wrapper(래퍼) 클래스

15호의 개발자 2021. 8. 18. 12:23
반응형

[Java] Object 클래스(최상위 클래스), String 클래스

 

 

1. Object 클래스 (최상위 클래스)

 

Object 클래스는 java의 모든 클래스의 최고 조상 클래스이다.

java.lang 패키지 안에 있는 클래스이다. (java.lang.Object)

eclipse 사용시 'Object'라고 적고 F1을 누르면 자세한 내용을 볼 수 있다.

 

(Program Files\Java\jdk-(버전)\lib\src\java.base\java\lang\Object.java에 위치해있다.)

 

모든 클래스는 Object 클래스에서 상속을 받으며,

모든 클래스는 Object 클래스의 메서드를 사용할 수 있고,

모든 클래스는 Object 클래스의 일부 메서드를 재정의하여 사용할 수 있다.

 

 

이 Object 클래스에는 11개의 메서드가 있다.

 

protected Object clone() 객체 자신의 복사본을 반환한다.
public boolean equals(Object obj) 객체 자신과 객체 obj가 같은 객체인지 알려준다.
protected void finalize() 객체가 소멸될 때 가비지 컬렉터에 의해 자동으로 호출된다.
(거의 사용하지 않는 메서드이다)
public Class getClass() 객체 자신의 클래스 정보를 담고 있는 class instance를 반환한다.
public int hashCode() 객체 자신의 해시코드를 반환한다.
public String toString() 객체 자신의 정보를 문자열로 반환한다.
public void notify() 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다.
public void notifyAll() 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다.
public void wait() 다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히, 또는 지정된 시간(timeout, nanos)동안 기다리게 한다.
public wait(long timeout)
public void wait(long timeout, int nanos)

이 중 protectec로 선언된 메서드들(protected Object clone(), protected void finalize())은

오버라이딩하여 public으로 변경해서 사용해야 한다.

 

위의 메서드 중 몇 개만 자세히 알아보자.

1.1 toString() 메서드

toString() 메서드의 원형은 아래와 같다.

getClass().getName() + '@' + Integer.toHexString(hasCode())

 

toString() 메서드는

객체의 정보를 String으로 바꾸어 사용할 때 유용하다.

자바 클래스 중에는 이미 정의된 클래스가 많으며(ex. String, Integer, Calendar 등),

많은 클래스에서 이 toString() 메서드를 재정의하여 사용한다.

 

 

1.2 equals() 메서드

두 객체의 동일함을 보여주는 메서드이다.

이때, '동일함'이라는 것은 물리적 동일함과 논리적 동일함이 있다.

물리적 동일함: 같은 주소를 가지는 객체
논리적 동일함: ex) 같은 학번의 학생, 같은 주문 번호의 주문

물리적으로 다른 메모리에 위치한 객체라도

논리적으로 동일함을 구현하기 위해 사용하는 메서드가 equlas() 메서드이다.

 

ex)

Student studentKim1 = new Student(100, "김가나");
Student studentKim2 = studentKim;
Student studentKim3 = new Student(100, "김가나");

위의 경우 studentKim1과 studentKim2의 주솟값은 같다.

하지만 studentKim1과 studentKim3의 주솟값은 다르다.

즉, 물리적으로는 다른 위치에 있지만 논리적으로는 같다.

이때 equals() 메서드를 재정의하여 studentKim1과 studentKim3이 같다고 반환하게끔 만들 수 있다.

 

1.3 hashCode() 메서드

자바에서 인스턴스가 생성됐을 때의 해당 메모리 주솟값을 hashcode라고 한다.

 

hashCode() 메서드의 반환값은,

인스턴스가 저장된 가상 머신의 주소를 10진수로 나타낸 값이다.

 

하위 클래스들은 hashCode()를 오버라이드할 수 있다.

 

(실제 해시코드의 주소를 알고 싶다면, System.identityHashCode()를 이용하면 된다.)

 

 

1.4 clone() 메서드

객체의 복사본을 만드는 메서드이다.

기본 틀(prototype)으로부터 같은 속성 값을 가진 객체의 복사본을 생성할 수 있다.

 

생성자는 초기화를 하면서 만드는 것이고,

clone() 메서드는 인스턴스 상태를 그대로 복제하는 것이므로

둘은 다르다.

 

이는 객체지향 프로그래밍의 정보은닉에 위배되는 가능성이 있으므로

복제할 객체는 cloneable이라는 인터페이스를 명시해야 한다.

 

 

1.5 finalize() 메서드

이 메서드는 직접 사용하는 메서드는 아니다.

인스턴스가 힙 메모리에서 해제될 때 가비지 컬렉터에 의해 수행되는 코드이다.

 

 

 

2. String 클래스

2.1 String 클래스란?

String 클래스는 말 그대로 문자열을 다루기 위한 클래스이므로,

데이터(char[] 문자 배열)와 문자열과 관련된 메서드가 있다.

 

 

String 클래스는 내용을 변경할 수 없는 불변 클래스(immutable class)이므로

한 번 선언되거나 생성된 문자열은 변경할 수 없다.

 

따라서, 덧셈 연산자(+) 또는 concat() 메서드를 이용하여 문자열 결합을 하면

문자열이 새로 생성되므로 성능이 떨어지게 된다.

이를 해결해기 위해서, 문자열 결합을 할 경우 StringBuffer나 StringBuilder를 이용하면 된다.

 

StringBuffer는 멀티 쓰레드 프로그래밍에서 동기화(Synchronization)가 보장되지만,

StringBuilder는 동기화가 지원되지 않는다.

단일 쓰레드 프로그래밍이 경우 StringBuffer가 아닌 STringBuilder를 사용하는 것이 더 좋다.

(eclipse 사용시 StringBuffer이라고 쓰고 Ctrl을 누른 채로 클릭을 하면 자세한 내용을 볼 수 있다.)

 

 

String 클래스가 불변 클래스라는 것은,

String s1 = "abc";

String s2 = "abc";

String s3 = "abc";

인 경우,

s1, s2, s3가 가리키는 주소값이 모두 동일하다는 것이다.

 

 

 

2.2 문자열 생성, 문자열 비교

문자열을 만들기 위해서는 아래의 두 가지 방법이 있다.

1. 문자열 리터럴을 이용한 방법 (상수풀에 있는 문자열을 가리킨다.)

   String str1 = "abc";

2. String도 클래스이므로 new를 이용한 방법 (인스턴스로 생성된다)

   String str2 = new String("abc");

 

"abc"라는 문자열을 두 가지 방법으로 만들었지만,

str1 == str2 의 결과는 false가 나오게 된다.

이는 두 방법으로 만든 주솟값이 다르기 때문이다.

 

따라서 문자열을 비교하려는 경우

== 연산자가 아닌 equals를 이용해야 한다.

str1.equals(str2)

equals는 문자열의 내용이 같으면 true를, 다르면 false를 반환한다.

 

 

 

2.3 문자열의 초기화

문자(char)와 문자열(String)은 다르다.

문자와 문자열은 초기화할 때 다음과 같이 한다.

char c = ' ';    //공백으로 초기화 (띄어쓰기 한 칸)

String s = "";  // 빈 문자열로 초기화 (띄어쓰기 없음)

 

 

 

2.4 String Methods

String 클래스의 메서드는 꽤 많다.

자세한 내용은 아래의 링크를 확인하면 된다.

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html

 

String (Java Platform SE 7 )

Compares two strings lexicographically. The comparison is based on the Unicode value of each character in the strings. The character sequence represented by this String object is compared lexicographically to the character sequence represented by the argum

docs.oracle.com

 

이 많은 메서드 중 자주 사용되는 몇 개의 메서드만 추려보자.

 

char charAt(int index) 문자열의 특정 인덱스에 해당하는 문자를 반환한다.
int compareTo(String str) 문자열과 사전순으로 비교한다.
int compareToIgnoreCase(String str) 문자열과 대소문자를 구분하지 않고 사전 편찬 순으로 비교한다.
String concat(String str) 문자열을 이어 붙인다.
int indexOf(int ch)
int indexOf(String str)
특정 문자나 문자열이 처음으로 나타나는 인덱스를 반환한다.
int indexOf(int ch, int fromIndex)
int indexOf(String str, int fromIndex)
지정한 위치 다음부터 확인하여 특정 문자나 문자열이 처음으로 나타나는 인덱스를 반환한다.
int lastIndexOf(int ch) 특정 문자가 마지막으로 나타나는 인덱스를 반환한다.
int lastIndexOf(int ch, int fromIndex) 지정한 위치 다음부터 확인하여 특정 문자가 마지막으로 나타나는 인덱스를 반환한다.
String[] split(String regex) 문자열을 지정된 분리자(regex, regualr expression, 정규식)로 나누어 문자열 배열에 담아 반환한다.
String substring(int beginIndex) 문자열의 지정한 위치부터 끝까지를 새로운 문자열로 반환한다.
String substring(int begin, int end) 문자열의 지정한 위치부터 지정한 마지막 인덱스까지를 새로운 문자열로 반환한다.
String toLowerCase() 문자열을 소문자로 바꿔준다.
String toUpperCase() 문자열을 대문자로 바꿔준다.
String trim() 문자열의 맨 앞과 맨 뒤에 공백을 제거한다.
length() 문자열의 길이를 반환한다.
isEmpty() 문자열이 비어있는지를 확인한다. 문자열의 길이가 0이면 true를, 그렇지 않으면 false를 반환한다.

 

 

 

3.  Wrapper 클래스 (래퍼 클래스)

wrapper 클래스는 기본 자료형 8개를 객체로 다루어야 할 때 사용하는 클래스이다.

기본형 8가지는 객체가 아니므로, 이를 객체로 다뤄야할 때 래퍼 클래스를 이용한다.

기본 자료형을 감싸준다고 하여 wrapper 클래스라 부른다.

 

기본형 자료형(primitive type) 8가지는 다음과 같다.

  1. boolean (논리형, 1byte)
  2. char (문자형, 2byte)
  3. byte (정수형, 1byte)
  4. short (정수형, 2byte)
  5. int (정수형, 4byte)
  6. long (정수형, 8byte)
  7. float (실수형, 4byte)
  8. double (실수형, 8byte)

 

wrapper 클래스는 아래와 같다.

래퍼클래스 기본형
Boolean boolean
Character char
Byte byte
Short short
Integer int
Long long
Float float
Double double

 

ex.

Integer i1 = new Integer(123);
Integer i2 = new Integer(123);

i1과 i2는 객체이므로 서로 가리키는 주솟값이 다르다.

따라서, i1==i2 의 결과는 false이고,

i1.equals(i2) 의 결과는 true가 나온다.

 

 

 

4. Number 클래스

Number 클래스는 모든 숫자 래퍼 클래스의 조상이다.

즉, Byte, Short, Integer, Long, Float, Double, BigInteger, BigDeimal 의 조상 클래스이다.

 

 

 

5. Class 클래스

자바에는 Class 클래스라는 클래스가 있다. (클래스 이름이 Class이다.)

 

자바의 모든 클래스와 인터페이스는 컴파일 후 class 파일로 생성되고,

class 파일에는 객체의 정보(멤버변수, 메서드, 생성자 등)가 포함되어 있다.

 

Class 클래스는 이렇게 컴파일된 class 파일에서 객체의 정보를 가져올 수 있다.

 

이 Class 클래스는 동적로딩할 때 많이 쓰인다.

 

 

Class 클래스 가져오는 방법

1. String s = new String();

   Class c = s.getClass();

 

2. Class c = String.Class;

 

3. Class c = Class.forName("java.lang.String");    //동적 로딩

 

 

 

 

 

(출처: 유튜브 남궁성의 정석코딩)

반응형