참조 타입은 Java와 같은 객체지향 언어에서 아주 중요한 기능이다. 이를 통해 객체의 상호작용을 기반으로 한 응용 프로그램을 작성하고, 효과적으로 실행할 수 있다.
Java 프로그래밍 언어에서 이미 구현되어 있는 String과 같은 여러 참조 타입을 사용하는 방법에 대해 배우며, 클래스 계층 구조와 객체 타입에 대해 학습하여 값 타입과 참조 타입이 어떻게 관련되어 있는지 알 수 있으며, 참조 타입 간에 데이터를 변환하는 방법을 배우고, Wrapper 클래스를 사용하여 값 타입을 참조 유형으로 변환하는 것을 알게 된다.
- 값 타입(Value Type)
- 데이터를 직접 포함
- 복사된, 직접 가지는 데이터를 저장
int value;
value = 100;
- 참조 타입(Reference Type)
- 데이터(객체)가 있는 곳의 주소를 저장
- 데이터는 분리된 메모리 영역에 저장
String value;
value = "Hello";
# 값 타입과 참조 타입의 비교
- 값 타입에서의 비교 연산자와 참조 타입에서의 비교 연산자는 다르게 동작한다.
- 값 타입은 값을 직접 비교하지만 참조 타입은 주소를 우선 비교한다.
- '==' 연산자는 값 타입에서는 직접 값을, 참조 타입에서는 주소를 비교하게 된다.
- eqauls()를 쓰게 되면 참조 타입의 값을 비교할 수 있게 된다.
# String Class
- 여러 개의 유니코드 데이터
- 읽기만 하고 변경할 수 없는 불변 클래스(Immutable Class)
- 배열 형태로 접근 불가
Java의 String은 C/C++와는 다르게 클래스이다.
C/C++에서는 문자열을 처리하기 위해 char[]를 사용하지만 Java는 C#에서처럼 문자열을 처리하기 위한 String 클래스를 제공한다.
String Class는 다음과 같은 메서드를 제공한다.
- length()
- charAt()
- indexOf()
- split()
- concat()
- trim()
- toUpper() 및 toLower()
# 패키지
## java.lang 패키지
- import 없이 사용가능한 기본 패키지
- Integer, Long, Float, Double 등의 Wrapper 클래스
- 문자열과 관련된 String, StringBuffer, StringBuilder 클래스
- 표준 입출력을 위한 System.in, System.out 스트림
- Thread 관련 주요 클래스
- 이외 다양한 클래스와 인터페이스 포함
java.lang 패키지는 모든 클래스의 기본 클래스가 되는 Object 클래스가 포함된 주요 패키지이며, import 문으로 사용을 명시하지 않아도 사용할 수 있다. java.lang 패키지에는 아래와 같은 클래스들이 포함되어 있다.
- Boolean, Byte, Short, Integer, Long, Float, Double등 기본형 타입을 객체로 변환시킬 때 사용하는 Wrapper 클래스
- String, StringBuffer, StringBuilder 클래스 등 문자열과 관련된 클래스
- 표준 입출력을 위한 System.in, System.out 스트림
- 수학 관련 연산을 위한 Math 클래스
- Thread와 관련된 클래스
## java.util 패키지
- 다용도로 사용할 수 있는 유용한 클래스들이 포함되어 있는 패키지
- Object 클래스의 보조 클래스인 Objects 클래스
- 날짜, 시간과 관련된 클래스
- 자료구조와 관련된 Collections Framework 관련 인터페이스와 클래스
- 이벤트 모델과 국제화 기능
- StringTokenizer, 난수 생성기
- Scanner 클래스 등 다양한 클래스와 인터페이스 포함
java.util 패키지는 java 프로그래밍에 유용한 클래스들을 모아둔 패키지이다. 날짜, 시간과 관련된 클래스, 자료구조와 관련된 Collections Framework 관련 인터페이스와 클래스등이 포함되어 있다.
## java.io 패키지
- 파일이나 통신 등 정보의 입출력을 처리하는 클래스가 포함된 패키지
- 파일 시스템의 파일 정보를 얻기 위한 File 클래스
- 콘솔에서 문자를 입출력하기 위한 Console 클래스
- InputStream, OutputStream 클래스 등 바이트 단위 입출력을 위한 스트림 추상 클래스
- FileInputStream, FileOutputStream등 바이트 단위 입출력을 위한 스트림 클래스
- Reader, Writer등 문자 단위 입출력을 위한 스트림 추상 클래스
- FileReader, FileWriter 등 문자 단위 입출력을 위한 하위 스트림 클래스
- 그 외 입출력을 위한 다양한 클래스 포함
java.io 패키지는 파일이나 통신, 입 출력 등에 관련된 작업을 처리하는 클래스가 포함되어 있다.
# Type-Casting
- Wrapper 클래스
- Boxing과 Unboxing
- 슈퍼 클래스/서브 클래스 변환
- InstanceOf 연산자
- Object 타입 변환
- 인터페이스 타입 변환
# 객체 생성과 제거
- 생성자
- 데이터 초기화
- 객체와 메모리
## 생성자
- 객체 생성
- 기본 생성자
- 생성자 오버라이딩
- 생성자 오버로딩
### 객체 생성
- 1단계: 메모리 할당
- new 키워드를 사용하여 Heap 영역에 메모리 할당
- 2단계: 생성자를 사용하여 객체 초기화
- 클래스 이름과 괄호를 사용
Java에서 객체를 생성할 때는 다음의 두 단계를 따른다.
- new 키워드를 사용하여 객체 생성에 요구되는 메모리를 할당한다.
- 생성자를 사용하여 할당된 메모리 공간에서 객체를 초기화한다.
생성은 두 단계로 이루어지지만 실제 하나의 식에서 두 단계를 모두 실행한다.
Date 클래스인 경우 객체의 이름과 같은 메소드를 호출하여 메모리를 할당하고 메모리 공간에서 객체를 초기화한다.
# 상수 선언
"final"
# 객체와 메모리
## 객체 생명주기
- 객체 생성
- new 키워드를 사용하여 메모리에 객체 할당
- 생성자를 사용하여 메모리에서 객체 초기화
- 객체 사용
- 메소드 호출 등
- 객체 제거
- 원시 메모리 회수
- 메모리 할당 해제
## 객체와 범위
- 지역 값(Local value)의 수명은 선언된 범위에 연결됨
- 일반적으로 짧은 수명
- 결정론적인 생성과 소멸
- 동적 객체(Dynamic object)의 수명은 해당 범위에 연결되지 않음
- 보다 긴 수명
- 소멸 시기가 명확히 결정되지 않음
## 가비지 컬렉션
- 객체는 명시적으로 소멸시킬 수 없음
- Java는 객체 생성 키워드와 반대의 동작을 하는 키워드(delete 등)가 없음
- 명시적 삭제 기능은 다른 언어에서 치명적 어류의 주요 원인이 됨
- 가비지 컬렉션이 프로그래머를 대신하여 객체를 제거
- 도달할 수 없는 객체를 찾아 자동으로 제거
- 사용되지 않는 Heap 메모리로 되돌리고(메모리를 반환하고) 마무리함
- 일반적으로 메모리가 부족할 때 가비지 컬렉션 작업을 수행
'CNU SW 아카데미 > 2주차' 카테고리의 다른 글
[자바 프로그래밍] 디자인 패턴 심화 (0) | 2024.07.12 |
---|---|
[자바 프로그래밍] 람다 (0) | 2024.07.11 |
[자바 프로그래밍] 제네릭 (0) | 2024.07.10 |
[자바 프로그래밍] 클래스 (1) | 2024.07.09 |