java.lang 패캐지
- 프로그래밍 시 import 하지 않아도 자동으로 import 됨
- import java.lang.*;문장이 추가됨
- 많이 사용하는 기본 클래스들이 속한 패키지
- String, lnteger, System
Object클래스
- 모든 클래스의 최상위 클래스
- java.lang.Object 클래스
- 모든 클래스는 Object 클래스에서 상속받음
- 모든 클래스는 Object 클래스의 메서드를 사용할 수 있음
- 모든 클래스는 Object 클래스의 메서드 중 일부는 재정의 할 수 있음(final로 선언된 메서드는 재정의 할 수 없음)
- 컴파일러가 extends Object를 추가함
//코드를 작성할 때
class Student{
int studentID;
String studentName;
}
//컴파일러가 변함
class Studnt ectends Odject{
int StudentID;
String studentName;
}
Object 클래스 메서드
메서드 | 설명 |
String toString() | 객체를 문자열로 표현하여 반환합니다. 재정의하여 객체에 대한 설명이나 특정 멤버 변수 값을 반환합니다. |
boolean equals(Object obj) | 두 인스터스가 동일한지 여부를 반환합니다. 재정의하여 논리적으로 동일한 인스턴스임을 정의할 수 있습니다. |
int hashCode() | 객체의 해시코트 값을 반환합니다. |
Object clone() | 객체를 복제하여 동일한 멤버 변수 값을 가진 새로운 인스턴스를 생성합니다. |
Class getClass() | 객체의 Class 클래스를 반환합니다. |
void finalize() | 인스턴스가 힙 메모리에서 제거될 때 가비지 컬렉터(GC)에 의해 호출되는 매서드입니다. 네트워크 연결해 호출되는 메서드입니다. 네트워크 연결 해제, 열러 있는 파일 스트럼 해제 등을 구현합니다. |
void wait() | 멀티스레드 프로그램에서 사용하는 메서드입니다. 스레드를 '기다리는 상태'(non runnable)로 만듭니다. |
void notify() | wait() 메서드에 의해 기다리고 있는 스레드(nonrunnable 상태)를 실행 가능한 상태(runnable)로 가져옵니다. |
toString() 메서드
- Object 클래스의 메서드
getClass().getName() + '@' + Integer.toHexString(hashCode())
-> object.Book@16f65612 => 클래스이름@해시코드 값
- 객체의 정보를 String으로 바꾸어서 사용할 때 많이 쓰임
- String이나 Integer 클래스에서는 이미 재정의 되어 있음
- String은 문자열 반환
- Integer는 정수 값 반환
equals() 메서드
- 두 인스턴스의 주소값을 비교하여 true/false를 반환
- 재정의 하여 두 인스턴스가 논리적으로 동일함의 여부를 반환
- 같은 학번의 학생인 경우 여러 인스턴스의 주소값은 다르지만, 같은 학생으로 처리해야 학점이나 정보 산출에 문제가 생기지 않으므로 이런 경우 equals() 메서드를 재정의 함
Student studentLss = new Student(100,"이상원");
Student studentLee2 = studentLee; // 주소 복사
equals() 매서드 재정의하기
String과 integer의 equals() 메서드
- String은 같은 문자열의 경우 ture를 반환
- Integer는 정수 값이 같은 경우 true를 반환
public class StrinfEquals{
public static void main(String[] ars){
String str1 = new String("abc");
String str2 = new String("abc");
System.out.pringln(str1 == str2); //두 인스턴스 주소값이 같은지 비교하여 출력
System.out.pringln(str1.equals(str2)); // string 클래스의 equals() 메서드사용, 두인스턴스의 문자열 값이 같은지 비교하여 출력
Integer i1 = new Integer(100);
Integer i2 = new Integer(100);
System.out.println(i1 == i2); // 두 인스턴스 주소 값이 같은지 비교하여 출력
System.out.println(i1.equals(is); // Intager 클래스의 equals() 메서드 사용. 두 인스턴스의 정수 값이 같은지 비교하여 출력
}
}
// 결과값 flase true flase true
hashCode() 메서드
- hash: 정보를 저장, 검색하기 위해 사용하는 자료구조
- 자료의 특정 값(키 값)에 대해 저장 위치를 반환해주는 해시 함수를 사용함
index = hash(key) => 저장위치 = 해시함수(객체정보)
- 해시 함수는 어떤 정보인가에 따라 다르게 구현됨
- hashCode() 메서드는 인스턴스의 저장주소를 반환함
- 힙 메모리에 인스턴스가 저장되는 방식이 hash
- hashCode()의 반환 값: 자바 가상 머신이 저장한 인스턴스의 주소값을 10진수로 나타냄
- 서로 다른 메모리의 두 인스턴스가 같다면?
재정의 된 equals() 메서드의 값이 true
동일한 hashCode() 반환값을 가져야 함
- 논리적으로 동일함을 위해 equals() 메서드 재정의 하였다면 hashCode() 메서드로 재정의하여 동일한 값이 반환되도록 함
- String 클래스: 동일한 문자열 인스턴스에 대해 동일한 정수가 반환됨
- integer 클래스: 동일한 정수값의 인스턴스에 대해 같은 정수 값이 반환됨
hashCode() 메서드 재정의하기
- 같은 학생의 경우 같은 정수 값을 반환해야 하므로 학번을 반환하도록 재정의 함
clone() 메서드
- 객체의 원본 복제하는 데 사용하는 메서드
- 원본을 유지래 놓고 복사본을 사용할 때
- 기본 틀(prototype)을 두고 복잡한 생성과정을 반복하지 않고 복제
- clone() 메서드를 사용하면 객체의 정보(멤버변수 값)가 같은 인스턴스가 또 생성되는 것이므로 객체 지향 프로그램의 정보은닉, 객체보호의 관점에서 위배될 수 있음
- 객체의 clone() 메서드 사용을 허용한다는 의미로 cloneable 인터페이스를 명시해 줌
class Cirecle implements Cloneable{ // implements Cloneable: 객체를 복제해도 된다는 의미로 Cloneable 인터페이스를 함께 선언
Point point;
int radius;
Circle(int x, int y, int radius){
this.radius = radius;
point =new Poinr(x,y);
}
public String to String(){
return "원정음"+point +"이고," + "반지름은" + radius +"입니다";
}
@Override
public Object clone() throws CloneNotSupportedException{ // throws CloneNotSupportedException: clone() 메서그를 사용할 때 발샐할 수 있는 오류를 예외 처리함
return super.clone();
}
}
String 클래스
- String을 선언하는 두 가지 방법
String str1 = new String("abc"); // 생성자의 매개변수로 문자열 생성
String str2 ="test"; // 문자열 상수를 가리키는 방식
- 힙 메모리에 인스턴스로 생성되는 경우와 상수 풀(constant pool)에 있는 주소를 참조하는 방법 두 가지
String 클래스로 문자열 연결
- 한번 생성된 String 값(문자열)은 불변(immutable)
- 두 개의 문자열을 연결하면 새로운 인스턴스가 생성됨
- 문자열 연결을 계속하면 메모리 gabage 가 많이 생길 수 있음
String javaStr = new String("java");
String androidStr = new String("android");
Syrtem.out.println(javaStr);
System.out.println("처음 문자열 주소 값:" + System.identityHashCode(javaStr));
javaStr = javaStr.concat(andtoidStr); // 문자열 javaStr와 문자열 androidStr를 연결하여 javaStr 대입.
StringBuilder, StringBuffer 사용하기
- 내부적으로 가변적인 char[] 배열을 가지고 있는 클래스
- 문자열을 여러 번 연결하거나 변경할 때 사용하면 유용함
- 매번 새로 생성하지 않고 기존 배열 변경하므로 gavage가 생기지 않음
- StringBuffer는 멀티 쓰레드 프로그래밍에서 동기화(sybchronization)을 보장
- 단일 쓰레드 프로그램에서는 StringBuilder를 사용하기를 권장
- toString() 메서드로 Strinf변환
StringBuilder 테스트
public class StringBuilderTest {
public statuc void main(String[] args)}
String javaStr = new String("Java");
System.out.println("javaStr 문자열 주소:" + System.identityHashCode(javaStr)); // System.identityHashCode(javaStr) 인스천스가 처음 생성됐을 때 메모리 주소
stringBulider buffer = new StringBuilder(javaStr); // String으로부터 StringBuilder 생성
System.out.println("연산 전 buffer 메모리 주소:" + System.identityHashCode(buffer));
buffer.append("and"); // 문자열 추가
buffer.append("android"); // 문자열 추가
buffer.append("origramming is fun!!!"); // 문자열 추가
System.out.println("연산후 buffer 메모리 주소: " + System.identityHashCode(buffer));
javaStr = buffer.toString(); // String 클래스로 반환
System.out.println(javaStr);
System.out.println("연결된 javaStr 문자열주소: " + System.identityHashCode(buffer));
}
}
// 결과값 : javaStr 문자열 주소:385242642 연산전 buffer 메모리 주소 : 824009085 연산 후 buffer 메모리 주소: 824009085 Java and andcoid programminf is fun!!! 새로만들어진 javastr 문자열 주소: 2085857771
Wrapper 클래스
- 기본 자료형(primitive data type)에 대한 클래스
기본형 | Wrapper 클래스 |
boolean | Boolean |
byte | Byte |
shar | Character |
short | Short |
int | lnteger |
long | Long |
float | Float |
double | Double |
오토박싱(autoboxing)과 언박싱(undoxing)
- lnteger는 객체이고, int는 4바이트 기본 자료형임
- 두 개의 자료를 같이 연산할 때 자동으로 변환이 일어남
Integer num1 = new Integer(100);
int num2 =200;
int sum = num + num2; //num: num.intValue()로 변환(언박싱)
Integer num3 = num2; // num2: lnteger.valueOf(num2)로 변환(오토박싱)
Class 클래스
- 자바의 모든 클래스와 인터페이스는 컴파일 후 class 파일로 생성됨
- class 파일에는 객체의 정보 (멤버변수, 메서드, 생성자 등)가 포함되어 있음
- Class 클래스는 컴파일된 class 파일에서 객체의 정보를 가져올 수 있음
Class 클래스 오기
1. Object 클래스의 getClass() 메서드 사용하기
String s = new String();
Class c = s.getClass(); // getClass() 메서드의 반환형은 Class
2. 클래스 파일 이름을 Class 변수에 직접 대입하기
Class c = String.Class;
3. Class.forName("클래스 이름") 메서드 사용하기
Class c = Class.forName("java.lang.String");
Class 클래스 정보 가져오기
- reflection프로그래밍 : Calss 클래스를 이용하여 클래스의 정보(생성자, 멤버변수, 메서드)를 가져오고 이를 활용하며 인스턴스를 생성하고, 메서드를 호출하는 등의 프로그래밍 방식
- 로컬 메모리에 객체가 없어서 객체의 데이터 타입을 직접 알 수 없는 경우(원격에 객체가 있는 경우 등) 객체 정보만을 이용하여 프로그래밍할 수 있음
- Constructor, Method, Filed 등 java.lang.reflect 패키지에 있는 클래스들을 활용하여 프로그래밍
- 일반적으로 자료형을 알 수 있는 경우에는 사용하지 않음
Class.forName() 메서드로 동적 로딩하기
- 동적 로딩이란
: 컴파일 시에는 데이터 타입이 모두 biding 되어 자료형이 로딩되는 것 (static loding)이 아니라 실행 중에 데이터 타입을 알고 binding 되는 방식
- 프로그래밍 할 때는 어떤 클래스를 사용할지 모를 때 변수로 처리하고 실행될 때 해당 변수에 대입된 값의 클래스가 실행될 수 있도록 Class 클래스에서 제공 static 메서드
- 실행 시에 로딩되므로 경우에 따라 다른 클래스가 사용될 수 있어 유용함
- 컴파일 타임에 체크할 수 없으므로 해당 문자열에 대한 클래스가 없는 경우 예외(ClassNotFoundException)가 발생할 수 있음
String className = "classex.Person"
Class pClass = Class.forName(clasName);
'자바' 카테고리의 다른 글
[JAVA] 변수값 변경하기 (1) | 2022.12.18 |
---|---|
[JAVA] 백준 기초 문제6 (1) | 2022.12.18 |
[JAVA] 변수값 변경 (1) | 2022.12.11 |
[JAVA] 백준 기초문제 5 (2) | 2022.12.11 |
[JAVA] 인터페이스 (3) | 2022.12.11 |