Object , String, Wrapper 클래스
Object 클래스란?
- 모든 클래스의 최상위 클래스
- java.lang.Object 클래스
- 모든 클래스는 Object 클래스에서 상속 받음
- 모든 클래스는 Object 클래스의 메서드를 사용할 수 있음
- 모든 클래스는 Object 클래스의 일부 메서드를 재정의 하여 사용할 수 있음
toString() 메서드
getClass().getName() + '@' + Integer.toHexString(hashCode())
- 객체의 정보를 String으로 바꾸어 사용할 때 유용함
- 자바 클래스중에는 이미 정의된 클래스가 많음
EX) String,Integer,Calender 등
- 많은 클래스에서 재정의하여 사용
equals() 메서드
- 두 객체의 동일함을 논리적으로 재정의 할 수 있음
- 물리적 동일함: 같은 주소를 가지는 객체
- 논리적 동일함: 같은 학번의 학생, 같은 주문 번호의 주문
- 물리적으로 다른 메모리에 위치한 객체라도 논리적으로 동일함을 구현하기 위해 사용하는 메서드
equals() 메서드 예시
Student student1 = new Student(100,"진문장");
Student student2 = student1;
Student student3 = enw Student(100,"진문장");
- student 1 과 student2 은 같은가?
- 물리적: 둘은 동일하다 왜냐하면 student1의 물리적 주소를 student2가 참조하기 때문에 물리적으로 동일한 상태이다.
- 논리적: 동일한 객체를 참조하기때문에 논리적으로 동일하다.
- student1 과 studnet3 는 같은가?
- 물리적: 둘은 JVM 힙 메모리 영역에서 각자 다른 주소를 가지고 있기 때문에 동일하지 않다.
- 논리적: 둘의 id 와 name이 동일하기 때문에 논리적으로는 같다. 그럼으로 equals 메소드를 구현하여 논리적 동일하다는 것을 알려줘야한다.
/* equals 메서드 구현 */
@Override
public boolean equals(Object obj) {
if( obj instanceof Student) {
Student s = (Student)obj;
if ( this.id == s.getId() && this.name.equals(s.getName()) ){
return true;
}
}
return false;
}
hashCode() 메서드
- 모든 객체들은 생성될 때 hashCode가 지정됨
- hahsCode() 메서드의 반환 값: 인스턴스가 저장된 가상머신의 주소를 10진수로 반환
- 두개의 서로 다른 메모리에 위치한 인스턴스가 동일하다는 것은?
- 논리적으로 동일: equals()의 반환값이 true
- 동일한 hashCode 값을 가짐: hashCode()의 반환 값이 동일
cloone() 메서드
- 객체의 복사본을 만듦
- 기본 틀으로 부터 같은 속성 값을 가진 객체의 복사본을 생성할 수 있음
- 객체지향 프로그래밍의 정보은닉에 위배되는 가능성이 있으므로 복제할 객체는 cleneable 인터페이스를 명시해야 함
String 클래스
String str1 = new String("abc"); // 인스턴스로 생성됨
String str2 = "abc"; // 상수풀에 있는 문자열을 가리킴
String immutable
- 한번 선언되거나 생성된 문자열을 변경할 수 없음
- String 클래스의 concat() 메서드 혹은 "+"를 이용하여 String을 연결하는 경우 문자열은 새로 생성 됨
String str1 = "hello";
String str2 = "world";
String str3 = str1 + str2; // "helloworld"
StringBuilder 와 StringBuffer
- 가변적인 char[]배열을 멤버변수로 가지고 있는 클래스
- 문자열을 변경하거나 연결하는 경우 사용하면 편리한 클래스
- StringBuffer는 멀티쓰레드프로그래밍에서 동기화(Synchronization)이 보장됨
- 단일 쓰레드 프로그래밍에서는 StringBuilder를 사용하는 것이 더 좋음
- toString() 메서드로 String 반환
Wrapper 클래스
기본 타입의 데이터를 객체로 취급해야 할 경우 기본타입을 객체로 감싼 Wrapper 클래스를 사용
| primitive type | Wrapper Class |
|---|
| boolean | Boolean |
| bye | Byte |
| char | Character |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
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"); // 동적 로딩
reflection 프로그래밍
- Class 클래스로 부터 객체의 정보를 가져와 프로그래밍 하는 방식
- 로컬에 객체가 없고 자료형을 알 수 없는 경우 유용한 프로그래밍
- java.lang.reflect 패키지에 있는 클래스 활용
newInstance() 메서드
- Class 클래스 메서드
- new 키워드를 사용하지 않고 인스터스를 생성
- 9 버전 이후에는 deprecated 되어 사용 비추천
forName() 메서드와 동적 로딩
- Class 클래스 static 메서드
- 동적 로딩 이란?
- 컴파일 시에 데이터 타입이 모두 binding 되어 자료형이 로딩되는 것이 아니라 실행 중에 데이터 타입을 알고 binding 되는 방식
- 실행 시에 로딩되므로 경우에 따라 다른 클래스가 사용될 수 있어 유용함
- 컴파일 타임에 체크 할 수 없으므로 해당 문자열에 대한 클래스가 없는 경우 예외가 발생할 수 있음