[Java] 참조 타입
- BACKEND/Java
- 2017. 10. 16. 13:47
● 데이터 타입 분류 자바 데이터 타입에는 크게 기본타입(primitive type) 참조타입(reference type)으로 분류된다. 기본 타입이란 정수, 실수, 문자, 논리 리터럴 저장 타입을 말한다. 참조 타입이란 객체(object)의 번지를 참조하는 타입으로 배열, 열거 클래스, 인터페이스 타입을 말한다. ▶ 차이점 - 기본 타입인 byte, char, short, int, long, float, double, boolean을 이용해서 선언된 변수는 실제 값을 변수 안에 저장함 - 참조 타입인 배열, 열거, 클래스, 인터페이스를 이용해서 선언된 변수는 메모리의 번지를 값으로 갖는다. 번지를 통해 객체를 참조한다는 뜻에서 참조타입이라고 부른다. ※ 변수가 스택(stack) 영역에 생성 객체는 힙(heap) 영역에 생성됨 ● 메모리 사용 영역 JVM이 사용하는 메모리 영역에 대해서 알아보면 java.exe로 JVM이 시작되면 JVM은 운영체제에서 할당받은 메모리 영역(Runtime Data Area)을 세부영역으로 구분해서 사용한다. ▶ 메소드(Method) 영역 - 메소드 영역에는 코드에서 사용되는 클래스(~.class)들을 클래스 로더를 읽어 클랫별로 런타임 상수풀(runtime constant pool), 필드(field) 데이터, 메소드(method) 데이터, 메소드 코드, 생성자(constructor) 코드 등을 분류해서 저장. 메소드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다. ▶ 힙(Heap) 영역 - 힙 영역은 객체와 배열이 생성되는 영역이다. 힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조. 참조하는 변수나필드가 없으면 의미 없는 객체로 되므로 쓰레기로 취급해 JVM은 쓰레기 수집기(Garbage Collector)를 실행시켜 쓰레기 객체를 힙 영 역에서 자동으로 제거함. ▶ JVM 스택(Stack) 영역 - JVM 스택 영역은 각 스레드마다 하나씩 존재 스레드가시작될 때 할당된다. 자바 프로그램에서 추가적으로 스레드를 생성하지 않았다면 main 스레드만 존재하므로 JVM 스택도 하나이다. JVM 스택은 메소드를 호출할 때마다 프레임(Frame)을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작 수행함. 예외 발생 시 printStackTace() 메소드로 보여주는 Stack Trace의 각 라인은 하나의 프레임을 표현함. 프레임 내부에는 로컬 변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 추가(push)되거나 제거(pop)된다. 변수가 이 영역에 생성되는 시점은 초기화가 될 때, 즉 최로로 변수에 값이 저장될 때이고 변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거된다. ● 참조 변수의 ==, !== 연산 - 참조 타입 변수의 값은 힙 영역의 객체 주소이므로 결국 주소 값을 비교하는 것이다. 동일한 주소 값을 갖고 있다는 것은 동일한 객체를 참조한다는 의미이다. 따라서 동일한 객체를 참조하고 있을 경우 == 연산의 결과는 true이고 != 연산의 결과는 false이다. ● null과 NullPointException - 참조타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null값을 가질 수 있다. null 값도 초기값으로 사용 불가기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다. - 자바는 프로그램 실행 도중에 발생하는 오류를 예외(Exception)라고 부른다. 예외는 사용자의 잘못된 입력으로 발생하거나 프로그래머가 코드를 잘못 작성해서 발생할 수도 있다. 참조변수를 사용하면서 가장 많이 발생하는 예외 중 하나로 NullPointerException이 있다. 이 예외는 참조타입 변수를잘못 사용하면발생한다. 참조 타입 변수가 null을 가지고 있을 경우, 참조 타입 변수는 사용할 수가 없는 것이다. ● String 타입 - 자바는 문자열을 String 변수에 저장한다. String 변수에 문자열을 저장할면 큰따옴포로 감싼 문자열 리터럴을 대입하면 된다. 문자열은 String 객체로 생성되고 변수는 String 객체를 참조한다. - 일반적으로 변수에 문자열을 저장할 경우에는 문자열 리터럴을 사용하지만, new 연산자를 사용해서 직접 String 객체를 생성시킬 수도있다. new 연산자는 힙 영역에 새로운 객체를 만들 때 사용하는 연산자로 객체 생성 연산자라고 한다. - 문자열 리터럴로 생성하느냐 new 연산자로 생성하느냐에 따라 비교 연산자의 결과가 달라질 수 있다. 동일한 문자열 리터럴로 String 객체를 생성했을 경우 == 연산의 결과는 true가 나오지만 new 연산자로 String 객체를 생성했을 경우 == 연산의 결과는 false가 나온다. == 연산자는 변수에 저장된 객체 번지가 동일한지를 검사하기 때문이다. ※ 문자열을 비교할때는 String 객체의 equals() 메소드를 사용해야된다. ● 배열 타입 - 배열은 같은 타입의 데이터를 연속된 공간에 나열시키고, 각 데이터에인덱스(index)를 부여해 놓은 자료구조이다. 만약 다른 타입의 값을 저장하려고하면 타입 불일치(Type mismatch) 컴파일 오류가 발생한다. 또 다른 특징은 한번 생성된 배열은 길이를 늘리거나 줄일 수 없다. - 배열 변수는 참조 변수에 속하며 배열도 객체이므로 힙 영역에 생성된다. 배열 변수는 힙 영역의 배열 객체를 참조하게된다. 참조할 배열 객체가 없다면 배열 변수는 null값으로 초기화 될 수 있다. ▶ 배열 선언 ex) 타입 [ ] 변수; or 타입 변수 [ ]; ▶ 값 목록으로 배열 생성 - 배열 항목에 저장될 값의 목록이 있다면 간단하게 배열 객체를 만들 수 있다. ex) 데이터타입[ ] 변수 = { 값0, 값1, 값2, ...}; String[ ] names = { "신용권", "홍길동", "감자바" }; - 배열 변수를 미리 선언한 후, 값 목록들이 나중에 결정되는 상황이라면다음과 같이 new 연산자를 사용해서 값 목록을 지정해주면 된다. ex) 변수 = new 타입[ ] { 값0, 값1, 값2, 값3, ...}; String[ ] names = null; names = new String[ ] { "신용권", "홍길동", "감자바" }; ▶ new 연산자로 배열 생성 - 값의 목록을 가지고 있지 않지만, 향후 값들을 저장할 배열을 미리 만들고 싶다면 new 연산자로 다음과 같이 배열 객체를 생성시킬 수 있다. ex) 타입[ ] 변수 = new 타입[길이]; int[ ] intArray = new int[5]; - 배열이 생성되고 나서 새로운 값을 저장하려면 대입 연산자를 사용하면 된다. ex) 변수[인덱스] = 값; scores[0] = 83; ▶ 배열 길이 - 배열의 길이란 배열에 저장할 수 있는 전체 항목수를 말한다. 배열의 길이를 얻으려면 배열 객체의 length 필드를 읽으면 된다. ex) 배열변수.length; ▶ 커맨드 라인 입력 - 프로그램 실행 위해 main() 메소드가 필요한데 java 클래스로 프로그램을 실행하면 JVM은길이가 0인 String 배열을 먼저생성하고 main()메소드를 호출할 때 매개값으로 전달한다. ● 배열 (1) 같은 이름으로정의된 연속적인 공간 (2) 객체로 취급 (3) 배열로 할 수 있는 대표적인 알고리즘 1) 검색 - 순차검색(sequential) - 이분검색(binary) a, b, c, d, e, f, g, h, i 전체 데이터의중간위치를 선택한다. 중간데이터가 찾느 데이터인지 비교(찾으면 다행) 찾고자 하는 데이터가 어느방향인지 비교 선택(왼,오) 위의 과정을 반복 2) 정렬 ※ 선수 알고리즘 : swap 알고리즘 - 버블정렬 : 서로 이웃하는 것끼리 비교 정렬 - 선택정렬 : 기준을 선택하여 비교 정렬 - 삽입정렬 (4) 다차원 배열(2차원 배열 이상) (5) 불규칙 배열 char [ ] name1 = {'홍', '길', '동'}; char [ ] name2 = {'T', 'o', 'm'}; char [ ] name3 = {'J', 'o', 'h', 'n', 's', 'o', 'n'}; char [ ] name4 = {'J', 'a', 'n', 'e'}; //char [ ] names = new char[4][7]; char [ ] [ ] names = new char[4] [ ]; ... names [0] = new char [3] names [0] [0] = '홍'; names [0] [1] = '길'; names [0] [2] = '동'; ... names[1] = new char[3]; ▶ swap 알고리즘 : 값을 바꿀때 두개의 변수로는 바꿀수 없으므로 임이의 변수를 하나 더 지정해서 바꿔야 한다. int i = 10, j=20; println(i + ", " + j); /* i = j; j = i; println(i + "," + j); */ int k; k = i; i = j; j = k; println(i + "," + j); ▶ 버블정렬 : 서로 이웃하는 것끼리 비교한다 / 비교횟수는 -> 데이터 개수 - 1 <오름차순> 6 3 7 5 // 6이랑3을 비교 ↓ 3 6 7 5 // 6이랑 7을 비교 ↓ 3 6 7 5 // 7이랑 5을 비교 ↓ 3 6 5 7 // 처음부터 다시 비교 3이랑 6 비교 ↓ 3 6 5 7 // 6이랑 5랑 비교 ↓ 3 5 6 7 // 정렬 완료 ▶ 선택정렬 : 하나를 가지고 모두와 비교한다. / 비교횟수는 -> 데이터 개수 - 1 <오름차순> 6 3 7 5 // 초기 값 / 6으로 모두와 비교 ↓ 3 6 7 5 3 6 7 5 3 6 7 5 ↓ 3 6 7 5 3 5 7 6 ↓ 3 5 6 7 //정렬 완료 |
'BACKEND > Java' 카테고리의 다른 글
[Java] 알고리즘 - 정렬 예제 (0) | 2017.10.20 |
---|---|
[Java] 클래스 (0) | 2017.10.16 |
[Java] 반복문 (0) | 2017.10.16 |
[Java] 조건문 예제 (0) | 2017.10.13 |
[Java] 조건문 (0) | 2017.10.13 |