JAVA 메모리 모델 /Object Class /기본 Class
메모리 모델
- 자바 가상머신은 운영체제 위에서 동작
- 운영체제에서 메모리를 할당받아 사용되며 이를 관리하게 세가지로 나뉘는데 종류와 저장되는 파일들은
- 메소드 영역 - 메소드의 바이트코드, static 변수
- 스택 영역 - 지역변수, 매개변수
- 힙 영역 - 인스턴스
- 메소드 영역
- 실행 흐름을 형성하는 메소드의 바이트코드를 저장시키는 부분
- 바이트 코드와 static 변수는 '클래스가 메모리에 올려지는 시점'에 저장됨
- 메소드의 바이트코드는 프로그램의 흐름을 구성하는 바이트 코드이고 사실상 컴파일 된 바이트 코드의 대부분이므로 바이트 크도 전체가 메소드영 역에 저장된다고 봐도 무방
- 스택 영역
- 메소드 내에서만 유효한 변수인 지역변수, 매개변수를 저장
- 즉, 스택으로 관리하기 편한 변수들을 저장 관리하는 것
- 힙 영역
- 인스턴스는 소멸방법과 시점이 지역변수와 다르기 때문에 따로 저장
- 인스턴스로 힙에 저장되고 변수들은 이 인스턴스를 참조하는 형식으로 사용
- Garbage Collection
- 자바에서 인스턴스를 힙에서 소멸시키기 위해 사용하는 것
- null로 참조변수를 해당 인스턴스를 가르키기 않도록하여 소멸시킴
Object 클래스
- 모든 자바 클래스의 최상위 클래스
- finalize 메소드
- 인스턴스가 소멸되기 전 가상머신에 의해 자동 호출되는 메소드
- 이를 제대로 활용하기 위해선
System.gc();
System.runFinalization();
를 사용하면 제대로 사용 가능 - equal 메소드
- public boolean equals(Object obj)로 정의되어 있고 '=='연산자 처럼 참조 값을 비교하도록 오버라이딩 하여 사용가능
- String 클래스의 경우는 이미 내용비교를 오버라이딩 하였으므로 그대로 사용가능
- clone 메소드
- 인스턴스를 복사하는 메소드
- Cloneable 인터페이스를 구현해야 함
- 비어있는 인터페이스
- 복제가 가능하다는 것을 표현하기 위해서 사용
- clone메소드가 protected로 선언되어있어서 이를 public으로 변경하여 오버라이딩 가능
- Clone의 복사방법
- Shallow Copy
- 인스턴스 변수의 저장값만 복사하고 참조 대상은 복사하지 않음
- 이 방식으로 하면 복사된 값이 복사대상의 값이 변경되면 같이 변경됨
- Deep Copy
- 참조하는 대상까지 같이 복사를 해주어서 각각의 복사대상과 복사된 값의 인스턴스를 따로형성
- 이를 통해서 복사된 값은 독립된 인스턴스를 갖고 변경을 따로해야 함
- String의 경우는 저장된 문자열 정보를 변경 불가능 하기 때문에 필요없음
이는 String이 변경시에 인스턴스를 생성하는 것이기 때문
기본클래스
- Wrapper Class
- 기본 자료형 데이터들을 인스턴스로 표현할 때 사용
- Boolean, Character, Byte, Short, Integer, Long, Float, Double으로 각각 기본 자료형은 모두 정의되어 있음
- 기본 자료형 데이터를 인스턴스화 시키는 것을 Boxing이라 함
- 자료형 데이터를 인스턴스에서 꺼내는것을 Unboxing 이라함
- 현재는 Auto Boxing, Unboxing 가능 => 선언 따로 안하고 자동으로 인스턴스와 데이터 교환가능
- 선언 방법으로는 new를 이용한 방법, static 메서드를 이용한 방법 두가지
- BigInteger Class
- 너무 큰 정수를 표현하면 Integer로 표현이 안되는데, 이를 BigInteger로 표현함
- 자료형이 없기에 문자열을 통해서 값을 정의함
- BigDecimal Class
- 오차가 없는 실수를 저장하기 위한 방법
- 값을 저장할때 문자열로 저장해야 하기 때문에 " " 사이에 값을 넣어줌
- Math Class
- 수학 관련 기능 제공 모든 멤버가 static
- Random Class
- boolean nextBoolean() : boolean형 난수 반환
- int nextInt() : int형 난수 반환
- long nextLong() : long 형 난수 반환
- int nextInt(intn) : 0이상 n미만 범위 내에 있는 int형 난수 반환
- float nextFloat() : 0.0이상 1.0 미만의 flaot형 난수 반환
- double nextDouble() 0.0이상 1.0미만의 double형 난수 반환
- Seed를 전달해서 난수를 생성하면 같은 seed 값을 넣으면 항상 같은 난수가 생성
- Token 구분
- 정보를 나누는 기준을 'Delimiter(구분자)'이고, 이를 기준으로 나눈어진 정보가 Token
- public StringTokenizer(String str, String delim) -> 문자열을 구분자 기준으로 토큰 추출
- public String nextToken() -> 다음 토큰 반환
- public boolean hasMoreToken -> 토큰 잔여유무 확인
댓글
댓글 쓰기