[JAVA] Primitive type과 Reference type 그리고 Object 클래스
Primitive type과 Reference type 그리고 Object 클래스
Primitive type (원시타입)
● 자바 언어에 내장된 기본 유형
● 자바는 정수, 실수, 논리, 문자 방식의 primitive type을 지원한다.
● wrapper class는 각 primitive type을 클래스로 만든 것이다.
● stack 메모리에 저장됨.
■ byte
- 8 비트 크기에 부호있는 정수
- 표현할 수 있는 범위는 -128 ~ 127
- 2의 보수로 메모리에 저장됨
- 기본값 : 0
- wrapper class : Byte
■ short
- 16 비트 크기에 부호있는 정수
- 표현할 수 있는 범위는 -32,768 ~ 32,767
- 2의 보수로 메모리에 저장됨
- 기본값 : 0
- wrapper class : Short
■ int
- 32 비트 크기에 부호있는 정수
- 표현할 수 있는 범위는 -2,147,483,648 ~ 2,147,483,647
- 2의 보수로 메모리에 저장됨
- 주로 사용
- 기본값 : 0
- wrapper class : Integer
■ long
- 64 비트 크기에 부호있는 정수
- 범위는 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
- 2의 보수로 메모리에 저장됨
- 기본값 : 0L
- wrapper class : Long
■ float
- 32 비트 크기에 실수
- IEEE 754 표준을 따릅니다.
- 부동소수점 방식으로 메모리에 저장됨
- 화폐와 같이 정확한 값을 요하는곳에 double을 사용하면 안됨
- 기본값 : 0.0f
- wrapper class : Float
■ double
- 64 비트 크기에 실수
- IEEE 754 표준을 따릅니다.
- 부동소수점 방식으로 메모리에 저장됨
- 화폐와 같이 정확한 값을 요하는곳에 double을 사용하면 안됨
- 기본값 : 0.0d
- wrapper class : Double
■ boolean
- true와 false의 두 가지 값을 가지는 논리형
- 참 / 거짓 상태를 판별하기 위한 간단한 flag로 boolean을 사용합니다.
- 1bit의 정보를 표현하지만, 사용하는 메모리 크기는 정확히 정해져 있지 않습니다.
- 기본값 : false
- wrapper class : Boolean
■ char
- 16 비트 유니 코드 문자
- 범위는 0 ~ 65,535 혹은 '\ u0000' ~ '\ uffff'
- 기본값 : ‘\u0000’
- wrapper class : Character
Reference type
- 클래스 타입(class type), 인터페이스 타입(interface type), 배열 타입(array type), 열거 타입(enum type)
- Ball 클래스의 참조형 변수를 선언 : Ball b; → Ball 클래스 인스턴스를 생성 후 참조형 변수에 할당 : b = new Ball(); → heap 메모리에 저장.
- 힙 메모리에 생성된 인스턴스는 메소드나 각종 인터페이스에서 접근하기 위해 JVM의 Stack 영역에 존재하는 Frame에 일종의 포인터(C의 포인터와는 다르다.)인 참조값을 가지고 있어 이를 통해 인스턴스를 핸들링한다.
- 그래서 참조형 클래스 사용 시 아래의 변수 할당 방식을 사용시 할당된 변수가 변경되는 원소스에 해당되는 변수도 같이 변형된다. 그래서 원소스에 해당되는 인스턴스와 별개로 할당 변수를 사용하기 위해서는 clone 내지 별개의 힙 메모리에 복사를 하여 사용하는 것이 안전하다.
1 2 3 4 5 6 7 | UserTypeCls cls = new UserTypeCls(); // 원소스 참조형 변수(클래스) 생성 UserTypeCls refCls = cls; // 새 변수에 원소스 변수 할당 refCls.changeValue(234); // 새 변수를 변경하면 원소스 참조형 변수도 변경된다. // 원소스는 변경하지 않고 새 변수만 변경하기 위해서는 clone된 인스턴스를 사용해야 한다. UserTypeCls newRefCls - cls.cloneInscance(); newRefCls.changeValue(5678); // 새 변수만 변경되고 원소스 변수는 변경되지 않는다. |
- JVM과 메모리 구조 챕터에서 생성과 소멸 등의 과정 참조
Object Class
- 클래스 계층구조의 루트 클래스
- Primitive type이 아닌 모든 type(배열 포함)이 Object 클래스를 직접, 간접적으로 상속합니다.
- Object 클래스는 JVM(특히 Execute Engine / Garbage collector)에서 클래스 인스턴스의 생성과 소멸 등의 생명주기(life cycle)을 관리할 수 있게 한다.
- 클래스의 생성자 Object 클래스의 finalize(), wait() 등 대부분의 메소드가 JVM에서 클래스를 핸들링하기 위해 사용되는 메소드다.
- 참조형 변수(클래스)들은 기본적으로 Object를 상속하기 때문에 모든 클래스의 인스턴스의 라이프사이클을 관리할 수 있게 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | /** * 생명주기 확인 예제 */ public class LifeCycleTest { // 생성자 public LifeCycleTest() { super (); System.out.println( "생성자 호출 : 시스템 자원을 할당 받습니다." ); } void use(){ System.out.println( "use 호출 : 시스템 자원을 사용합니다." ); } // Object 클래스의 finalize() 메소드 오버라이드 @Override protected void finalize() throws Throwable { System.out.println( "finalize 호출 : 시스템 자원의 할당을 해제 합니다." ); super .finalize(); } } public static void main(String[] args) { /** * gc를 호출 한다고 해서 가비지 컬렉터가 즉시 실행 된다는 보장은 없다. * finalize를 정상적으로 출력되려면 JVM 프레세서를 가능한 한 빨리 실행되도록 OS스케쥴을 조정한다. * (윈도우의 경우 작업관리자에서 실행되고 있는 java 프로세서의 우선순위를 높게 설정하면 된다.) */ LifeCycleTest obj = new LifeCycleTest(); obj.use(); // ResourceUser 객체를 사용한다. obj = null ; // ResourceUser 객체를 더이상 필요치 않은 상태로 만든다. System.gc(); //System 클래스의 gc(garbage collector 메소드를 호출한다. } |
- Object 클래스의 메소드
- clone() - 객체와 동일한 클래스의 새로운 객체를 작성합니다.- equals(Object) - 두 객체의 동일성을 비교합니다.
- finalize() - 객체에 대한 참조가 더 이상 없다고 판별되면 메모리를 회수하면서 호출됩니다.
- getClass() - 객체의 런타임 클래스를 리턴합니다.
- hashCode() - 객체의 해시 코드 값을 리턴합니다.
- notify() - 해당 객체의 모니터에 대기중인 단일 스레드를 깨웁니다.
- notifyAll() - 해당 객체의 모니터에 대기중인 모든 스레드를 깨웁니다.
- toString() - 객체를 표현하는 문자열을 리턴합니다.
- wait() - 객체에 있는 다른 변경의 스레드에서 통지할 것을 기다립니다.
- finalize() - 객체에 대한 참조가 더 이상 없다고 판별되면 메모리를 회수하면서 호출됩니다.
- getClass() - 객체의 런타임 클래스를 리턴합니다.
- hashCode() - 객체의 해시 코드 값을 리턴합니다.
- notify() - 해당 객체의 모니터에 대기중인 단일 스레드를 깨웁니다.
- notifyAll() - 해당 객체의 모니터에 대기중인 모든 스레드를 깨웁니다.
- toString() - 객체를 표현하는 문자열을 리턴합니다.
- wait() - 객체에 있는 다른 변경의 스레드에서 통지할 것을 기다립니다.
String 클래스
- 문자열을 primitive type 처럼 사용할 수 있도록 String 클래스를 특별하게 처리함. 즉, String 클래스는 일종의 Primitive 타입(원시타입)처럼 사용 가능하지만 원시타입에는 속하지 않는다.
- String 클래스는 값이 변경되지 않으며, 값을 변경하는 함수가 있지만, 이 함수는 값이 다른 String 클래스 객체를 생성한다. (immutable object)
- String s = “aaa”; 와 같이 큰따옴표를 사용하여 생성자를 호출할 수 있다.
- String 클래스만이 + 연산자를 통해 문자열 연결
- String 비교시 equals() 함수 사용
- String class의 사용 예제 : 첨부 소스 참조
링크 목록
- JVM과 메모리 구조 - http://www.gliderwiki.org/wiki/76
- Fun With Strings Example Code - http://java.about.com/od/understandingdatatypes/ss/Fun-With-Strings-Example-Code.htm
- String 예제 - http://minc.tistory.com/30
- 뇌를 자극하는 JAVA 프로그래밍 정리 - 14장. System 클래스 - http://invincure.tistory.com/entry/Chap16-%EB%84%A4%EC%8A%A4%ED%8B%B0%EB%93%9C-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EB%84%A4%EC%8A%A4%ED%8B%B0%EB%93%9C-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4
http://www.gliderwiki.org/wiki/79 펌
'나는 프로그래머다! > Java & Android' 카테고리의 다른 글
[Java] Collection Framework 간단 정리 (0) | 2016.06.17 |
---|---|
안드로이드 리소스 정책 #4 - 관리 및 방법 편 (0) | 2016.04.28 |
안드로이드 리소스 정책 #3 (0) | 2016.04.22 |
안드로이드 리소스 정책 #2 (0) | 2016.04.19 |
안드로이드 리소스 정책 #1 (0) | 2016.04.19 |
Eclipse 에서 Tap을 Space로 변경하기 (0) | 2016.03.31 |
PreferenceActivity 와 Fragment (0) | 2016.03.10 |
BroadcastReceiver 간단 정리 (0) | 2016.02.01 |
안드로이드 View 클래스 관련 깨알같은 스펙정보 (0) | 2016.01.21 |
안드로이드 App Flag_Activity 란? (0) | 2016.01.21 |