2022-01-20(목) 10주차 4일

Jeongyun Heo·2022년 1월 19일
0

데이터 출력

04-입출력스트림 / 43 페이지

캐릭터 스트림은 없음

자바스크립트 fetch()
fetch().then().then()
일종의 하나의 흐름처럼

객체 → byte[] / byte → FileOutputStream → 파일

FileOutputStream
객체를 FileOutputStream으로 출력하려면
개발자가 직접 인스턴스에 있는 각각의 필드 값을 바이트 배열로 추출한다.

그런 기능이 없다. 그런 메서드가 없다.

DataOutputStream을 FileOutputStream에 붙인다
객체의 각 필드에 대해 writeUTF() / writeInt() / writeBoolean()
객체를 바이트 배열로 바꾸는 기능은 없다

데코레이터 (도우미 객체)
개발자가 굳이 이 객체를
write(int) 맨 끝 1바이트 출력
write(byte[]) 바이트 배열 출력
하나의 바이트 값 출력
자바의 기본 단위 int

객체를 통째로 출력하는 방법
ObjectOutputStream(객체) ← 객체는 java.io.Serializable 규칙에 따라 만든 객체여야 한다.
serialization(직렬화) : 객체를 바이트 배열로 바꾸는 거
byte[]
write(byte[])

필요하면 FileOutputStream에 BufferedOutputStream을 붙인다

com.eomcs.io.ex11.c

com.eomcs.io.ex11.c.Exam0310.java

serialVersionUID 스태틱 필드 : serialize

04-입출력스트림 / 44 페이지

🔹 serialVersionUID 스태틱 필드
java.io.Serializable 인터페이스를 구현한 클래스에 내장된 스태틱 변수
개발자가 이 변수의 값을 명시적으로 지정하지 않으면 컴파일러가 자동 부여한다.

Member (java.io.Serializable 구현)
• name
• age
• gender
+ serialVersionUID = 번호 (예: 2274) ← 컴파일러가 자동 부여, 개발자가 직접 값을 지정해도 된다.
java.io.Serializable 인터페이스를 구현한 클래스인 경우, 
컴파일러가 자동으로 추가하는 스태틱 필드.
개발자가 직접 추가해도 된다.
// 파일
• 인스턴스 필드 값 : "홍길동", 20, true
• 클래스 정보 : 클래스 이름, 필드 이름, 타입
• serialVersionUID : 버전 번호 (예: 2274)

serialVersionUID 스태틱 필드 : deserialize

04-입출력스트림 / 45 페이지

deserialize : 바이트 배열을 인스턴스로 복원시키는 거

인스턴스를 복원시키려면 클래스가 있어야 됨

파일에 저장된 인스턴스의 버전 번호와
인스턴스를 생성할 때 사용할 클래스의 버전 번호가 일치한다면,
deserialize

버전 번호가 일치한다?
인스턴스를 파일에 저장할 때 사용한 클래스와
파일에서 다시 인스턴스로 복원할 때 사용할 클래스가
"동일한 클래스"임을 뜻한다.

MS-Word 2003  -- 작성 -->  .doc  -- 편집 -->  MS-Word 2003
버전 번호가 같다

serialVersionUID 스태틱 필드 : deserialize 오류

04-입출력스트림 / 46 페이지

Member (java.io.Serializable 구현)
• name
• age
• gender
+ tel ← 클래스의 필드를 추가/변경/삭제하면 버전 번호가 자동으로 바뀐다.
• serialVersionUID = 3371
// 파일
• 인스턴스 필드 값 : "홍길동", 20, true
• 클래스 정보 : 클래스 이름, 필드 이름, 타입
• serialVersionUID : 2274

✓ 파일에 저장된 버전 번호와 복원할 때 사용할 클래스의 버전 번호가 다르다!

✓ 클래스의 필드를 추가/변경/삭제하면 버전 번호가 자동으로 바뀐다.

MS-Word 2021 -- 작성 --> .doc -- 편집 --> MS-Word 2003
버전 번호가 다르다!

모든 serialize 파일에는 serialVersionUID 번호가 반드시 들어 있다.

com.eomcs.io.ex11.c.Exam0310.java

74 : 지금부터 텍스트 데이터입니다

클래스 정보, 인스턴스 타입과 이름, 인스턴스에 들어가는 값

com.eomcs.io.ex11.c.Exam0320.java

잘 읽힘

Member.java 주석 풀어보기

필드를 추가하고 저장한 순간 serialVersionUID가 바뀐다.

바뀐 다음에 320번 다시 read 해보기

InvalidClassException 실행 오류가 발생

stream classdesc serialVersionUID ← 파일에 저장된 버전
local class serialVersionUID ← Member 클래스

파일에 버전 번호가 저장된다
파일에 저장된 버전 번호와 클래스에 자동 부여된 번호하고 다르면 에러

com.eomcs.io.ex08.Exam0230.java
-0x7f // -128 = 1000 0000
0x7f // 127 = 0111 1111
-129는 범위를 넘어간다
0xea = 0000 0000 0000 0000 0000 0000 1110 1010 = 234
234는 127을 넘는다
원래 자바에서 모든 변수는 기본이 4 byte
단, 허락한다
1바이트 메모리에 -128 저장할 수 있
-128은 1바이트를 넘어가는 수가 아니기 때문에 잘라서 넣는 거 허용
원래 127은 4바이트 값인데 4바이트를 1바이트 메모리에 저장할 없지만 정상적으로 저장됨
234는 정상적으로 저장 안 됨
양수 234를 1바이트에 저장 못 함
앞에 1로 시작해서 음수가 됨
앞에 있는 3바이트 날아감
나중에 꺼내면 음수
-22 라는 음수
저장하는 건 되는데 빼서 출력하면 -22
1111 1111 1111 1111 1111 1111 1110 1010
4바이트 int값으로 본다
형변환을 해도 뒤에 값은 안 바뀌니까
127을 넘어가는 양수값을 저장할 때는 강제로 형변환시킨다.

2교시 시작

com.eomcs.io.ex11.c.Exam0320.java

✓ 클래스의 필드를 추가/변경/삭제하면 버전 번호가 자동으로 바뀐다.

The serializable class Member does not declare a static final serialVersionUID field of type long

인터페이스를 구현하는 클래스는 serialVersionUID 필드값이 있어야 한다.
없으면 컴파일러가 자동으로 추가한다.

직접 추가해도 된다. 버전 번호를 본인이 관리해야됨
본인이 관리하면 조금 더 유연하게 관리할 수 있음

serialVersionUID 활용 : io.ex11.d

버전 번호 직접 명시

private static final long serialVersionUID = 1280L;
Member (java.io.Serializable 구현)
• name
• age
• gender
• serialVersionUID = 1280

serialVersionUID = 1280

Member (java.io.Serializable 구현)
• name
• age
• gender
+ tel
• serialVersionUID = 1280 (클래스를 변경했어도 버전 번호를 같게 한다.)

serialVersionUID 그대로 한다.

클래스를 변경했어도 버전 번호를 같게 한다.

// 파일
• 클래스 정보
  - 클래스 이름
  - serialVersionUID
  - 필드 타입 및 이름
• 필드 값

복원되는 객체에는 tel 필드가 추가되어 있다.

데이터를 저장할 때 사용한 클래스와 데이터를 복원할 때 사용한 클래스가 달라도 오류가 발생하지 않는다.
왜? 버전 번호가 같기 때문에!
복원되는 객체에는 tel 필드가 추가되어 있다.
그러면 파일에 없는 tel 필드의 값은? 그냥 null로 초기화된다.

Member 주석 풀기

정수는 0, float•double은 0.0, 레퍼런스는 null로 초기화

지워진 건 값을 안 넣음. 무시. 에러 안 뜸.

버전 번호가 같으면 에러 안 뜸

필드를 추가하거나 삭제하더라도 serialVersionUID 값만 같으면 JVM은 같은 형식으로 판단한다.

데이터 타입 바꿔보기

에러남

변수가 추가되거나 삭제되는 건 괜찮지만

serialVersionUID을 개발자가 직접 관리하면

modifier : 성질을 바꿔버린다

data 타입, 변수명을 제외한 원래 성질을 바꾼다고 해서 modifier 라고 한다.

com.eomcs.io.ex11.e

transient modifier : serialize 대상에서 제외시킴

transient : 일시적인

serialization 대상에서 제외시킨다.

Score
• name
• kor
• eng
• math
• sum
• aver
Score -- new --> 인스턴스 -- serialize --> 파일
                  객체 <-- deserialize -- 파일

sum, aver는 위의 변수를 계산해서 그 결과를 저장하는 변수이다.
이렇게 다른 인스턴스 변수의 값을 가지고 계산한 결과를 저장하는 변수인 경우
serialize 대상에서 제외해야 한다.
그 명령어가 transient(일시적인)이다.
transient는 변수의 성질을 변경(modifier)한다.

transient int sum;
transient float aver;

왜곡된 값이 저장될 수 있다. 이런 상황을 방지하기 위해서
다른 필드값을 계산한 결과인 경우 serialize에서 제외시킨다.
deserialize 한 후에 재계산한다.

계산해서 결과를 저장하는 필드인 경우에는 serialize 대상에서 제외한다.
transient 붙이기
writeObject() 하면 그냥 기본값 0으로 출력된다.

sum, aver는 출력 대상에서 제외됐다.

transient 값은 인스턴스를 준비한 후 별도의 메서드를 통해 다시 계산해야 한다.

다른 인스턴스 변수의 값으로 계산한 결과는 가능한 출력(serialize)하지 말고, 읽을 때(deserialize) 다시 계산하도록 하라!

transient가 어떤 의미를 가지는지 알고 있기

private static final long serialVersionUID = 1280L;
int로 해도 실제 출력된 건 8바이트

com.eomcs.basic.ex01

com.eomcs.basic.ex01.Exam0110.java
Object 클래스 - 자바 최상위 클래스

클래스를 정의할 때 수퍼클래스를 지정하지 않으면
컴파일러는 자동으로 Object를 상속받는다.

-vervose

javap : 프로파일러. 클래스 파일을 상세하게 보여준다.

수퍼클래스를 지정하지 않으면 Object

상위 분류는 하위 분류를 가리킬 수 있다.

Object를 조상으로 갖는다면 당연히 Object의 메서드를 사용할 수 있을 것이다.

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html

모든 클래스는 Object가 수퍼클래스
이 클래스의 메서드를 구현하고 있다.

가비지 컬렉터가 프로그램이 종료될 때까지 메모리가 부족하지 않으면 수집 안 함

getClass()
어떤 클래스의 인스턴스인지 클래스 정보를 리턴

hashCode()
인스턴스의 고유번호를 리턴
인스턴스 주소가 아님!

toString()
클래스 정보를 간단히 출력한다.

여기 있는 메서드는 모든 서브클래스가 다 사용할 수 있다.

obj.toString() == obj.hashCode()
toString 했을 때 끝부분에 나오는 해시코드랑
hashCode 결과값이랑 같음
obj.toString() com.eomcs.basic.ex01.Exam0110$My@78308db1
obj.hashCode() 78308db1

com.eomcs.basic.ex01.Exam0120.java
Object 클래스 - toString() 메서드에 대하여

toString()
패키지명.클래스명@16진수해시값

println()에 넘겨주는 값이 String 타입이 아니라면
내부적으로 toString() 호출하여 그 리턴값을 출력

어차피 내부적으로 호출해주니까 굳이 내가 toString() 안 써도 됨

필드가 없는 인스턴스 생성

05-기본클래스 / 1 페이지

class My {

}


My obj = new My(); // Heap에 생성되는 인스턴스는?

Heap에 생성되는 인스턴스는?
클래스 정보(이름 등)

✓ 인스턴스 필드가 없더라도 클래스 정보 등을 저장한 기본 객체가 생성된다.

com.eomcs.basic.ex01.Exam0121.java

재정의하지 않으면 Object에 있는 toString을 사용한다.

com.eomcs.basic.ex01.Exam0123.java

05-기본클래스 / 2 페이지

Object로부터 상속 받은 toString() 재정의
보통 인스턴스의 내부 데이터를 문자열로 리턴하도록 변경한다.

println()에 String이 아닌 객체를 넘기면
내부적으로 그 객체에 대해 toString()을 호출하는데
Score 클래스의 toString()을 오버라이딩 했기 때문에
오버라이딩 한 toString()이 호출된다.

com.eomcs.basic.ex01.Exam0130.java

Object.equals() : 두 개의 인스턴스가 같은 인스턴스인지 비교한다.

Object에서 상속 받은 equals()는 == 연산자와 마찬가지로 인스턴스가 같은지를 비교한다.

인스턴스의 내용물이 같은지 비교하고 싶다면 equals()를 재정의하라!

String.equals() : 내용물이 같은지 비교한다.

return age == other.age
age 앞에 this 생략된 거

String와 wrapper 클래스는 equals() 오버라이딩 하였다.
StringBuffer 클래스는 equals()를 오버라이딩 하지 않았다.

이클립스에 오버라이딩 기능 있음
Source - Generate hashCode() and equals()...

com.eomcs.basic.ex01.Exam0134.java

= : assign
== : equal

StringBuffer는 Object로부터 상속받은 equals()를 오버라이딩 하지 않았다.
그래서 Object의 equals()가 호출된다. (인스턴스 주소 비교)

Object의 주요 메서드

05-기본클래스 / 2 페이지

toString()
패키지명 + 클래스명 @해시코드(16진수) ← hachCode() 리턴값이랑 같음

05-기본클래스 / 3 페이지

equals(비교할 객체)
두 객체가 같은 객체인지 검사
같은 객체 = 인스턴스 주소가 같다

오버라이딩
String.equals(비교할 객체) : 인스턴스에 들어 있는 문자열이 같은지 검사
Wrapper 클래스도 equals()를 오버라이딩 하였다.

🔹 Wrapper 클래스
Byte, Short, Integer, Long, Float, Double, Character, Boolean

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#method.summary

오버라이딩 하면 Methods declared in class java.lang.Object 여기에 안 나옴

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/StringBuffer.html#method.summary

↑ 여기 있으면 오버라이딩하지 않았다는 거

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Byte.html

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Integer.html#method.summary

대다수는 Object.equals()를 오버라이딩하지 않았다.

com.eomcs.basic.ex01.Exam0140.java
Object 클래스 - hashCode()에 대하여

hashCode() : int
Object에서 상속받은 hashCode()는 인스턴스마다 고유의 4바이트 정수 값을 리턴한다.

println()은 int를 10진수로 출력한다.
toHexString()을 써서 16진수로 출력하자

Integer.toHexString(int) : String
16진수 문자열로 리턴

인스턴스 주소가 아니다! 오해하지 말기!!

인스턴스가 달라도 해시코드를 같게 만들 수 있다.

키 복제
인스턴스가 달라도 키가 같은 수 있다.

Hash 값?

05-기본클래스 / 4 페이지

Hash 값 = 디지털 지문

주민번호, 지문 ← 식별 코드

데이터
• 이미지 파일
• 영상 파일
• 문서 파일
• 실행 파일
• 데이터 배열
• 객체

데이터를 구분하는 식별 코드(번호)

디지털 지문 = hash value(code)

Hash 값은 어떻게 만드는가?

05-기본클래스 / 5 페이지

데이터 -- 계산식(hash algorithm) --> hash 값이 들어 있는 바이트 배열을 만들어낸다.

MD4 / MD5 → 128 bit (16 byte) (MD: Message-Digest)
SHA-1 → 160 bit (20 byte)
SHA-256 → 256 bit (32 byte)
SHA-512 → 512 bit (64 byte)

결과값이 같을 수 있다.
해시 값의 바이트가 클수록 중복 가능성이 줄어든다.
대신 해시 값을 계산하는 시간이 더 걸린다.

🔹 결론
• 중요 데이터 → 중복을 줄여야 한다. → 시간이 더 걸리더라도 더 큰 해시값 사용
예) 사용자 인증서
• 보통 데이터 → 속도 빠른 해시 알고리즘 사용 → 해시값이 작다
예) 파일 식별자

61 * 61 * 61 = 226,981 개의 경우의 수가 있다.

무조건 해시값이 1바이트로 나온다고 가정하자
0 ~ 255
부여할 수 있는 숫자가 한정되어 있음
해시 알고리즘에 의해 계산된 결과가
원본 데이터는 안 겹치니까

고객을 식별하는 인증서는 크다 중요한 거니까
중요 데이터 예 : 사용자 인증서
보통 데이터 예 : 파일 식별자
파일은 약간 겹쳐도 상관없다

Hash 값 사용처

05-기본클래스 / 6 페이지

Hash 값 사용처 : 같은 데이터임을 검사할 때

🔹 두 데이터가 같은지 검사
1. 원본 - 복사본
처음부터 끝까지 순서대로 1byte씩 값을 비교한다.
가장 완벽한 검사
데이터가 클수록 시간이 오래 걸린다

­2. 원본 - 복사본
원본의 해시 값 - 복사본의 해시 값
해시 알고리즘으로 계산한 해시 값 비교해서 검사한다.
MD5, SHA-256 등
해시 값은 크기가 작음
해시 값은 1MB도 안 되기 때문에 검사 속도(비교 속도) 빠르다!

서버에서 파일을 올려놓고
오리지널을 비교할 거냐 요약본을 비교할 거냐
운전자를 조사해야됨
주민번호로 짧게 비교함. 요약본으로 비교.

친자확인
얼굴이 비슷하다고 넘어갈 수 없음
유전자 검사
크리티컬한 업무의 경우에서만 한해서만
웬만하면 데이터가 중복이 안 된다

실제 현업에서 사용하는 거 100개도 안 됨
만드는 게 어려움

원본을 비교하는 대신 요약본 비교
100%가 아니라 99% 같다

원본을 일일이 비교하기 보다는 요약본

Hash 값 사용처 예 - 다운로드 받은 파일 비교

05-기본클래스 / 7 페이지

서버에서 a.exe
a.exe -- 해시 알고리즘 --> 해시값 (인터넷에 공개)

PC에 다운로드 받는다
a.exe -- 해시 알고리즘 --> 해시값

해시값 비교
같으면, 서버에서 제대로 받았다!
다르면, 중간에서 조작되었다!

https://tomcat.apache.org/download-90.cgi

중간에 이상한 거 삽입
특정 해커 사이트에 자동 전송하게 되어 있다고 가정

window sha512 checksum

https://answers.microsoft.com/en-us/windows/forum/all/finding-checksum-values-in-windows-10/dbc3c569-4b5a-4967-8810-c25255cdc1fd

https://downloads.apache.org/tomcat/tomcat-9/v9.0.56/bin/apache-tomcat-9.0.56.zip.sha512

dir apa*

그때 쓰는 게 해시 알고리즘

certutil 쳐보기
CertUtil

certutil -hashfile 오른쪽 버튼 누르고

파일이 크면 클수록 알고리즘이 복잡할수록 오래 걸린다
중복될 가능성이 적다는 거

맨 앞에 3자리 맨 끝에 3자리 비교해보기

// powershell
get -filehash
cd Dow*
dir apa*
Get -FileHash -Path 파일명 -Algorithm SHA512 | Fomat-List

shasum -a 512 apache-tomcat-9.0.56.zip

equals까지 같은지 비교

com.eomcs.basic.ex01.Exam0141.java

인스턴스가 다르면 다른 해시코드를 리턴하게 되어 있다

Object의 hashCode()

05-기본클래스 / 8 페이지

Object.hashCode() : int
인스턴스마다 고유의 식별값을 리턴

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html

String 클래스에서 hashCode() 오버라이딩함

String.hashCode() : int
같은 문자열을 갖고 있으면 같은 해시값을 리턴하게 되어 있다
문자열을 가지고 해시값을 계산
문자열이 같으면 해시값도 같다
"문자열A" == "문자열B"
해시값 == 해시값
문자열에 대해서 해시값을 뽑아내기 때문에
해시코드는 인스턴스 주소가 아니다!

이클립스 기능 사용하기..
항상 두 개를 한 쌍으로 오버라이딩하기

visualgo

https://visualgo.net/en

데이터를 저장할 때 데이터를 저장할 공간을 만들어 놓고 집어 넣는 게 아니라
공간이 부족하면 기존의 배열을 복사해서 끊임없이 새로운 쓰레기 생성
열차를 계속 붙이듯이
새로운 노드를 만들고 거기에 80을 붙인다

https://visualgo.net/en/hashtable

Hash code를 이용한 값 저장

05-기본클래스 / 9 페이지

data
17
8
5
21
15
33
48

Hashtable

77/11 = 0
0번 레일에 넣는다
11이 이미 있으니까 그 다음으로 들어간다

분산해서 저장
데이터를 찾을 때 굉장히 빠르다

48을 지워보자

0번 인덱스부터 끝까지 찾는다
찾아서 지운다
지우고 앞으로 땡겨온다
1. 레일을 찾는다
2. 4번 레일에서 찾는다
3. 찾았다
3번 만에 삭제할 대상을 찾았다.
해시테이블

pseudo code (의사 코드)

위치를 찾을 때 해시코드를 쓴다

Hashset

05-기본클래스 / 10 페이지

com.eomcs.basic.ex01.Exam0150.java

🔹 Hashset
Hash : 데이터를 저장/조회/삭제할 때 해시값으로 데이터 위치를 찾는다. (결정한다.)
set : 집합. 같은 값을 중복 저장할 수 없다.
같은 값 = 해시값이 같은 경우를 말한다.
해시값이 같은 경우 중복 저장할 수 없다.

Hashset은 해시값으로 중복 여부를 검사한다.
hashCode()를 오버라이딩하지 않았으면 Object의 hashCode()를 쓴다.
Object의 hashCode()는 인스턴스마다 해시값을 다르게 리턴한다.
같은 데이터를 갖고 있어도 해시값이 다르다는 이유로 Hashset에 저장된다.
같은 데이터를 가진 중복 데이터가 저장되어 버렸다.
hashCode()를 오버라이딩하여 같은 데이터를 갖고 있으면 같은 해시값을 리턴하도록 하자.

HashSet
ArrayList처럼 객체를 보관한다.

com.eomcs.basic.ex01.Exam0151.java

인스턴스는 달라도 같은 데이터를 갖고 있기 때문에 같은 해시값을 리턴

이미 s2와 같은 코드값을 갖고 있는 s1이 있음
집합은 중복 저장할 수 없음

이미 s2의 해시값과 같은 객체(s1)가 들어 있기 때문에 중복을 막기 위해 s2는 저장되지 않는다.

HashSet을 쓰게 되면 꺼낼 때 순서대로 못 꺼냄
해시값으로 인덱스를 결정하기 때문에 값을 꺼낼 때 저장한 순서대로 꺼낼 수 없다.

순서대로 꺼내고 싶으면 그냥 ArrayList 사용해야 됨

HashMap

데이터를 저장할 레일
레일 번호 : 해시코드를 5로 나눈 나머지

HashMap

com.eomcs.basic.ex01.Exam0152.java

값을 저장할 때 key 객체의 해시코드를 이용하여 저장할 위치(인덱스)를 계산한다.
따라서 해시코드가 같다면 같은 key로 간주한다.

key : 해시값을 제공하는 객체
value : 저장할 값

  key             value
MyKey("ok")      new Student("홍길동", 20, false)

알아보기 쉬우라고 저렇게 한 거고 객체를 저장하는 게 아니라 객체 주소를 저장하는 거

해시값과 equals() 리턴값을 조사해서 같은 key인지 따진다.

k3랑 k6랑 같은 haha
해시코드가 다르다고 나오기 때문에

com.eomcs.basic.ex01.Exam0153.java

메서드 오버라이딩
인스턴스가 다르더라도 해시코드 값으면 같은 key로 본다
그래서 k3로 저장한 값을 k6로 뽑아낼 수 있다.

hashCode()만 오버라이딩하면 안 됩니까? 안 됨
equals()도 오버라이딩 해야 됨
반드시 둘 다 오버라이딩 해야 됨

둘 다 일치해야 같은 key라고 인식한다
그래서 이클립스에서 Generate 할 때도 두 개가 같이 묶여 있는 거

인스턴스가 다르더라도 내용이 같으면 같은 인스턴스로 취급하고 싶어서

String 클래스

key를 사용해서 저장하면
찾을 때 key로 바로 찾을 수 있다
마치 인덱스로 바로 찾듯이

HashMap 객체를 만들 때 key 타입으로 Integer를 사용하기로 선언했기 때문에 다른 타입을 키로 사용할 수 없다.

com.eomcs.basic.ex01.Exam0160.java

클래스 정보를 리턴하니까 타입이 Class

getName()
getSimpleName()

레퍼런스 배열은 있어도 인스턴스 배열은 없다
레퍼런스 배열 [L
String 레퍼런스 배열 [Ljava.lang.String;
long 배열 [J
boolean 배열 [Z

reserved keyword

Class cls
Class clazz

getComponentType()
배열의 한 항목의 클래스 정보 리턴

com.eomcs.basic.ex01.Exam0170.java

The method clone() from the type Object is not visible

Object가 clone()을 public으로 공개 안 함
protected

private - 같은 클래스의 멤버만 접근 가능

MyClass
private int a
void m1() {...} --- O
void m2() {...} --- O

OtherClass
void x1() {...} --- X
void x2() {...} --- X

default - 같은 클래스의 멤버만 접근 가능 + 같은 패키지 소속 클래스의 멤버 접근 가능

com.eomcs.test1

MyClass
(default) int a
void m1() {...}
void m2() {...}

PeerClass
void hello() {} --- O

-------------------

com.eomcs.test2

OtherClass
void x1() {...} --- X
void x2() {...} --- X

protected - 같은 클래스의 멤버만 접근 가능 + 같은 패키지 소속 클래스의 멤버 접근 가능 + 서브 클래스에서 this를 통해 접근 가능(자신이 상속받은 멤버에 한해서만)

com.eomcs.test1

MyClass
protected int a
void m1() {...}
void m2() {...}
protected void m3() {...}

PeerClass
void hello() {} --- O

-------------------

com.eomcs.test2

OtherClass
void x1() {...} --- X
void x2() {...} --- X


MySubClass
void ohora() { 
  this.a = 100; --- O
  this.m3(); ------ O
}

public - 모든 멤버 접근 가능

com.eomcs.test1

MyClass
protected int a
void m1() {...}
void m2() {...}
protected void m3() {...}

PeerClass
void hello() {} --- O

---------------------------

com.eomcs.test2

OtherClass
void x1() {...} --- O
void x2() {...} --- O


MySubClass
void ohora() { 
  this.a = 100; --- O
  this.m3(); ------ O
}

clone 메서드

Object
public String toString() {...}
public int hashCode() {...}
public boolean equals() {...}
protected Object clone() {...}
com.eomcs.basic.ex01

Score
toString() {...}
Exam0170
void m1() {
  s1.clone();
  this.clone(); // 자신이 상속받은 protected 메서드는 접근 가능하다.
}

Exam0170도 Object의 자손
Score도 Object의 자손

The method clone() from the type Object is not visible

남이 상속받은 메서드를 호출해서 안 됨

남이 상속받은 protected 멤버로 접근할 수 없다

JVM에게 이 클래스의 인스턴스를 복제할 수 있음을 표시하기 위함이다.

0개의 댓글