쥐 캐릭터를 통한 추상화
쥐 캐릭터의 특성
- 제리
- 객체명: 쥐 캐릭터의 이름 →
제리
- 성명:
제리
- 국적:
미국
- 나이: 75
- 종교: 기독교
- 친구: 톰
- 여자친구: null
- 꼬리: 1개
- …
- 객체명: 쥐 캐릭터의 이름 →
- 미키마우스
- 객체명: 쥐 캐릭터의 이름 →
미키마우스
- 성명: 미키마우스
- 국적: 미국
- 나이: 87
- 종교: 무교
- 신장: 70cm
- 여자친구: 미니마우스
- 객체명: 쥐 캐릭터의 이름 →
- 행위 기준
- 미키마우스
- 달리다
- 먹다
- 휘파람…
- 제리
- 달리다
- 먹다
- 장난치다…
- 미키마우스
추상화의 기준?
- 클래스 설계나 모델링에서 중요한 것이다 추상화입니다
- 애플리케이션 경계 내에서 중요한 특성만을 선택하는 것은
주관적입니다
.- 이로 인해 설계자마다 다른 결과물이 나올 수 있습니다.
- 추상화를 통해 얻어진 결과물을
모델
- 자바 언어에서는
클래스
라고 합니다
T메모리 그려보기
public class Mouse {
public String name;
public int age;
public int countOfTail;
public void sing() {
System.out.println(name + " 찍찍!!");
}
}
public class MouseDriver {
public static void main(String[] args) {
Mouse mickey = new Mouse();
mickey.name = "미키";
mickey.age = 85;
mickey.countOfTail = 1;
mickey.sing();
mickey = null;
Mouse jerry = new Mouse();
jerry.name = "제리";
jerry.age = 73;
jerry.countOfTail = 1;
jerry.sing();
}
}
public static void main(String[] args){
까지의 메모리 구조- static Area == MethodArea == MetaSpace == Class Area
- 에 java.lang 패키지와 모든 클래스들이 배치된다.
- Mouse 의 3개의 속성들은 이름만으로만 존재한다.
- 왜?
- Mouse 클래스에 속한 Static 한 속성이 아니라, Mouse 객체에 속한 속성이다.
- 객체가 생성되어야 속성의 값을 저장하기 위한
힙 영역
에 값을 할당할 수 있기 때문이다.
- 왜?
- main 메서드는 밑줄인데, 왜 sing 메서드는 밑줄이 아닐까?
- main 메서드는 static 한 메서드로서 ⇒ 스태틱 영역에 속해있기에
밑줄로 구분하기로 UML 상으로 약속되어있다.
- sing 메서드는 객체에 대한 메서드로 객체가 생성될때 힙 영역에 할당되는 메서드이기에,
밑줄이 표시되어있지 않다.
- main 메서드는 static 한 메서드로서 ⇒ 스태틱 영역에 속해있기에
- static Area == MethodArea == MetaSpace == Class Area
Mouse mickey = new Mouse();
실행시의 T 메모리 구조- 3가지 명령문이 포함되어있다.
Mouse mickey
- Mouse 객체에 대한 참조변수
mickey
를 선언
mickey
⇒ Mouse 타입의 객체를 참조할 수 있는 객체 참조변수 mickey 가 스택영역에 샐성됩니다.
- 아직은 어떠한 것도 참조하고 있지 않습니다.
- Mouse 객체에 대한 참조변수
new Mouse()
- Mouse 클래스의 새로운 인스턴스를 생성
- 힙 메모리에 Mouse 객체가 생성된다.
- 대입문
- 생성된 Mouse 객체의 주소(포인터) 를
mickey
참조 변수에 할당
- Mouse 의 힙 상의 주소가
100
이라면 주소값100
의 값이 mickey 참조변수에 담기게 됩니다.
- 생성된 Mouse 객체의 주소(포인터) 를
- 3가지 명령문이 포함되어있다.
- 메모리
public class MouseDriver { public static void main(String[] args) { Mouse mickey = new Mouse(); mickey.name = "미키"; mickey.age = 85; mickey.countOfTail = 1;
- name 은 String 객체로 취급되며
- 문자 상수풀의 값이 생성되어, 해당 값을 원래는 참조하는 형태로 구현되어있다
- 하지만 책에서는 String 을 간소화하여 표현중이다!
mickey.sing()
- main 스택 프레임에 sing() 메서드의 메서드 스택이 쌓인다.
- sing() 메서드 안의 코드 실행(코드 실행 영역은 일단 생각에서 배제하자)
- sing 안의 중괄호가 닫히면서 메서드 스택에서 소멸
mickey
= null;
- mickey 참조변수가 가지고 있던 주소값이
- null 로 변경된다. (연결이 끊김)
- null 이후 GC 동작
- 가비지 컬렉터
- 프로그램에서 더 이상 사용되지 않는 메모리를 자동으로 회수하는 시스템
- 객체를 참조하는 변수가 더 이상 해당 객체를 참조하지 않게 되면
해당 객체는 메모리에서 제거될 수 있는 후보가 됨. (
가비지
)이러한
가비지
를 탐지하고 메모리에서 제거함
- 예시에서 작동
mickey
라는 객체 참조변수가Mouse
객체를 참조가 해제된다면,
Mouse
객체는 메모리에서 제거될 수 있는 대상이 됨
- 언제 작동하나?
- 이건 자바 버전이나, 자체 인수 설정마다 시기가 다름
- 가비지 컬렉터
- 이후
Mouse jerry = new Mouse(); jerry.name = "제리"; jerry.age = 73; jerry.countOfTail = 1; jerry.sing();
- 위에서 계속 설명한 내용과 동일하며, 주소값은 GC정리 여부에 따라 같을 수도 있고, 다를수도 있습니다.
? 궁금한점
public class MouseDriver {
public static void main(String[] args) {
Mouse mickey = new Mouse();
mickey.name = "미키";
mickey.age = 85;
mickey.countOfTail = 1;
mickey.sing();
mickey = null;
Mouse jerry = new Mouse();
jerry.name = "제리";
jerry.age = 73;
jerry.countOfTail = 1;
jerry.sing();
}
}
- 에서 mickey = null 이후에 만약에 GC 에서 바로 정리가 되었다면
Mouse jerry = new Mouse();
시에, 이전의 mickey 참조변수가 가지고 있던 주소값과 동일한 주소를 가질 수도 있는 것인가?
Uploaded by N2T
'자바 > 스프링입문객체지향' 카테고리의 다른 글
[3단원]상속의 강력함 (0) | 2023.08.22 |
---|---|
[3단원]상속: 재사용 + 확장 (0) | 2023.08.22 |
추상화는 모델링이다 (0) | 2023.08.20 |
추상화: 모델링 (0) | 2023.08.20 |
객체지향의 4대 특성 -캡상추다 (0) | 2023.08.19 |