반응형
참조 타입
- 배열 타입, 열거 타입, 클래스, 인터페이스
- 기본 타입은 실제 값을 변수에 저장하지만, 참조 타입은 변수에 힙 영역에 생성되어있는 객체의 메모리의 번지 수를 저장하여 객체를 참조함
- 모든 변수는 스택 영역에 생성됨
String name = "홍길동";
String hobby = "독서";
// String 객체로 생성이 되기 때문에 번지를 참조함
메모리 영역
java 명령어로 JVM이 구동되면 JVM은 운영체제에서 할당받은 메모리 영역을 다음과 같이 구문해서 사용
- 메소드 영역
- 클래스별로 정적필드와 상수, 메소드 코드, 생성자 코드 등이 저장됨
- 바이트코드 파일을 읽은 내용이 저장됨 (소스코드(.java) → 바이트코드파일(.class))
- 힙 영역
- 클래스로 부터 생성된 객체와 배열이 저장됨
- 여기에서 생성된 객체나 배열을 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조함
- 스택 영역
- 메소드 실행시 사용되는 변수를 포함하는 프레임이 저장, 제거하는 동작을 수행
- 최초로 변수에 값이 저장될 때 스택영역에 변수 생성됨
- 변수가 선언되어 블록 안에서만 스택에 존재하고, 블록을 벗어나면 스택에서 제거됨
참조 변수의 ==,≠ 연산
- 동일한 객체(동일한 번지)를 참조하는지 알아볼 때 사용
- 문자열은 같으나 참조객체가 다를경우가 있음
null과 NullPointerException
- null : 참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있음
- null 값도 초기값으로 사용할 수 있기 때문에 스택 영역에 생성됨
- 예외(Exception) : 프로그램 실행 도중에 발생 하는 오류들
- NullPointerException : 참조 변수가 null을 가지고 있을경우, 참조 객체가 없으므로 변수를 통해 객체를 사용 할 수 없음
String 타입
- 자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 설계되어있음
- 문자열은 String 객체로 생성되고, 변수는 String 객체를 참조
- new 연산자로 문자열이 같은 두개의 String객체를 생성할 경우 참조하는 번지수가 다르기 때문에 == 연산으로 비교할 경우 false가 나옴
- 따라서 문자열 자체가 같은지 비교할 경우엔 equals() 메소드를 사용
boolean result = str1.equals(str2);
// str1 → 원본 문자열, str2 → 비교 문자열
- JVM은 참조되지 않는 객체는 쓰레기 객체로 취급하고 쓰레기 수집기(Gabage Collector)를 구동시켜 메모리에서 자동 제거함
- 문자 추출 : 특정 위치의 문자를 얻고 싶다면 charAt() 메소드를 이용할 수 있음
- 문자열 길이 : 문자의 개수를 얻고 싶다면 length() 메소드를 이용할 수 있음
- 문자열 대체 : 특정 문자열을 다른 문자열로 대체하고 싶다면 replace() 메소드를 이용할 수 있음
- 문자열 잘라내기 : substring(시작인덱스, 종료인덱스(기술하지 않을경우 문자열 끝으로 설정됨)) 메소드 이용, 시작인덱스 부터 종료인덱스 까지 출력됨
- 문자열 찾기 : 특정 문자열의 위치를 찾고싶다면 indexOf() 메소드 사용, 문자열이 시작되는 인덱스를 리턴
- 문자열 분리 : 문자열이 구분자를 사용하여 여러 개의 문자열로 구성되어 있을 경우, 이를 따로 분리해서 얻고싶다면 split() 메소드 사용 → 반환 타입 배열
String subject = "자바 프로그래밍";
char charValue = subject.charAt(3); // "프" 추출됨
int length = subject.length(); // 8 리턴함
String newStr = subject.replace("자바", "JAVA") // "JAVA 프로그래밍" 으로 출력됨
String firstStr = subject.substring(0,1) // "자바" 저장됨
String secondStr = subject.substring(3) // "프로그래밍" 저장됨
int findIndex = subject.indexOf("프로그래밍") // 3 리턴함
String board = "번호, 제목, 내용, 글쓴이";
String[] arr = board.split(","); // ","를 기준으로 문자열이 구분되어 배열에 저장됨
배열 타입
- 같은 타입의 데이터를 연속된 공간(메모리)에 나열하고, 각 데이터에 인덱스(0~번호)를 부여해 놓은 자료구조
- 한번 생성된 배열은 길이를 늘리거나 줄일 수 없음
- 배열 변수는 참조 변수에 속함 → null값으로 초기화될 수있음
- 배열 변수 선언
// 형식1 → 대부분 형식1로 선언
타입[] 변수;
int[] intArray;
//형식2
타입 변수[];
int intArray[];
배열생성
- 값 목록으로 배열 생성
타입[] 변수 = { 값0, 값1, 값2, 값3, ...};
String[] names = {"신용권", "홍길동", "감자바"};
- 배열 변수를 이미 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열 생성이 허용되지 않음 → new 연산자를 이용해 값 목록을 지정해주면 됨
타입[] 변수;
변수 = { 값0, 값1, 값2, 값3, ...}; // 컴파일 에러
String[] names = null;
names = new String[] {"신용권", "홍길동", "감자바"};
- new 연산자로 배열 생성
타입[] 변수 = new 타입[길이];
int[] intArray = new int[5]; // 인덱스 0~4까지 생성
// 0~4 인덱스 모두 초기값으로 설정됨
배열 길이
- 코드에서 배열의 길이를 얻으려면 도트(.) 연산자를 사용해서 참조하는 배열의 length 필드를 일어야함
- length필드는 읽기 전용 필드이기 때문에 값을 바꿀 수 없음
다차원 배열
: 배열 항목에 또 다른 배열이 대입된 것
<배열의 각 차원의 항목에 접근하는 방법>
변수 [1차원인덱스] [2차원인덱스] [3차원인덱스]
값 목록으로 다차원 배열 생성
타입[][] 변수 = {
{값1, 값2, ...}, // 1차원 배열의 0 인덱스
{값3, 값4, ...}, // 1차원 배열의 1 인덱스
...
};
new 연산자로 다차원 배열 생성
타입[][] 변수 = new 타입[1차원수][2차원수];
배열 복사
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
원본배열 원본배열 복사 새 배열 새 배열 복사 항목 수
시작 인덱스 붙여넣기
시작 인덱스
배열 항목 반복을 위한 향상된 for문
- ①배열에 가져올 항목이 있을경우 ②타입 변수에 항목을 저장하고 ③실행문을 실행함
- 배열에 가져올 항목이 없을경우 for문을 종료함
for ( ②타입 변수 : ①배열) {
③실행문
}
main() 메소드 String[] 매개변수 용도
윈도우의 명령 프롬프트나 맥OS의 터미널에서 프로그램을 실행할 때 요구하는 값이 있을 수 있음 (ex. 명령 프롬프트 상에서 프로그램 실행을 위해 값을 입력하게 함)
public class MainStringArrayArgument {
public static void main(String[] args) {
if(args.length == 0) {
System.out.println("프로그램 입력값이 부족");
System.exit(0);
}
String strNum1 = args[0];
String strNum2 = args[1];
int num1 = Integer.parseInt(strNum1);
int num2 = Integer.parseInt(strNum2);
int result = num1 + num2;
System.out.println(num1 + "+" + num2 + "=" + result );
}
}
열거(Enum) 타입
한정된 값을 갖는 타입 (ex. 요일, 계절)
열거 타입은 참조 타입, 열거 상수는 객체
열거타입 변수명 = 열거타입.열거상수;
열거 상수는 상수 → 메소드 영역 저장
열거타입.열거상수는 객체로 생성 → 힙 영역 저장
변수명은 변수 → 스택 영역 저장
반응형
댓글