JAVA

[JAVA] 자바 기초 IV

최선을 다하는 2022. 7. 23. 11:29

Chap 19 자바의 메모리 모델과 Object 클래스

19.1 자바 가상머신의 메모리 모델

- 자바 가상머신은 운영체제가 할당해 주는 메모리 공간을 기반으로 스스로를 실행하면서 더불어 자바 응용 프로그램의 실행도 돕는다.

- 메모리 모델은 크게 3가지 영역으로 나뉜다

    - 메소드 영역

        - 메소드의 바이트코드 , static 변수

        - 특정 클래스의 정보가 메모리 공간에 올려질 때 채워지는 영역

    - 스택 영역

        - 지역변수, 매개변수

    - 힙 영역

        - 인스턴스

        - 인스턴스는 스택 영역의 원소들과는 달리 언제 소멸될지 모른다. GC를 활용하여 메모리를 관리한다.

 

19.2 Object 클래스

- finalize 메소드

    - 인스턴스가 GC에 의해 소멸되기 전에 자동으로 호출되는 메소드이다.

    - 오버라이딩을 하여 원하는 요청을 해도 원할때 잘 일어나지 않는다.

    - GC는 빈번히 일어나지 않으며 매우 합리적인 방법으로 수행되기 떄문에 강제로 진행하지 말자.

        - System.gc(); System.runFinalization(); 을 통해 명령이 아닌 '요청'이 가능하다.

- 인스턴스의 비교 : equals 메소드

     - '==' 연산자는 참조변수의 참조 값을 비교하므로  인스턴스의 내용을 비교하려면 equals 메소드를 오버라이딩 해야 한다.

     - public boolean equals (Object o) 를 오버라이딩 해야하므로 매개변수 o 를 적절하게 형변환하여 비교해야한다.

- 인스턴스의 복제 : clone 메소드

    - protected Object clone() throws CloneNotSupportedException <= 호출된 메소드가 속한 인스턴스의 복사본이 생성 되고 참조값이 반환된다. // 접근 범위를 public 으로 바꾸어 오버라이딩 할 수 있다. 반대는 불가능

    - interface Cloneable : 마커 인터페이스로 해당 인터페이스가 implement 되어야 clone 메소드가 사용이 가능하다.

    - 깊은 복사, 얕은 복사. 

        - Point -> Rectangle 과 같이 중첩된 클래스의 복제가 일어날 경우 super.clone() 만 사용한다면 Rectangle 인스턴스만 복제가 되고 복제된 Rectangle 인스턴스들이 같은 Point 인스턴스를 가리킨다.

        - 따라서 clone()을 오버라이딩 할 때 Rec copy = (Rec) super.clone(); copy.pos = (Point)pos.clone()과 같이 직접 clone() 해주어야 한다.

        - String 의 경우 Cloneable 인터페이스를 구현하지 않는다. String의 내용은 인스턴스 생성 시 결정되고 바꾸지 못하기 떄문이다.

https://github.com/Ho-hoho/Java_basic/blob/main/19_2.java

 

GitHub - Ho-hoho/Java_basic

Contribute to Ho-hoho/Java_basic development by creating an account on GitHub.

github.com

 

Chap 20 : 자바의 기본 클래스

20.1 래퍼 클래스

- 래퍼 클래스의 두가지 기능

    - Boxing  : 값을 인스턴스에 감싸는 행위로 인스턴스의 생성을 통해 이뤄진다. // Integer i = new Integer(10);

    - Unboxing : 저장된 값을 꺼내는 행위로 래퍼 클래스의 메소드 호출을 통해 이루어짐// int i2 = i.intValue(); 

    - Auto Boxing/Unboxing : 자동으로 생성자와 메소드 호출을 해준다.

    - 이점 : 래퍼 클래스의 추상 메소드를 사용할 수 있다. // Integer.valueOf(), max, min, sum, toBinaryString ...

 

20.2 BigInteger 클래스, BigDecimal 클래스

- Big Integer

    - long 형으로도 표현 불가능한 수를 표현하게 해준다.

    - add, multiply 와 같은 메소드를 활용하여 큰 수의 계산을 가능하게 해준다.

- Big Decimal

    - 오차 없는 실수의 표현을 위해 제공되는 클래스이다.

    - BigDecimal d1 = new BigDecimal("1.6") // 반드시 " "안에 숫자를 적어야 의미가 있다. 적지 않을 시 오차가 있다.

 

20.3 Math 클래스 , 난수 생성, 문자열 토큰

- 난수 생성

    - Random rand = new Random() // Random 인스턴스를 생성한 후

    - rand.nextInt() // 와 같이 메소드를 활용하여 난수를 얻는다.

    - 매개변수로 아무것도 주지 않을떄는 seed 값이 System.currentTimeMillis() 로 들어간다.

- 문자열 토큰화

    - StringTokenizer 클래스를 활용하여 구분자로 나눌 수 있따.

    - public StringTokenizer(string str, String delim);

    - StringTokenizer st = newStringTokenizer("12 + 36 - 8 = ?" , "+-= "); // '+','-', '=' 그리고 공백을 구분자로 사용

    - while(st.hasMoreTokens()) st.nextToken(); // 두 메소드를 활용하여 문자열 추출이 가능하다.

 

20.4 Arrays 클래스

- 배열의 복사

    - public static int[] copyOf (int[] original, int newLength)

        - original에 전달된 배열을 첫번째 요소부터 newLength의 길이만큼 복사

        - 새로운 배열을 생성하여 복사한다. 새로 생성된 배열의 참조값을 반환한다.

        - int[] cp = Arrays.copyOf(org,3); // org 배열의 처음~3번째 원소까지 복사

    - public static int[] copyOfRange (int[] original, int from, int to)

        - org 배열의 (from)~(to-1)원소까지 복사

        - int[] cp = Arrays.copyOfRange(org,1,3)

    - public static void arraycopy (Object src, int srcPos,Object dest,int destPos,int length)

        - 배열을 생성하지 않고 기존의 배열에 복사

        - src 의 srcPos부터 length 만큼 dest 의 destPos부터  복사

        - System.arraycopy(org,1,cpy,0,3);

- 배열의 비교

    - public static boolean equals (int[] a,int[] a2);

    - 두 배열에 저장된 데이터의 수 , 순서, 내용이 같을 때 true 반환

    - Object[] 배열 역시 equals 는 내용을 비교한다. 따라서 인스턴스 비교시 목적에 맞게 equals를 오버라이딩 해야한다.

- 배열의 정렬

    - public static void sort (Object[] a);

    - compareTo()를 사용하여 정렬하기 때문에 목적에 맞게 오버라이딩 해야한다.

    - 오름차순 정렬로 , 인자로 전달된 o가 작다면 양의 정수 반환/ 크다면 음의 정수/ 같다면 0 반환.

- 배열의 탐색

    - public static int binarySearch(int[] a,int key);

    - 배열이 정렬된 경우만 의미있게 사용 가능하다.

    - compareTo를 활용하여 배열에 key를 찾아 존재한다면 인덱스를 없다면 음수를 반환한다.

'JAVA' 카테고리의 다른 글

[JAVA] 자바 기초 III  (0) 2022.07.22
[JAVA] 자바 기초 II  (0) 2022.07.20
[JAVA] 자바 기초 I  (0) 2022.07.16