Week 2 of Object oriented programming

Week 2 of Object oriented programming

이번 주차에서는 Memory model과 scope에 관하여 배운다.



Memory model 강좌가 끝나면 메모리 모델을 그릴 수 있고 각 변수의 값들이 어떻게 움직이고 변수들의 상태를 추적할 수 있다.


먼저 위의 코드를 보고 어떤 출력이 나올지 추측해본다.


동일한 내용이며 답은 쉽게 3번인 것을 알 수 있다.


단계별로 보면 우선 변수 선언이 이루어지며 var1이라는 이름을 갖는다.


변수 할당을 통해 우측의 값 52가 var1 변수에 입력된다.


var2의 단계도 동일하며 하단에 있는 그림처럼 var1과 var2의 메모리가 생성이 되는데 각 이름이 붙어있는 형태이다. 여기에 var2의 변수 할당은 var1의 값을 넣게되는 형식이므로 var2 또한 52가 입력된다.


var1에 다시 변수할당을 통해 127을 입력하며 기존의 52는 사라진다.


Type의 종류에 대해 살펴보는데 기본형과 객체형으로 나뉜다. 기본형은 기존에 존재하는 8가지 타입을 말하며 객체형은 사용자가 정의할 수 있는 것을 말한다.


위의 예시에서 var1은 기존과 동일하게 변수 선언과 할당을 동시에 하여 52의 값을 가지게 된다. 다음의 객체형으로 정의한 SimpleLocation으로 ucsd 변수를 선언하였으며 이에 새로운 객체를 new로 생성하여 ucsd에 입력한다. 하지만 이때 주의할 점은 heap에 생성된 객체 정보를 가지는 것이 아닌 객체의 주소, 여기서는 @34,를 저장한다.


그래서 위와 같이 화살표로써 표시하여 해당 변수는 heap에 존재하는 어떤 객체 정보를 연결하였는지 알려줄 수 있다.


이번엔 heap으로 들어가서 SimpleLocation의 클래스 내용을 보면 안에 두개의 변수 latitude, longitude가 있는 것을 알 수 있고 이를 메모리에 생성한다.


이후 각 변수에 기입한 값들인 32.9, -117.2를 저장하면된다.


이후 lima의 단계도 동일하다.


다음 lima.latitude를 통해 lima변수가 가리키는 heap 내의 오브젝트 주소로 가서 latitude로 접근하고 이를 -12.04로 변경할 수 있다.


공부한 것에 대한 간이테스트로 위의 내용을 해석하고 메모리모델을 그려보는 시간이 있다.


배운것과 동일하게 메모리모델은 위와 같은 형태를 지니게 될 것이다.


동일한 내용의 문제가 등장하고


결과값을 예측해본다.


이 때 학생들이 토론하는 과정을 보여주고 어떤 오류가 생길 수 있는지 보여준다.


토론을 본 이후 다시 정답을 체크함으로 기회를 준다.


여기서 중요한 점을 짚어주는데 loc1과 loc2를 각 객체의 정보를 저장하는 주소값을 가지고 있는 상태일 때


loc2의 주소값을 loc1의 주소값으로 대체하면


위와 같이 값이 변경되고 이를 화살표로 표시해보면


위와 같이 객체정보가 변경되어 있는 것을 알 수 있다.


따라서 loc1.lat의 값을 변경하였지만 결국 loc2의 값도 변경이 된 것을 알 수 있다.


다음은 Scope에 관한 강좌이며 위의 코드에서 6개의 변수를 확인한다.
latitude, longitude, latIn, lonIn, args, lima.
this는 추후에 다룬다고 한다.


우선 간단한 퀴즈가 등장하고


cass LocationTester내에 latitude라는 변수가 선언된 적이 없으므로 컴파일에러가 날 것으로 예측하였다.


동일한 내용을 설명해주며


여기서 각 변수의 범위에 대한 정의를 설명한다.


크게 3가지로 나뉘며 첫번째는 지역변수가 있다고 하며 메쏘드 내에서 선언이 된다.


다음은 파라메터이며 지역변수처럼 활동한다.


마지막 멤버변수는 메쏘드 밖에서 선언되며 같은 클래스 내에서는 어디든 사용될 수 있다.


위의 lat은 지역변수로 -12.0을 할당받았고


lima는 지역변수로 할당이 되어 main함수 내의 범위에 해당된다.


이후 new를 통해 SimpleLocation 객체를 생성할때 생성자를 거치며 이때 파라메터인 latIn, lonIn을 매개변수로 가지게 된다. 여기에 lat, -77.0을 입력했으므로 그 값을 가지게 되고 생성자 범위에 활동이다. 그리고 this를 통해 해당 클래스의 멤버변수로 접근이 가능하고 이 값들은 heap에 생성이 된다.


그리고 파라메터들이 들고 있던 값을 그대로 저장하며


생성자는 빠지게 되고 lima가 주소값을 가지게 된다.


되짚어보는 시간이며 내용은 거의 동일하다.


같은 내용의 퀴즈


이를 차근차근 설명해준다.


먼저 LocationTester 클래스의 메인함수를 보면 lat을 더블형으로 -15.5를 할당하고 lima를 SimpleLocation형으로 생성자로 연결이 된다. SimpleLocation에서는 생성자를 통해 매개변수로 받은 lat, -77.0을 각각 latIn, lonIn에 할당하고 이후 this를 통해 멤버변수인 lat과 lon으로 접근한다. 접근하고 동일한 값인 -15.5, -77.0을 할당한 뒤 생성자는 삭제된다.


이후 lima는 heap의 객체주소를 가지고 그 값을 가리키게 되며 마지막으로 lat의 값을 -12.0으로 변경한다.


댓글