최상위 클래스
, java.lang.Object 클래스Object
에서 상속받고, Object 클래스의 메서드 중 일부는 재정의해서 사용할 수 있음(final이 아닌 메서드만)extends Object
를 추가함 프로그래밍시 import 하지 않아도 자동으로 import
import.java.lang.*;
많이 사용하는 기본 클래스들이 속한 패키지
String, Integer, System...
package ch01;
class Book{
private String title;
private String author;
public Book(String title, String author) {
this.title = title;
this.author = author;
}
// Object 클래스의 toString 오버라이딩
@Override
public String toString() {
return title + "," + author;
}
}
public class BookTest {
public static void main(String[] args) {
Book book = new Book("데미안","헤르만 헤세 ");
// 오버라이드 하지 않으면 JVM의 가상 주소가 프린트
System.out.println(book);
}
}
(물리적 주소가 dif)
논리적으로 동일한 경우 true를 반환하도록 재정의 할 수 있음인스턴스의 저장 주소
를 반환함두 인스턴스가 같다는 것
-> 두 인스턴스에 대한 equals()의 반환 값이 true, 동일한 hashCode() 값을 반환
논리적으로 동일함을 위해 equals() 메서드를 재정의 하였다면 hashCode()메서드도 재정의 하여 동일한 hashCode 값이 반환되도록 함
package ch02;
public class Student {
private int studentNum;
private String studentName;
public Student(int studentNum, String studentName) {
this.studentName = studentName;
this.studentNum = studentNum;
}
public String toString() {
return studentNum + "," + studentName;
}
@Override
public int hashCode() {
return studentNum;
}
@Override
public boolean equals(Object obj) {
if( obj instanceof Student) {
Student std = (Student) obj;
if(this.studentNum== std.studentNum) {
return true;
} else return false;
}
return false;
}
}
package ch02;
public class EqualsTest {
public static void main(String[] args) {
Student std1 = new Student(100, "Lee");
Student std2 = new Student(100,"Lee");
// 이는 주소값이 복사되기에 std1 == std3 는 true
Student std3 = std1;
// 재정의 하기 전에는 std1 과 std2의 해시코드는 다르
System.out.println(std1 == std2);
System.out.println(std1.equals(std2));
System.out.println(std1.hashCode());
System.out.println(std2.hashCode());
// 실제 해시코드는 다르다는 것을 보여 주는 예시
System.out.println(System.identityHashCode(std1));
System.out.println(System.identityHashCode(std2));
}
}
cloneable
인터페이스를 명시해 줌public class Student implements Cloneable{
.......
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
// object가 리턴 타입이지만 Student타입으로 캐스팅하여 변환하도록 함
Student copyStudent = (Student)Lee.clone();
선언법 종류
String str1 = new String("abc");
String str2 = "abc";
인스턴스로 생성되는 경우(new 경우)
와 상수 풀(constant pool)(str2 case)
에 있는 주소를 참조하는 두 가지 방법다른 주소 값
을 가지지만, 상수 풀의 문자열은 모두 같은 주소 값
을 가짐상수풀에 abc라는 스트링이 있고 str2는 그것의 어드레스만 가리키는 것
public class StringTest {
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = new String("abc");
//false
System.out.println(str1 == str2);
String str3 = "abc";
String str4 = "abc";
//true
System.out.println(str3 == str4);
}
}
한번 생성된 String은 불변(immutable)
-> final로 선언 되있음
String을 연결하면 기존의 String에 연결되는 것이 아닌 새로운 문자열이 생성됨
( 메모리 낭비가 발생할 수도 )
public class StringTest2 {
public static void main(String[] args) {
String java = new String("java");
String android = new String("android")
java = java.concat(android);
System.out.println(java);
// 기존 자바 문자열 출력 방법
System.out.println(System.identityHashCode(java));
}
}
기존의 java 문자열은 그대로 남아있음 ! (메모리 가비지 많이 생김)
가변적인 char[]
를 멤버 변수로 가짐멀티 쓰레드
프로그래밍에서 동기화
(synchronization)을 보장단일 쓰레드
프로그램에서는 StringBuilder 사용을 권장toString()
메서드로 String반환사용 예시
package ch03;
public class StringBuilderTest {
public static void main(String[] args) {
String java = new String("java");
String android = new String("android");
// 바뀐 후에도 해시코드 값은 동일하다!
StringBuilder buffer = new StringBuilder(java);
System.out.println(System.identityHashCode(java));
buffer.append(android);
System.out.println(System.identityHashCode(java));
String test = buffer.toString();
System.out.println(test);
}
}
public class StringTextBlock {
public static void main(String[] args) {
String strBlock = """
This
is
text
block
test.""";
System.out.println(strBlock);
System.out.println(getBlockOfHtml());
}
public static String getBlockOfHtml() {
return """
<html>
<body>
<span>example text</span>
</body>
</html>""";
}
}
(필요 할 때 마다)
// 클래스 동적 로드 방법
Class c = Class.forName("java.lang.String");
//클래스 이름으로 직접 Class 클래스 가져오기
Class c = String.class;
//생성된 인스턴스에서 Class 클래스 가져오기
String s = new String();
Class c = s.getClass(); //Object 메서드
package ch04;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class StringTestf {
public static void main(String[] args) throws ClassNotFoundException {
Class c = Class.forName("java.lang.String");
Constructor[] cons = c.getConstructors();
for(Constructor co : cons) {
// java.lang.string의 많은 생성자들이 출력
System.out.println(co);
}
Method[] m = c.getMethods();
for(Method mth : m) {
System.out.println(mth);
}
}
}
new 키워드를 사용하지 않고 클래스 정보
를 활용하여 인스턴스를 생성할 수 있음
reflection 프로그래밍
: Class 클래스를 사용하여 클래스의 정보(생성자, 변수, 메서드)등을 알 수 있고 인스턴스를 생성하고,
메서드를 호출하는 방식의 프로그래밍
로컬 메모리에 객체 없는 경우, 원격 프로그래밍, 객체의 타입을 알 수 없는 경우에 사용
java.lang.reflect 패키지에 있는 클래스를 활용하여 프로그래밍
일반적으로 자료형을 알고 있는 경우엔 사용하지 않음
package ch04;
public class Person {
private String name;
private int age;
public Person() {}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 출력시 name이 출력되게끔
public String toString() {
return name;
}
}
package ch04;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class ClassTest {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
Class c1 = Class.forName("ch04.Person");
Person person = (Person)c1.newInstance();
//반환 값 object라서 person으로 캐스팅
person.setName("Lee");
System.out.println(person);
// peron 인스턴스 있는 경우에만 사용 가능, 처음 부르면 null이 프린트
Class c2 = person.getClass(); //object 함수 , 모든 클래스를 가짐
Person p = (Person)c2.newInstance();
System.out.println(p);
//constructor 부르는 명령
Class[] parameterTypes = {String.class};
//constructor 찾아서 반환
Constructor cons = c2.getConstructor(parameterTypes);
Object[] initargs = {"Kim"};
Person kimPerson = (Person)cons.newInstance(initargs);
System.out.println(kimPerson);
//위는 로컬에 Person이 없을 때 사용
// Person kim2 = new Person("kim");과 같다.
}
}