import java.lang.*; 추가 extends java.lang.Object 가 추가(컴파일러)package exam01;
import java.lang.*; //컴파일러가 자동 추가.
public class Book extends java.lang.Object { // extends java.lang.Object 자동추가
private int isbn;
private String title;
private String author;
public Book(int isbn, String title, String author) {
this.isbn = isbn;
this.title = title;
this.author = author;
}
}
public class Ex02 {
public static void main(String[] args) {
Object[] humans = new Object[2];
humans[0]= new Human();
humans[1]= new Tiger();
}
}
다른클래스들을 묶는방법은 모든클래스들의 상위클래스인 Object로 묶으면 된다.
Class class : 클래스의 정보를 담고있음.
package exam01;
import java.lang.*; //컴파일러가 자동 추가.
public class Book extends java.lang.Object { // extends java.lang.Object 자동추가
private int isbn;
private String title;
private String author;
public Book(int isbn, String title, String author) {
this.isbn = isbn;
this.title = title;
this.author = author;
}
@Override
public String toString() { //toString() 재정의
return "Book{" +
"isbn=" + isbn +
", title='" + title + '\'' +
", author='" + author + '\'' +
'}';
}
}
getClass().getName() : 클래스명(패키지명을 포함한 전체 클래스명) - exam03.BookInteger.toHexString(hashCode()) : 객체의 주소값을 16진수로 변환한 문자열public String to String(){
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public class Book extends java.lang.Object{
}
public class Ex01 {
public static void main(String[] args) {
Book book = new Book();
System.out.println(book); //book.toString();
}
}
LocalDate : 내부에서 이미 재정의되어있는 클래스

== : 동일성비교(주소)
equals() : 동등성비교(재정의)
public boolean equals(Object obj){
return(this == obj);
}
public class Ex03 {
public static void main(String[] args) {
Book b1 = new Book(1000,"책1","저자1");
Book b2 = new Book(1000,"책1","저자1");
System.out.printf("b1==b2 : %s%n",b1==b2);
//flase
System.out.printf("b1.equals(b2)",b1.equals(b2));
//false
}
}
str1과 str2 서로다른객체의 주소값을 참조하지만,
str1.equals(str2)가true이 출력됨.
그이유는 String 클래스와 Integer 클래스에는 equals() 메서드가 이미 재정의 되어 있습니다.
- Object의 equals() 메서드의 원래 기능은 두 인스턴스의 주소를 비교하는 것입니다. 같은 주소인 경우만 equals() 메서드의 결과가 true가 됩니다.
- 두 인스턴스가 있을 때 ==는 단순히 물리적으로 같은 메모리 주소인지 여부를 확인할 수 있고, Object의 equals() 메서드는 재정의를 하여 논리적으로 같은 인스턴스인지(메모리 주소가 다르더라도 같은 학생인지) 확인하도록 구현할 수 있습니다.
public class Ex04 { public static void main(String[] args) { String str1 = new String("ABC"); String str2 = new String("ABC"); System.out.printf("str1==str2 : %s%n",str1 == str2); // >false System.out.printf("str1.equals(str2) : %s%n",str1.equals(str2)); // >true } }
기본 구현 : 객체의 주소값
equals와 함께 동등성 비교를 위한 재정의
hash : 같은 값에 대해서 같은 값을 생성
객체를 찾기 위한 값
기본값은 유일한 값으로 쓰기 위한 객체의 주소값(System.identityHashCode(...))
public class Ex07 {
public static void main(String[] args) {
String str1 = new String("AAA");
String str2 = new String("AAA");
System.out.printf("str1.equals(str2) : %s%n",str1.equals(str2));
System.out.printf("str1.hashCode : %s%n",str1.hashCode());
System.out.printf("str2.hashCode : %s%n",str2.hashCode());
//>str1.equals(str2) : true
//>str1.hashCode : 64545
//>str2.hashCode : 64545
}
}
package exam01;
import java.util.HashSet;
public class Ex06 {
public static void main(String[] args) {
HashSet<Book> books = new HashSet<>();
books.add(new Book(1000,"책1","저자1"));
books.add(new Book(1000,"책1","저자1"));
books.add(new Book(1000,"책2","저자1"));
books.add(new Book(1000,"책3","저자1"));
books.add(new Book(1000,"책4","저자1"));
books.add(new Book(1000,"책5","저자1"));
for(Book book: books){
System.out.println(book);
System.out.printf("str1.hashCode : %s%n",book.hashCode());
}
}
}
String str = "문자열";public class Ex02 {
public static void main(String[] args) {
String s1 = "ABC"; //힙영역 - 문자열 상수 풀
String s2 = "ABC"; //힙영역 - 문자열 상수 풀
System.out.printf("s1==s1 : %s%n",s1==s2);
System.out.printf("s1의주소 : %s%n", System.identityHashCode(s1));
System.out.printf("s2의주소 : %s%n", System.identityHashCode(s2));
}
}
String str= new String("문자열");package exam02;
public class Ex01 {
public static void main(String[] args) {
String s1 = new String("ABC");
String s2 = new String("ABC");
//서로 다른 객체 2개가 생성된다.
System.out.printf("s1==s1 : %s%n",s1==s2);
System.out.printf("s1의주소 : %s%n", System.identityHashCode(s1));
System.out.printf("s2의주소 : %s%n", System.identityHashCode(s2));
}
}
final byte[ ] : 최근
문자열을 값이 변경될때에는 변경된값이 힙에 새로운 주소로 저장되고, 참조변수는 새로운주소를 참조하게된다.(객체생성) 그리고 이전의 값은 아무도 참조하고있지 않기 떄문에 가비지콭렉터에 의해 삭제된다.
public class Ex03 { public static void main(String[] args) { String str = "ABC"; System.out.printf("str 주소 : %d%n", System.identityHashCode(str)); //>str 주소 : 1324119927 str += "DEF"; System.out.printf("str 주소 : %d%n", System.identityHashCode(str)); //str 주소 : 189568618 } }
버퍼란?
Buffer: 임시 메모리
- 문자열을 값이 변경될때에는 새로운 객체가 매번 생성되고 매번 삭제되기 떄문에, 성능저하를 야기한다. 이를 해결하기 위해 버퍼를 사용한다.
- 문자열 가감이 많은 경우 사용함.
StringBuffer : 쓰레드 안전성(동시성 작업시 안전)
StringBuilder : 쓰레드 안전성 X(동시성 작업시 영향을 받는다.)
StringBuffer을 사용할경우 append메서드로 값을 더하더라도 객체의 주소값은 변경되지않는다.(새로운 객체 생성 X)
StringBuffer자료형 sb참조변수의 값을 toString()으로 String클래스 str에 넘겨주면 다른 객체가 생성된다.public class Ex04 { public static void main(String[] args) { StringBuffer sb = new StringBuffer(100); //매개변수가없으면 기본값 16byte로 설정 sb.append("ABC"); System.out.println(System.identityHashCode(sb)); String str = sb.toString(); System.out.println(System.identityHashCode(str)); System.out.println(str); } }
반환값이 this : 동일한 객체를 반환
반환값은 this로 StringBuffer 그 자체이다.
append는 반환값이 this로 StringBuffer객체 자신 그자체를 반환하기 떄문에 메서드체이닝을 의도 할 수있다.public class Ex05 { public static void main(String[] args) { StringBuffer sb = new StringBuffer(100); String str = sb.append("ABC").append("DEF").append("GHI").toString();//메서드체이닝 /* StringBuffer sb2 = sb.append("ABC"); //반환값은 this로 StringBuffer그자체이다. StringBuffer sb3 = sb2.append("DEF"); System.out.println(sb==sb2); */ } }
boolean endsWith(...) : 특정 문자열로 끝나는지 체크boolean startsWith(...) : 특정 문자열로 시작하는지 체크static join : 문자열을 연결static format(..) : 형식화된 문자열로 출력subStringempty : 여백 포함 X 체크isBlack : 여백 포함 체크 indexOf : 왼쪽 → 오른쪽 검색lastIndexOf : 오른쪽 → 왼쪽 검색matches : String strip() : 여백제거String stripeLeading() : 앞쪽여백제거String stripeTrailing() : 뒤쪽여백제거subStringtoCharArray() : toLowerCase() : 소문자로 변환toUpperCase() : 대문자로 변환static valeOf() :byte, short, int, longfloat, doublebooleanchar기본 자료형의 값 → 기능X
기본 자료형에 기능을 주기 위해 Wrapper 클래스사용.
Wrapper : 기본 자료형의 값을 처리하는 편의 기능 클래스
Byte : byte
Short : short
Integer : int
Long : long
Float : float
Double : double
Boolean : boolean
Character : char
static Integer parseInt : 문자열 숫자 → int기본형 숫자 변환String str = "1000";
int num3 = Integer.parseInt(str);
static Integer valueOf(int i)static Integer valueOf(String str)값은 동일하지만 서로 다른 객체가 생성되었다 → 자원낭비
public class Ex02 { public static void main(String[] args) { Integer num1 = new Integer(10); Integer num2 = new Integer(10); System.out.printf("num1 주소 : %d%n",System.identityHashCode(num1)); System.out.printf("num2 주소 : %d%n",System.identityHashCode(num2)); } }자원낭비를 해결하기 위해 valueOf를 사용해서 객체를 생성하는것이 좋다. 값이 같으면 새로운 객체를 생성하지 않는다.
참고) valueof() 메서드 내부에 정의된 범위를 넘어서면 새로운 객체로 생성된다. ex)Integer num1 = Integer.valueOf(100000000;public class Ex03 { public static void main(String[] args) { Integer num1 = Integer.valueOf(10); Integer num2 = Integer.valueOf(10); Integer num3 = 100 // Integer.valueof(100) System.out.printf("num1 주소 : %d%n",System.identityHashCode(num1)); System.out.printf("num2 주소 : %d%n",System.identityHashCode(num2)); } }
Integer num1 = 100;으로 해도 자동으로 valueOf(100)으로 오토박싱해준다.
public class Ex06 {
public static void main(String[] args) {
Integer num1 = 100; //Integer.valueOf(100)
Integer num2 = 200;
}
}
연산은 기본 자료형만 가능한 연산, 같은 자료형끼리만 가능. 그러나, 객체도 연산이 가능하게할수있다. 그이유는 객체에서 자동으로 intValue()를 수행해준다.
public class Ex05 {
public static void main(String[] args) {
int num1 = 100;
Integer num2 = Integer.valueOf(200);
int result1 = num1 + num2; //num2.intValue()
System.out.printf(result1);
}
}
public class Ex07 {
public static void main(String[] args) {
double result = add(10.0,10L);
System.out.println(result);
}
public static double add(Number num1, Number num2){
return num1.doubleValue() + num2.doubleValue();
}
}
클래스의 정보가 담겨 있는 객체가 자동 생성 - class 클래스 객체
package exam03;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Ex08 extends java.lang.Object {
public static void main(String[] args) {
Class cls1 = Person.class;
Field[] fields = cls1.getFields();
Method[] methods = cls1.getMethods();
Constructor[] constructors = cls1.getConstructors();
System.out.println("----Fields----");
for(Field field : fields){
System.out.println(field); //field.toString();
}
System.out.println("----Method----");
for(Method method : methods){
System.out.println(method);//constructor.toString();
}
System.out.println("----Constructor----");
for(Constructor constructor : constructors){
System.out.println(constructor);//constructor.toString();
}
Person person = new Person();
Class cls2 = person.getClass(); //클래스 내부에서 사용할 목적, 객체를 생성해야함.
}
}
public class Ex09 {
public static void main(String[] args) throws ClassNotFoundException
{
Class cls = Class.forName("exam03.Person");
}
}