Java 기초 - 3

RumbleBi·2023년 3월 2일
0

Java

목록 보기
3/6
post-thumbnail

JAVA의 메모리 관리

stack area: 지역변수, 매개변수가 할당되는 영역으로 '초기화'가 진행되지 않는다.

heap area: 객체와 모든 인스턴스 객체가 할당되는 영역으로 '자동으로 초기화'가 진행된다.

static area or method area: 메소드의 바이트코드, static 변수가 할당된다.

여기서 static area는data segment code segment로 나뉜다.

code segment는 직접 작성한 코드의 내용이 바이트코드로 변환되어 들어간다. 프로그램이 실행되면 이 바이트코드를 읽어 실행하게 된다.

data segment는 class의 필드안에 static을 선언하면 다른 class들이 이를 공유할수 있다. 이 static 데이터들을 저장하는 곳이 data segment이다.

여기서 스택과 힙을 자세히 설명하자면 스택에는 class(참조타입)의 newTest가 들어가게 된다. (4byte)

힙은 new 라는 동적 할당자에 의해 Test객체의 인스턴스를 생성하기 위해 메모리를 할당받는다. 그리고 그 안의 객체는 double(8byte)의 Test2 가 들어가게 된다.

package

자바는 패키지를 통해 관련 있는 클래스들을 그룹화한다.

패키지를 사용하면 외부로부터 제공받은 여러 클래스들과 현재 파일에서 구현하는 클래스들을 구분할 수 있다.

패키지를 사용하는 가장 큰 이유는 클래스 이름에 대한 유일성을 보장할 수 있기 때문이다.

클래스 import

클래스는 자신의 패키지에 있는 모든 클래스와 다른 패키지의 모든 pulbic 클래스들을 import할 수 있다.

import 문은 소스파일의 최상단에 위치하며 포함시키는 클래스를 정의한다.

와일드카드(*)를 사용하여 특정 패키지의 모든 클래스를 포함시킬 수 있다. 단, 사용하려는 클래스가 두 곳 이상의 패키지에 포함된 경우 컴파일 에러가 발생한다.

사용방법은 두가지이다.

ex)

java.util.Date today = new java.util.Date();

ex2)

import java.util.Date;
// ...
Date today = new Date();

ex3)

// util, sql 에 같은 이름의 클래스가 있을 경우
import java.util.*;
import java.sql.*;

Date today = new Date(); // compile error

ex4)

import java.util.*;
import java.sql.*;
import java.util.Date;

Date today = new Date();

static import

import static 문을 사용하면 정적 메소드나 필드의 클래스명 없이 사용할 수 있다.

마찬가지로 와일드카드의 사용으로 해당 클래스의 모든 정적 요소를 포함시킬 수 있다.

그러나 클래스명없이 정적 요소를 사용하는 것은 코드가 명시적이지 않아서 권장하지 않는다.

ex)

import java.lang.Math;
// ...
Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
import static java.lang.Math.*;
// ...
sqrt(pow(x,2) + pow(y, 2));

패키지 구성

패키지에 대한 정의는 클래스 소스파일의 가장 상단에 위치하며 소스파일은 패키지명과 동일한 위치에 위치한다.

컴파일 결과(바이트코드)도 동일한 폴더에 생성된다.

IDE(IntelliJ, Eclipse)에서는 설정을 통해 컴파일 결과를 다른 폴더에 저장할 수 있다.

profile
기억보다는 기록하는 개발자

0개의 댓글