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

+ Recent posts