ㅇTL

Chap5-2 본문

2-1/객체지향 - java

Chap5-2

정노르레기 2022. 4. 4. 02:39

Variables and Memory

* 모든 값은 1바이트 이상

- 메모리는 데이텉를 byte 단위로 연속적으로 저장하는데 사용됨

- 메모리 저장 -> memory location

- 데이터의 address = memory location의 첫번째 byte의 주소

primitive type (기본형 타입)

-> 실제 값을 메모리에 저장함. 해당 주소에 해당 값을 저장한다 (당연)

(변수에 할당된 memory location에 저장한다고 표현)

 

class type

-> 메모리에 memory address를 저장함 ! (reference를 저장한다 !)

(변수에 할당된 memory location에 memory address/reference를 저장한다고 표현)

- 클래스에 대한 데이터는 다른 곳에 저장되고, 해당 주소를 해당 변수에 저장함 !

 ( object는 다른 곳에 저장됨 )

 

- class변수는 fixed size (primitive와 마찬가지, 주소만 저장하니까) , object 변수는 any size도 될 수 있음 ! (다른곳에 저장되면서)

 

* 여기는 c처럼 주소를 표현하고 *,& 쓰고 그러는거아니고

클래스 변수 자체가 reference를 담는 reference 변수임 -> 그냥 클래스이름.멤버 이렇게 접근함

그렇지만 변수 자체가 주소 저장함! 그치만 . 으로 멤버에 접근함

(함수에 그냥 클래스 타입으로 넘겨줘도 call by reference로 작동함 ! 다 바꿀 수 ㅇ ~ 애초에 주소가저장되어있는거니까)

=  references !

클래스 변수 = reference variable ! 

- 여러 reference var은 하나의 같은 reference를 담고잇을 수 ㅇ (당연)

 

* reference 관련 주의 사항

어떤 클래스 내부에 멤버로 다른 클래스 변수가 들어잇다고 가정

private Date born; 이런식으로. (private -> 외부에서 꼭! 접근 못해야함. 당연)

이를 초기화해주는 constructor의 copy constructor 내에서 

Date (aDate) {

this.born = aDate.born

} 이럴 수 있고

그냥 constructor에서 

Date (a, born, c) {

~어쩌구~

this. born = born

} 이런식으로 이미 존재하는 객체에 대해 레퍼런스로 받으면

둘은 같은 객체를 나타내게 됨 ! 둘은 같은 주소값을 저장함 !

-> 그러면 외부에서도 private임에도 접근 가능함 (밖에서도 해당 객체를 가리키고 있으니까)

 

-> 해결 방안?

= 클래스 멤버 변수에 클래스 타입이 있으면 그냥 = 으로 값 넣어주지 않는다.

copy constructor을 사용하여 내용만 복사해온다 !!

born = new Date(aDate.born); 이런식으로 복사만 함 !!

 

* String은 가능 . Immutable 이기 때문에 ~~

 


Parameter

자바의 모든 parameter은 call-by-value !

- primitive type : parameter 값 변화는 argument값에 영향 주지 x

- class type : parameter 값 변화는 argument에 영향 줌 !!

  -> reference(주소)를 넘겨주기 때문 -> call-by-reference와 유사하게 작동한다 ! (그치만 콜바이벨류임)

 ** call-by-value이기 때문에, 넘겨준 그 reference 주소는 당연히 !! 변경 불가 !!

 


같다

1. ==

: 레퍼런스가 동일한지 검사함 (주소가 같은지) 단순히 객체의 주소를 비교하는 것이다 ~~

(primitive에서는 걍 값 같은지 봄)

2. a.equlas(b)

: 객체의 내용을 비교하기 위함 ! 내용이 같으면 true.

+) a=b 

: 이건 b의 copy가 a에 들어가는 것 ~ (class일 경우 둘은 한 객체를 가리키게 됨. 같은 값을 저장함(같은 주소를))


null

= 클래스 type 변수에 할당될 수 있는 특수한 상수 ! -> object가 주어져잇지 않다, 어떤 object도 가리키지 않는다 라는 의미 ! 

String str = null; 이런식으로 가능

- null은 객체가 아님 , a kind of placeholder for a reference that doesn't name any memory location 임 !

- 메모리 주소와 유사 -> 변수에 null이 포함되어 있는지 테스트 하려면 ' == ' 연산자 사용해야함 ! (equals 대신에.)

(하나에 저장되어잇는 듯) 


new - anonymous objects

- new = 객체를 초기화하는 생성자를 호출하고, 생성된 객체의 메모리 주소를 반환함 ! (그래서 클래스 변수가 주소값을 저장하게 되는 것 인듯!)

- Anonymous Object : new 객체로 생성하여 반환 받은 주소를 변수에 할당하지 않는 것  

  ex) variable1.equls(new ToyClass("Ds", 32)) 이런식으로 ! 변수에 할당 안된 object


Copy constructor

: 기존의 생성한 객체를 복사하기 위한 생성자 ! -> 클래스와 동일한 타입의 매개변수를 받음 !

( 동일한 값을 갖는 새 변수를 만든다. 당연히 만들어지는 애는 값만 같지, 다른 레퍼런스를 갖는다. 다른 객체이다. 아예 새로 선언한 다른 친구니까)


Mutable & Immutable

Mutable = 외부에서 해당 값을 바꿀 수 있는거. String을 제외한 class type 변수 ! 레퍼런스 통해 해당 값에 접근할 수 있는 것

                  (해당 변수가 한 메모리에 할당되어 저장되고, 다른 변수로 해당 값을 바꿀 수 있음)

** class 내에 값 변경 가능한 method가 잇다. 그러므로 절대 return mutable_object 이거하면 안댐! 변경 가능 !!

 

Immutable = 외부에서 내용 바꿀 수 없는거. = 하면 값만 복사되고 단순히 그 값을 저장하는 것. 해당 값 int 3 이런게 바뀌는게아님

* immutable class : constructor을 제외하고 data의 값을 바꿀 수 있는 method를 가지지 않은 것 !

   -> immutable object. 대표적인예) String !

* String -> class type이지만 immutable !

 

-> String a = "asd";  String b = a;  해도됨 

그래도 다른 값 가리킴 ! 값만 복사됨 !!!

 


Deep Copy VS Shallow Copy

• deep copy = 객체 복사시,   '실제 값'을 새로운 메모리 공간에 복사하는 것을 의미. 값이 copy된 새로운 ㄱ낵체를 가짐

• shallow copy = 해당 변수가 가지고 있는 값을 단순히 복사한다.

  -> 객체를 복사할 경우,  레퍼런스 복사한다 ! 주소를 복사한다.  -> 같은 레퍼런스공유하므로 privacy leak위험 !

  (그냥 = 으로 하는 것. deep copy 제외한 모든 카피)

 

** deep copy 를 해야한다 ~~ **


Packages

: java의 library ! java는 모든게 class이므로, class의 모음으로 볼 수 있다. library of classes

- 서로 관련 있는 클래스들의 모음.

- 프로젝트를 편리하게 관리하도록 함 !

- 다른 라이브러리들끼리 구분 가능

- import 키워드로 클래스 불러와서 간단히 사용 가능 (import statement 라 부른당)

 

- java.util이란 package에잇는 모든 클래스를 부르고 싶을 땐

-> import java.util.* ; 하면 댐 (여기엔 추가적인 오버헤더 없음 !! 굳)

 

- java.lang 패키지 -> 자바 프로그래밍에 기본적인 classes를 포함함 

-> 자동으로 선언된다 !! imported automatically 이므로 import statement 필요 없음 ~~

( Math, String 이런거 잇슴 )

 

- 패키지에 클래스들 묶는 법 = class file 맨 앞에 package package_name; 하면 됨 !!

   -> 이 문구 앞에는 공백/주석 빼고는 아무것도 올 수 없음 !

 

 

사용 ex

- Scanner ! from java.util

-> 사용시 import java.util.Scanner  이렇게 불러옴 (.는 멤버/하위를 부르는 것)

 

 

 

 

'2-1 > 객체지향 - java' 카테고리의 다른 글

Chap 7. Inheritance (상속)  (0) 2022.04.12
Chap 6. Arrays ..  (0) 2022.04.06
chap 4. class  (0) 2022.04.02
Chap 1,2  (0) 2022.03.30
chap.5 - static 등등  (0) 2022.03.26