객체
스택(Stack)
- 변수들이 생성되는 메모리 영역
- 기본 타입 변수 : 직접 값 저장
힙(Heap)
- 참조 타입 변수 : String 객체 번지 저장 / 이 번지를 통해 String 객체 참조
메소드 영역
- 바이트코드 파일을 읽은 내용이 저장되는 영역
- 상수, 정적 필드, 메소드 코드, 생성자 코드 등이 저장
힙 영역
- 객체가 생성되는 영역
- 객체의 번지는 메소드 영역과 스택영역의 상수와 변수에서 참조 가능
스택 영역
- 메소드를 호출할 때마다 생성되는 프레임이 저장되는 영역
- 메소드 호출이 끝나면 프레임 자동 제거
- 프레임 내부
- 로컬 변수 스택이 존재
- 기본 타입 변수와 참조 타입 변수가 생성되고 제거됨
- null로 초기화된 참조변수가 생성되는 영역
==, != 연산자
if(refVar2 == refVar3) { ... }
- 변수의 값이 같은지, 아닌지 조사
- 참조타입 변수의 값은 객체의 번지 비교
- 번지가 같다면 동일한 객체 참조 / 다르다면 다른 객체 참조
배열
package ch05.sec03;
public class ReferenceVariableCompareExample {
public static void main(String[] args) {
int[] arr1;
int[] arr2;
int[] arr3;
arr1 = new int[] {1,2,3};
arr2 = new int[] {1,2,3};
arr3 = arr2;
System.out.println(arr1 == arr2);
System.out.println(arr2 == arr3);
}
}
NullPointerException
- NullPointerException : 변수가 null인 상태에서 객체의 데이터나 메소드를 사용하려 할 때 발생하는 예외
- 예외가 발생한 곳에서 null 인 상태의 참조 변수가 사용되고 있음을 알아야 한다.
- 예외 해결방법 : 참조변수가 객체를 정확히 참조하도록 번지를 대입한다.
- null : 아직 번지를 저장하고 있지 않은 참조 타입 변수
- 초기값으로 사용 가능
- null로 초기화된 참조 변수는 stack 영역에 생성
- 변수에 null을 대입하면 번지를 잃게 되므로 더 이상 객체를 사용할 수 없게 된다.
Garbage Collector
- 어떤 변수에서도 참조하지 않는 객체 = 프로그램에서 사용할 수 없는 객체
- Garbage Collector를 통해 자동 제거
- 힙 메모리에는 존재하나, 위치 정보를 모르기 때문에 사용할 수 없다.
- 객체를 제거하는 유일한 방법 : 객체의 모든 참조를 없애는 것
문자열(String) 타입
- String 객체 : 자바의 문자열 생성 형태
- 자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 설계되어 있다.
- 빈 문자열(" ") 대입도 가능하다.
new 연산자
String name1 = new String("홍길동");
String name2 = new String("홍길동");
- 문자열 리터럴로 생성하느냐 new 연산자로 생성하느냐에 따라 비교 연산자의 결과가 달라질 수 있다.
String name1 = "홍길동";
String name2 = "홍길동";
String name3 = new String("홍길동");
name1 == name2
name1 == name3
- 값의 목록은 없지만 향후 값들을 저장할 목적으로 배열을 미리 생성하는 것
- 길이 : 배열이 저장할 수 있는 항목 수를 말한다.
- 이미 배열 변수가 선언된 후에도 대입이 가능하다.
타입[] 변수 = null;
변수 = new 타입[길이];
- 배열을 처음 생성하면 배열 항목은 기본값으로 초기화된다.
- 기본타입
- 0 : byte[], char[], short[], int[], long[]
- 0.0 : float[], double[]
- false : boolean[]
- 참조 타입
equals()
- 내부 문자열만을 비교할 경우 사용
- 동일한 String 객체든 다른 String 객체든 상관없이 비교 가능하다.
- 빈 문자열(" ") 참조도 가능하다.
boolean result = str1.equals(str2);
// str1이 원본 문자열
// str2가 비교 문자열
charAt()
- 문자열에서 특정 위치의 문자를 얻는 메소드
- 인덱스 길이 구하기 : 0에서부터 문자열의 길이 - 1
length()
- 문자열에서 문자의 개수 얻는 메소드
- 공백의 개수를 포함한다.
replace()
- 문자열에서 특정 문자열을 다른 문자열로 대체하는 메소드
- 기존 문자열은 그대로 두고, 대체한 새로운 문자열을 리턴한다.
indexOf()
- 문자열에서 특정 문자열의 위치를 찾는 메소드
- 주어진 문자열이 시작되는 인덱스를 리턴한다.
- 주어진 문자열이 포함되어 있지않으면 -1을 리턴한다.
contains()
- 주어진 문자열이 단순히 포함되어 있는지만 조사하는 메소드
- 원하는 문자열이 포함되어 있으면 true 리턴
- 원하는 문자열이 포함되어 있지 않으면 false 리턴
split()
- 구분자를 사용하여 여러 개의 구성된 문자열을 따로 분리해서 얻는 메소드
- board는 쉼표로 구분된 문자열을 갖고 있다.
배열(Array) 타입
- 변수는 하나의 값만 저장가능하다.
- 배열
- 연속된 공간에 값을 나열시키고, 각 값에 인덱스를 부여해놓은 자료 구조
- 많은 양의 값을 다루는 좀 더 효율적인 방법
- for문과 사용
- 배열 변수 선언
- 배열 변수는 참조 변수이다.
- 힙 : 객체인 배열을 생성하고 주소를 저장하는 장소
- 저장된 번지를 리턴한다.
- null 초기화 가능 : 참조할 배열이 없다면 null로 초기화 가능하다.
- 배열 변수는 리턴된 번지를 저장함으로써 참조가 이루어진다.
타입[] 변수;
타입 변수[];
- new 타입[] : 배열 변수를 선언한 시점과 값 목록이 대입되는 시점이 다를 때 사용한다.
변수 = new 타입[] [값0, 값1, 값2, 값3, ... };
배열 길이
- 배열에 저장할 수 있는 항목 수
- 읽기만 가능하며 값을 변경할 수 없다.
- for문을 사용해서 전체 배열 항목을 반복할 때 많이 사용한다.
배열변수.length
ArrayIndexOutOfBoundsExecption
- < 연산자 : for문의 조건식에서 < 연산자를 사용한 이유는 배열의 마지막 인덱스는 배열 길이보다 1이 적기 때문이다.
다차원 배열
- 배열 항목에 또 다른 배열이 대입되는 것
- [] : 값 목록으로 생성할 때 차원의 수만큼 붙인다.
타입[][] 변수 = {
{값1, 값2, ... },
{값3, 값4, ... },
...
};
- new 연산자 : new 타입 뒤에 대괄호[]를 차원의 수만큼 붙인다.
타입[][] 변수 = new 타입[1차원수][2차원수];
배열 복사
- 배열은 한 번 생성하면 길이를 변경할 수 없다.
- 더 큰 길이의 배열을 새로 만들고 이전 배열로부터 항목들을 복사해야한다.
- 초기갑은 0/null/false이다.
- 가장 기본적인 복사 방법은 for문을 이용해서 항목을 하나씩 읽고 새로운 배열에 저장하는 것이다.
향상된 for문(배열 항목 반복을 위한)
- 배열 및 컬렉션을 좀 더 쉽게 처리할 목적으로 자바에서 제공한다.
- 항목의 개수만큼 반복한 후 자동으로 for문을 빠져나간다.
for (int score:scores) [
sum = sum + scores;
}
String[] args
Enum(열거) 타입
- 한정된 값을 갖는 타입
- 사용법 : 소스파일 생성(.java) -> 한정된 값을 코드로 정의
- 열거 타입 이름 : 첫문자는 대문자 + 캐멀스타일
Week.java
MemberGrade.java
ProductKind.java