Class Parameters
Java 의 parameter 는 call-by-value parameter 이다.
- parameter 는 local 변수로 인자의 값과 같다.
- 즉, parameter 의 값은 인자의 값을 변경할 수 없다.
Class type의 parameter 는 primitive type과 다르게 call-by-reference로 동작한다.
call-by-value : 값을 인자로 전달하는 방식
call-by-reference : 값을 전달하는 대신 주소값을 전달하는 방식
Class type의 parameter 에 연결된 값은 reference(memory 주소) 이다.
- 매개변수는 인자의 다른 이름이 된다.
- 여전히 call-by-value 이므로 class type parameter 자체에 대한 수정은 해당 인자를 변경하지 않는다.
<예시>
println은 String class를 인자로 가질 수 있다. anObject의 경우 string이 아닌 객체이지만 toString()을 자동으로 호출하여 string class type 인자로 가지도록 한다.
ToyClass의 changer를 호출하여 anObject 값을 Hot Shot 42 로 변경한다.
이때 anObject 는 객체에 대한 주소값을 갖고 있다. changer 함수를 호출하는 경우 객체의 정보가 변경되는 것이다.
Differences Between Primitive and Class-Type Parameters
primitive type의 변수가 메서드에서 인자로 사용될 때 원래 값으로 변경될 수 없다.
하지만 인자로 사용되는 class type의 instance 변수값은 변경할 수 있다.
<예시>
1) object1.makeEqual(object2) ; -> object2 내용이 object1 내용으로 수정된다. 즉, class type의 instance 변수값이 변경
2) object1.tryToMakeEqual(aNumber); -> aNumber 변수값 자체가 변경되지 않음, 42 값 그대로 갖고 있음
Use of = and == with Variables of a Class Type
class type의 변수와 사용하는 할당 연산자 (=) 는 동일한 객체의 이름을 지정하는 두 개의 변수를 생성한다.
equality 검증 (==) 은 class type 변수에서 다르게 동작한다.
- "==" 는 두 class type 변수가 같은 메모리 주소를 가리키는지 확인한다.
- instance 변수의 값이 같은지 확인x
- instance 변수 값이 같은 서로 다른 두 객체는 같지 않음을 확인 할 수 있다.
The Constant null
null 은 special constant 로 class 변수에 대입 가능하다. 값이 없다는 의미로 가리키는 객체가 없음을 의미한다. null 자체는 객체가 아니다.
-> equals를 사용하지 않고 ==, != 를 사용하여 null 값을 갖는지 확인한다.
The new Operator and Anonymous Objects
new operator 는 생성자를 호출하여 객체를 초기화한 후 객체가 생성된 위치의 메모리 주소를 반환해준다.
ex) ToyClass variable1 = new ToyClass("Joe", 42);
객체가 메서드의 인자로 임시적으로만 사용되는 경우가 있다. 이 경우 객체는 변수로 할당 될 필요가 없음
-> 이러한 객체를 anonymous object 라고 한다.
Using and Misusing References
프로그램 작성 시 private 인스턴스 변수는 private 하게 보존해주는 것이 중요하다.
primitive type 인스턴스 변수의 경우 private modifier 사용으로 privacy leaks를 막을 수 있다.
하지만 class type의 경우 private modifier 사용으로만으로는 privacy leaks를 막을 수 없다.
ex) 각 변수에 private 를 선언해준다
Copy Constructors
copy constructors 는 모든 인스턴스 변수를 수동으로 복사할 필요 없이 기존 객체의 복사본인 새 객체를 만드는 방법이다.
인스턴스 변수가 많은 복잡한 객체를 처리하는 경우 유용하게 사용 할 수 있다.
즉, 따로 객체를 만들어서 copy 하는 방식으로 기존 객체의 데이터는 변하지 않고 안전하게 복사 할 수 있다.
<예시>
Privacy Leaks
중요한 데이터가 외부 클래스에 노출되어 엑세스하거나 수정할 수 있는 경우 privacy leaks 문제가 생긴다.
다음 예시에서 getBirthDate() 메서드는 다른 클래스가 Date 객체를 직접 수정할 수 있도록하는 참조를 반환한다.
이 경우 Date 객체가 잘못된 값으로 수정될 수 있어 위험이 발생한다.
이런 문제를 방지하기 위해 실제 참조가 아니라 복사본을 반환하도록 하여 안전성을 보장한다. -> copy constructor 사용
<예시>
Mutable and Immutable Classes
Mutable class : 생성 후 수정이 가능한 객체
Immutable class : 생성 후 바꿀 수 없는 객체 -> string class는 immutable class
Deep Copy Versus Shallow Copy
Deep Copy 의 경우 모든 속성을 포함하는 새 객체를 만들고 참조하는 모든 속성을 복사한다.
즉, 자체 메모리 공간을 가진 새 객체를 생성하여 변경사항은 원래 객체에 영향을 주지 않는다.
Shallow Copy의 경우 새 객체를 생성하지만 참조하는 속성은 복사하지 않는다. 따라서 원래 객체와 동일한 속성의 참조를 포함한다.
따라서 새로운 메모리 공간을 생성하는 것이 아니기에 복사본의 변경사항은 원래 객체에 영향을 주어 보안 문제가 발생 할 수 있다.
Packages
Java는 라이브러리와 클래스로 구성된 packages 를 사용한다.
디렉터리, 폴더로 관리하여 import statement를 사용하여 프로그램 작성 시 사용할 수 있도록 한다.
ex) import java.util. * ; -> 해당 패키지의 모든 것을 import 한다
=> 컴파일 할 때 필요한 부분만 사용하므로 오버헤드 발생에 대한 문제를 고려하지 않아도 된다.
java.lang 은 기본적인 클래스를 포함한다. (Math, String, Wrapper class 등)
패키지 이름은 패키지 클래스를 포함하는 디렉토리 또는 하위 디렉토리의 경로 이름이다.
Java는 패키지의 디렉토리를 찾기 위해 패키지 이름과 CLASSPATH 환경변수 두 가지를 사용한다.
The Default Package
현재 디렉터리의 모든 클래스는 이름없는 패키지인 default package 라고 한다.
현재 디렉터리(.) 는 CLASSPATH 변수의 일부로 default package 의 모든 클래스는 자동적으로 프로그램에서 사용가능하다.
Name Clashes
다른 개발자들이 작성하는 경우 같은 이름의 클래스를 사용하는 경우가 있다.
이러한 경우 fully qualified name 을 사용하여 Name Clashes 문제를 해결 할 수 있다.
qualified name 을 사용하는 경우 class를 import 할 필요가 없다.
'Development > OOP(Java)' 카테고리의 다른 글
Ch9. Exception Handling (0) | 2023.05.19 |
---|---|
Ch8. Polymorphism and Abstract Classes (0) | 2023.05.08 |
Project1 (Timetable application) (0) | 2023.04.05 |
Ch3. Flow of Control (0) | 2023.04.04 |
Ch5. Defining Classes(2) (0) | 2023.04.03 |