하나의 JAVA 파일은 크게 필드(field), 생성자(constructor), 메소드(method)로 구성된다.

 

Static area(스태틱 메모리 영역)

Static 영역의 데이터는 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있다.

그중 필드 부분에서 선언된 변수(전역변수)와 정적 멤버변수(static이 붙은 자료형) Static 영역에 데이터를 저장한다. 

 

Stack area(스택 메모리 영역)

메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다.

메소드 내에서 정의하는 기본 자료형(int, double, byte, long, boolean 등)에 해당되는 지역변수(매개 변수 및 블럭문 내 변수 포함)의 데이터의 값이 저장되는 공간이 Stack(스택) 영역이다. 

스레드 갯수 많큼 각각 생성

 

Heap area(힙 메모리 영역)

참조형(Reference Type)의 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장된다.

변수(객체, 객체변수, 참조변수)는 Stack 영역의 공간에서 실제 데이터가 저장된 Heap 영역의 참조값(reference value, 해시코드 / 메모리에 저장된 주소를 연결해주는 값)을 new 연산자를 통해 리턴 받는다. 실제 데이터를 갖고 있는 Heap 영역의 참조 값을 Stack 영역의 객체가 갖고 있다.

 

참조 변수들이 Heap 영역에 있는 인스턴스를 참조하지 않게 된다면 GC(가비지 컬렉터)에 의해  메모리에서 삭제 됨

단 하나의 heap area 만 존재

 

'Java' 카테고리의 다른 글

Java의 특징  (0) 2022.08.04

PriorityQueue(우선순위 큐)

일반 적인 큐의 구조와 동일하나 데이터가 들어온 순서대로 나가는 것이 오름차순으로 따라 데이터가 나가는 자료구조

시간 복잡도 : O(NlogN)

 

import java.util.PriorityQueue;

public class Main {
    public static void main(String[] args) {
        PriorityQueue<Integer> desc = new PriorityQueue<>();
        desc.add(3);desc.add(5);desc.add(2);desc.add(1);desc.add(4);
        
        while (desc.size() > 0){
            System.out.print(desc.poll());  // 1 2 3 4 5 출력됨
        }
    }
 }

 

Collections.reverseOrder() 를 사용하여 내림차순으로 도 사용가능 

import java.util.Collections;
import java.util.PriorityQueue;

public class Main {
    public static void main(String[] args) {
        PriorityQueue<Integer> asc = new PriorityQueue<>(Collections.reverseOrder());
        asc.add(3);asc.add(5);asc.add(2);asc.add(1);asc.add(4);

        System.out.println(asc);
        while (asc.size() > 0){
            System.out.print(asc.poll());  //5 4 3 2 1 출력
        }
    }
}

 

'Java > Class & method' 카테고리의 다른 글

replace  (0) 2022.12.20

replace()  :  특정 문자열을 지정한 문자 값으로 변환 해주는 메서드

public class Main {
    public static void main(String[] args) {
        String str = "HEllO";
        System.out.println(str.replace("l","L"));  // 타겟 "L" 변환 대상 "L"
        //l이 L 로 변환 되어 "HELLO" 출력 됨
    }
}

 

replaceFirst()  :  특정 문자열 중 첫번째것 지정한 문자 값으로 변환 해주는 메서드

public class Main {
    public static void main(String[] args) {
        String str = "hello hello hello";
        System.out.println(str.replaceFirst("hello","HELLO"));  //  처음 hello 만 HELLO로 변환
    }
}

 

replaceAll() : 정규표현식으로 변환이 가능한 메서드

public class Main {
    public static void main(String[] args) {
        String str = "abcd ABCD 가나다라 1234 !@#$";
        System.out.println(str.replaceAll("[a-z]",""));  // 타겟 정규식 "(영어)소문자" 변환 대상 ""
        //모든 소문자 제거 후 출력
        System.out.println(str.replaceAll("[A-Z]",""));  // 타겟 정규식 "(영어)대문자" 변환 대상 ""
        //모든 대문자 제거 후 출력
        System.out.println(str.replaceAll("[A-z]",""));  // 타겟 정규식 "(영어)모든문자" 변환 대상 ""
        //모든 영문자 제거 후 출력
        System.out.println(str.replaceAll("[\\uAC00-\\uD7A3]",""));  // 타겟 정규식 "한국어" 변환 대상 ""
        //모든 한국어 제거 후 출력(유니코드)
        System.out.println(str.replaceAll("[0-9]",""));  // 타겟 정규식 "모든숫자" 변환 대상 ""
        //숫자가 전부 제거 후 출력 or \\d 로도 가능
        System.out.println(str.replaceAll("[^0-9]",""));  // 타겟 정규식 "숫자를 뺀 모두 " 변환 대상 ""
        //숫자만 남기고 전부 제거 후 출력  or \\D 로도 가능
        System.out.println(str.replaceAll("[\\s]",""));  // 타겟 정규식 "공백 " 변환 대상 ""
        //공백 제거 후 출력
        System.out.println(str.replaceAll("[\\S]",""));  // 타겟 정규식 "숫자를 뺀 모두 " 변환 대상 ""
        //공백만 남기고 전부 제거 후 출력
        System.out.println(str.replaceAll("[ab][c]",""));  // 타겟 정규식 "a나b를 중에 c가 조합된 문자 " 변환 대상 ""
        // bc 제거 후 출력
    }
}

이외에도 다양한 정규식 들이 있다.(추후 추가 예정)

'Java > Class & method' 카테고리의 다른 글

PriorityQueue(우선순위 큐)  (0) 2022.12.22

Java의 특징

1. 운영체제(OS)에 상관없이 모든 운영체제에서 실행이 가능

2. 객체 지향 언어 (Object Oriented Programming, OOP) 로 되어 유지 보수 및 확장성이 좋음

3. 함수형 프로그래밍 지원하여 필터링, 매핑,집계 처리가 쉽고 코드가 간결

4. 자동메모리 관리기능(Garbage Collection)이 있어 자동으로 사용하지 않은 메모리 수거 

'Java' 카테고리의 다른 글

Java의 메모리  (0) 2023.06.19

+ Recent posts