hierarchy : 계층
멀티쓰레드 프로그램할 때 동기화synchronization위해 사용하는 메서드라서
오버라이딩 불가. final로 선언되어있다.
Book book = new Book("데미안", "헤르만 헤세");
System.out.println(book);
String str = new String("test");
System.out.println(str);
ch01.Book@2133c8f8
test
클래스의 풀네임(패키지 이름까지) @ 인스턴스 메모리의 위치에 대한 가상값(16진수)
똑같이 new한 건데 밑은 test로
String str = new String("test");
System.out.println(str.toString());
String은 .toString()이
이미 오버라이딩되어있음
Book클래스도 상속받은 object클래스(최상위클래스)의 toString()메소드 오버라이딩 해주면
class Book{
private String title;
private String author;
public Book(String title, String author) {
this.title = title;
this.author = author;
}
@Override
public String toString() {
return title + ", " + author;
}
}
=>
데미안, 헤르만 헤세
test
으로 출력됨
--------------
2개의 인스턴스가 같다는 건 힙메모리 위치가 같다는 것.
==(assignment 2개) : 주소값 비교(equals()메서드의 원형)
물리적으로 다르지만 논리적으로 같다.
논리적으로 같다로 재정의 가능
주소값을 hashcode라고 함.
자바에서 힙메모리를 관리하는 방식이 해시방식(자료구조에서)
키값이 있고 그 키값에 대해서 오브젝트를 어디다 저장할 건지 address를 지정하는 방식
찾을 떄도 마찬가지 키값을 알게되면 인덱스를 알 수 있는 것.
hckey)=index
해시펑션에 키를 넣고 거기에 해당하는 인덱스를 반환받는다.
index가 저장될 값이고 오브젝트 찾아갈 값.
두 객체가 논리적으로 같다면 해시코드 값도 같아야 함.
실제적으로 물리적으로는 달라. 그 물리적 해시코드 꺼내보는 함수는 따로 있어
equals()메서드와 hashCode()메서드는 페어
이퀄스 오버라이딩한다면 해시코드도 오버라이딩해야함
인티저, 스트링 클래스는 이퀄스 오버라이딩 이미 되어있음
같은 문자열인지 확인. 그 때 해시코드값을 찍어보면 같아
스트링 클래스 내부적으로 이퀄스랑 해시코드 모두 오버라이딩
스트링 문자열 값을 조합해서 숫자값을 반환
해시코드 반환값이 int
Student std1 = new Student(100, "Lee");
Student std2 = new Student(100, "Lee");
Student std3 = std1;
System.out.println(std1 == std2);
System.out.println(std1.equals(std2));
System.out.println(std1 == std3);
=>
false
false
true
주소값을 넘겨준 거라서 true
new하면 생성자 호출되고 일련의 과정을 거쳐 객체가 생성이 됨.
클론하면 원본 객체를 그대로 또 하나의 인스턴스
멤버변수가 같고 모든 게 똑같은 객체를 만듦.
객체 생성후 변수값이 바뀌고 다른 값이 될 수 있는데 그 object 상태를 그대로
하나의 프로토 타입을 그대로 붕어빵처럼 찍어내는 것.
생성자는 초기화해서 초기값 갖고 생성되는 것
변한 값을 그대로 복제하는 게 클론
동일한 인스턴스 생성
정보은닉이라던지 객체 보호관점에서 private까지 다 복제가 되니까 위배
명시적으로 클론해도 된다는 인터페이스 선언
실제로 구현해야하는 메서드는 없어
이 오브젝트가 복제가능하다 선언해준 것과 같아
------------------
String str1 = new String("abc");
String str2 = "abc";
<String클래스 사용법 2가지>
new 하면 힙에 메모리 생성
상수풀에 "abc"라는 스트링이 있고 그 스트링의 어드레스만 가르키는 것.
2개의 인스턴스는 다른 것
스트링 클래스는 new해서 만들 때
char array안에 들어감
스트링 소스 안에 final로 선언
따라서 스트링은 한번 생성하면 불변 (immutable)
상수값도 변할 수 없어
수정시 새로 생기는 것.
가리키는 메모리가 달라지는 것.
메모리 가베지가 많이 생겨, 오버헤드가 많이 생김
따라서 StringBuiler, StringBuffer로 하자
둘다 캐릭터버퍼를 가지고 있는데
스트링버퍼가 멀티스레드 안에서 동기화가 제공
(두개이상의 쓰레드가 같은 메모리에 access할 때 순서가 정해짐.)
스트링빌더는 단일스레드/ 스트링버퍼는 멀티스레스에서 사용
서블릿이나 서버사이드에서 클라이언트로 데이터를 리스펀스를 할 때
웹서버에서 html 또는 json(name, value 페어로)
태그 스페이스 뉴라인하려면 굉장히 지저분한데
텍스트 블럭쓰면 됨(java13부터 적용되는 거라 아직 많이 안 쓸 수도 있어)
프로젝트명 우클릭 properties-java compiler- (이하 이미지 참고)
---------------------
동적 로딩 런타임 시에 필요한 클래스를 로딩시켜서 사용하게 된다.
다른 언어에도 동적 로딩 하는 방식이 있다.
자바에서는 클래스 클래스를 이용해서 할 수 있음.
컴파일시에 데이터타입이 바인딩되는 게 아니라
장점 : 동적으로 그 때 그때 불러들여서 바인딩할 수 있다는 큰 장점이 있지만(속도는 좀 느리겠지만)
단점은 컴파일시에 타입 detaction이 안됨. 런타임때 불렀는데 라이브러리나 클래스가 로컬에 없다던가 스펠링이 틀릴 수 있어. 그럼 시스템 다운.
스태틱하게 데이터타입을 다 선언하는 게 아니라 시스템이 돌아가다가 필요한 클래스를 부르는 건 큰 장점이긴 함.
스트링 가지고 이렇게 프로그래밍할 일은 거의 없어
스트링은 선언해서 .찍으면 다 볼 수 있는데 어떨 때 하냐면
리플렉션프로그램이라고 하는데 메서드가져와서 임복 호출하고 할수있다...?
로컬에 오브젝트가 없을 때 리모트에 있는 오브젝트나 클래스를 임복케이션시킬때.. 그럴 때 리플렉션 프로그램을 함..
같은 메모리 공간, 프로세스가 로컬.
프로세스가 따로면 예를 들면 워드랑 엑셀의 메모리공간은 서로 따로
다른 프로세스면 같은 머신 안에서도 메모리 따로기 때문에 리플렉션 사용
'패스트캠퍼스 > Java Spring 웹 개발 마스터' 카테고리의 다른 글
ch 03. 객체지향 핵심 메모 (0) | 2023.03.09 |
---|---|
ch 02. 객체지향 입문 메모 (0) | 2023.03.04 |
ch 01. 자바 기초 메모 (0) | 2023.02.27 |