passion and relax

[JAVA] 04. 객체의 행동 (객체의 상태가 메소드의 속성에 미치는 영향) 본문

프로그래밍

[JAVA] 04. 객체의 행동 (객체의 상태가 메소드의 속성에 미치는 영향)

Grab Java 2024. 5. 20. 15:23

객체의 인스턴스 변수와 메소드의 관계

. 일상에서.. 상태는 행동에 영향을 끼치고, 행동은 상태에 영향을 끼친다.
. 상태 = 인스턴스 변수, 행동 = 메소드
. 메소드는 인스턴스 변수에 영향을 끼치고, 인스턴스 변수는 메소드에 영향을 끼친다.

 


Argument(인자) vs Parameter(매개변수)

. Argument(인자) : 호출하는 쪽에서 전달하는 것
. Parameter(매개변수) : 메소드에서 받는 것

 

 


자바의 매개변수 전달 방식

. 값을 전달한다. 즉, 복사본을 전달한다.
. 매개변수에서 값을 바꿔도, 인자에서는 변하지 않는다.
. 객체의 전달은 어찌 되는가? 객체도 값으로 전달된다. 다만 레퍼런스가 값으로 전달되는 것이다.
. 객체변수에는 객체의 레퍼런스가 담겼기에, 그 레퍼런스가 값으로 전달된다. (call by val인 듯한, call by ref)

 


return 값

. 여러 개를 줄 수는 없는가? 있다. 배열, List 등을 이용할 수도 있고, 객체를 이용하여 넘길 수도 있다.
. 선언된 유형으로만 넘겨야 하는가? 아니다. 작은 것이 큰 공간에 들어갈 때는 그냥하면 되고, 반대인 경우는 캐스팅
. return된 값은 반드시 사용해야 하는가? 아니다. 쓰든 말든 개발자 맘이다.

 

 


getter(=accessor), setter(=mutator)

. 그냥 get 하거나 set 하기위해 사용되는 것이 아니라.. 캡슐화를 위해 사용함.
. 외부에서 "객체.인스턴스변수"의 형태로 접근하면 안된다. 왜냐?
. setter에서 변수를 set 시킬 가능 범위나 에러 범위를 지정, 적절하면 set

 


객체 선언 및 사용하기

Dog[] pets;
pets = new Dog[7];
pets[0] = new Dog();
pets[1] = new Dog();
pets[0].setSize(30);
int x = pets[0].getSize();
pets[1].setSize(8);

 


인스턴스 변수 vs 지역 변수의 선언과 초기화

. 인스턴스 변수의 초기화 : 자동으로 정수/문자 0, 실수 0.0, 불 false, 레퍼런스 null
. 지역 변수의 초기화 : 자동 설정 없음. 초기화하지 않으면, 사용할 때 무조건 컴파일 에러 (사용하지 않으면, 무관)
. 매소드 매개 변수 : 지역변수라고 보면 됨. 단 넘겨 받은 값으로 초기화 된 것을 다시 초기화 하는 일은 없으므로 무관.

 


객체 비교

. 비교 1 (==)
   : 레퍼런스 변수 두 개가 힙에 있는 같은 객체의 레퍼런스를 참조하는지 비교하는 것. 단지 값의 비트패턴 비교!!
. 비교 2 (equals())
   : 객체의 특성에 맞게 equals()에서 같다를 지정하여, 비교하는 것. 값의 객체를 찾아가 equals()를 이용하여 비교!!

 

[Example 01]
int a = 3;
byte b = 3;
if (a == b) {}; //참. 형은 다르지만 a == b는 비트패턴이 같아 참이다.

[Example 02]
Foo a = new Foo();
Foo b = new Foo();
Foo c = a;
if (a==b) {}  //false
if (a==c) {}  //true
if (b==c) {}  //false