Topics
- Java Data Type
- Memory 사용 영역
- 참조 변수의 ==, != 연산
- Null과 NullPointerException
- String 타입
- Array
- 열거 타입
Java Data Type

참조 타입이란 Object의 번지 (주소) 를 참조하는 타입이라고 한다. 객체지향프로그래밍 수업과 프로그래밍 언어 수업에서 배웠던 내용을 토대로 이해하고 있는 내용이다.
메모리 사용 영역
JVM은 운영체제에서 할당받은 메모리 영역 (Runtime Data Area)

1. Method Area
- JVM이 시작할 때 생성되고 모든 thread가 공유하는 영역
- Method aread에는 코드에서 사용되는 클래스들을 class loader로 읽어 클래스 별로 static field와 constant(상수), method code, constant code (생성자 코드) 등을 분류하여 저장
Thread
process 내에서 실제로 작업을 수행하는 주체.
모든 프로세스에는 한 개 이상의 thread가 존재하여 작업을 수행한다.
두 개 이상의 thread를 가지는 프로세스를 Multi-threaded process (멀티스레드 프로세스) 라고 한다.
Class loader
JVM의 구성 요소 중 하나로 '.class' byte code를 읽어 들여 class object를 생성하는 역할을 담당한다.
즉, 클래스가 요청될 때 class 파일로부터 byte code를 읽어 메모리로 로딩하는 역할이다.
Java class들은 한 번에 모든 class가 memory에 올라가지 않는다. 각 클래스들은 필요할 때 application에 올라가게 되며, 이 작업을 class loader가 해주게 된다.
2. Heap Area
- 객체와 배열이 생성되는 영역
- JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다
- 만일 참조하는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에 JVM이 이것을 garbage (쓰레기) 로 취급하고 Garbage Collector를 실행시켜 자동으로 제거한다. 때문에 Java는 코드로 객체를 직접 제거하는 방법을 제공하지 않는다
3. Java Stack Area
- JVM 스택은 메소드를 호출할 때마다 Frame을 push하고 method가 종료되면 해당 프레임을 pop하는 동작을 수행한다
- 프레임 내부에는 로컬 변수 스택이 있는데 기본 타입 변수와 참조 타입 변수가 push되거나 pop된다
- 스택 영역에 변수가 생성되는 시점은 초기화가 될 때, 즉 최초로 변수에 값이 저장될 때이다
- 변수는 선언된 블록 내에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거된다
참조 변수의 ==, != 연산
- 기본 타입 변수의 ==, != 연산은 변수의 값이 같은지 아닌지를 조사한다
- 참조 타입 변수들 간의 ==, != 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용된다. 즉, ==, != 연산은 번지 값을 비교하는 것이다
Null과 NullPointerException
- 참조 타입 변수는 heap area의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있다
- null 값도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다
- Java는 프로그램 실행 도중에 발생하는 오류를 Exception (예외) 라고 부른다. 예외는 사용자의 잘못된 입력 또는 프로그래머가 코드를 잘못 작성하여 발생할 수 있다
- NullPointerException은 참조 타입 변수를 잘못 사용하면 발생한다
- 참조 변수가 null을 가지고 있을 경우에는 참조 객체가 없으므로 변수를 통해 객체를 사용할 수 없다. 만일 null 상태에서 있지도 않은 객체의 데이터나 메소드를 사용하는 code를 실행하면 NullPointerException이 발생한다
String Type
- Java는 문자열을 string 변수에 저장한다는 말은 엄밀히 말하자면 틀린 표현
- 문자열이 직접 변수에 저장되는 것이 아니라 문자열은 string 객체로 생성되고 변수는 string 객체를 참조한다. 하지만 일반적으로 string 변수에 저장한다고 표현한다
- 일반적으로 변수에 문자열을 저장할 경우에는 문자열 리터럴을 사용하지만, new 연산자를 사용하여 직접 string 객체를 생성시킬 수 있다
- new 연산자는 heap area에 새로운 객체를 만들 때 사용하는 연산자로 객체 생성 연산자라고 한다
String name1 = new String("김병찬");
String name2 = new String("김병찬"); // 이 경우, 서로 다른 String 객체를 참조
- 동일한 String 객체든 다른 String 객체던 상관없이 내부 문자열을 비교하고 싶을 경우 String 객체의 equals() method를 사용하여야 한다. 이 method는 원본 문자열과 매개값으로 주어진 비교 문자열이 동일한지 비교 후 true/false 를 반환한다
boolean result = str1.equals(str2); // str1 : 원본 문자열, str2 : 비교 문자열
Array
- 같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 Index를 부여해놓은 자료구조
특징
- 같은 타입의 데이터만 저장 가능
- 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없음
배열 선언
- 타입[] 변수 or 타입 변수[]
- 배열 변수는 참조 변수에 속하는데 참조하는 배열 객체가 없다면 배열 변수는 null 값으로 초기화될 수 있음
String[] name1 = null; // NullPointerException 발생. 배열을 생성하고 배열 변수가 참조하는 상태에서 값을 저장하거나 읽어야 함
배열 생성
값 목록으로 배열 생성

- 주의할 점은 배열 변수를 이미 선언한 후에는 다른 선언문에서 중괄호를 사용한 배열 생성이 허용되지 않음
- 배열 변수를 미리 선언한 후 값 목록들이 나중에 결정되는 상황이라면 new 연산자를 사용하여 값 목록을 지정
String[] names = null;
names = new String[] {"신용권", "홍길동", "김병찬"};
int add(int[] scores) {...}
int result = add({95, 85, 90}; // Compile error
int result = add(new int[] {95, 85, 90});
new 연산자로 배열 생성
- 향후 값들을 저장할 배열을 미리 만들고 싶다면 new 연산자로 배열 객체를 생성할 수 있음
String[] names = new String[4]; // 타입[] 변수 = new 타입[길이]
- new 연산자로 배열을 처음 생성할 경우 배열은 자동적으로 기본값으로 초기화됨
배열 길이
- 코드에서 배열의 길이를 얻으려면 배열 객체의 length field 를 읽음
- length field는 "읽기 전용 필드" 이기 때문에 값을 바꿀 수 없음
명령 라인 입력
- main() method 에서 "String[] args"가 필요한 이유에 대해서 궁금하였는데, main() method의 명령 라인에서 실행하면 JVM은 길이가 0인 String 배열을 먼저 생성하고 main() method를 호출할 때 매개값으로 전달
- main() method는 "String[] args" 매개변수를 통해서 명령 라인에서 입력된 데이터의 수 (배열의 길이)와 입력된 데이터 (배열의 항목 값)를 알 수 있게 됨
다차원 배열
- 사용 방식은 수학 행렬 구조와 비슷함
- 생성 원리는 행렬과는 근본적으로 다르고 계단식 구조를 가짐
- 주의할 점은 배열의 정확한 길이를 알고 Index를 사용해야 한다는 것인데, 그렇지 않으면 NullPointerException 발생
객체를 참조하는 배열
- 참조 타입 배열은 각 항목에 객체의 번지를 가지고 있음
- String[] 배열의 항목도 String 변수와 동일하게 취급되어야 함
- String[] 배열 항목 간 문자열을 비교하기 위해선 equals() meothd를 사용
배열 복사
- 배열은 한 번 생서하면 크기를 변경할 수 없어 더 많은 저장공간이 필요하다면 배열을 새로 만들어야 함
- 배열 간의 항목 값들을 복사하려면 for문을 사용하거나 System.arraycopy() meothd를 사용
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
// src : 원본 배열, srcPos : 원본 배열에서 복사할 항목의 시작 인덱스
// dest : 새 배열, destPos : 새 배열에서 붙여넣을 시작 인덱스, length : 복사할 개수
향상된 for문
- Java는 배열이나 collection을 좀 더 쉽게 처리하기 위해 향상된 for문을 제공
- 반복 실행을 하기 위해 루프 카운터 변수와 증감식을 사용하지 않음

- for문이 처음 실행될 때 배열에서 가져올 첫 번째 값이 존재하는지 평가
- 가져올 값이 존재하면 해당 값을 변수에 저장
- 실행문 실행
- 블록 내부의 실행문이 모두 실행되면 다시 루프를 돌아 배열에서 가져올 다음 값이 존재하는지 평가
- 만일 다음 항목이 존재하면 2 -> 3 -> 1 순서로 루프를 다시 진행하고, 가져올 다음 항목이 없으면 for문 종료
=> for문의 반복 횟수는 배열의 항목 수
Collection
데이터의 집합, 그룹을 의미. JCF(Java Collections Framework)는 이러한 데이터, 자료구조인 컬렉션가 이를 구현하는 class를 정의하는 Interface를 제공한다.

열거 타입 (enumeration type)
- 한정된 값만을 갖는 타입
- 한정된 값인 열거 상수(enumeration constant) 중에서 하나의 상수를 저장
열거 타입 선언
- 열거 타입의 이름을 정하고 그 이름으로 소스 파일(.java)을 생성한다.
- 이름은 관례적으로 첫 글자를 대문자로 하고 나머지는 소문자로 한다.
- "public enum" keyword는 열거 타입 선언을 위한 키워드이며, 반드시 소문자로 작성해야한다.
- 관례적으로 열거 상수는 모두 대문자로 작성한다. 여러 단어로 구성될 경우 밑줄(_)로 연결하는 것이 관례이다.
Calendar class
Java는 컴퓨터의 날짜 및 요일, 시간을 얻기 위해 Calendar class를 제공한다.
Calendar now = Calendar.getInstance();
import java.util.Calendar; // Calendar class를 사용하기 위해 필요한 Import문'Java' 카테고리의 다른 글
| Java study Day 4 - TIL (0) | 2024.04.05 |
|---|---|
| Java study Day 3 - TIL (0) | 2024.03.29 |
| Java study Day 2 - TIL (2) | 2024.03.13 |
| Java study Day 1 - TIL (1) | 2024.03.08 |