Recent Posts
Recent Comments
Link
12-04 00:16
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

자바 자료형과 변수 본문

DEV&OPS/Java

자바 자료형과 변수

ALEPH.GEM 2022. 3. 22. 10:36

변수(variable)

변수는 값을 저장하는 메모리 공간을 가리키는 메모리 주소를 참조하는 이름을 붙인 것입니다.

 

변수의 선언

변수는 사용하기 전에 선언을 해야 합니다.

왜냐하면 저장되는 값의 데이터 타입(data type)에 따라서 메모리 공간의 크기가 달라지기 때문입니다.

그 데이터 타입의 크기만큼 공간을 미리 확보해서 다른 프로그램이 값을 변경시키지 못하도록 해야 하기 때문입니다. 

int age;

여기서 int가 데이터 타입(정수형)이고 age가 변수입니다.

 

변수 작성 관례

1. 알파벳 소문자로 시작합니다.

2. 단어를 합성할 때 첫 글자를 대문자로 합니다. (낙타등 표기법)

3. 자바에서 사용하는 예약어는 금지입니다.

char charData;

 

변수 할당 연산자 =

= 은 수학에서는 같다의 뜻이지만 자바에서는 우측 값을 왼쪽 변수 메모리 공간에 저장(할당)하라는 연산자입니다.

자바에서는 같다를 뜻하는 비교 연산자는 == 입니다.

int age;
age = 30;

 

변수의 유효 범위

변수는 선언된 중괄호 블록{ } 내에서만 유효합니다.

다른 블록에서 그 변수에 값을 할당하거나 읽으려 하면 컴파일 에러가 발생합니다.

 

8진수와 16진수 정수

8진수 표기: 숫자 앞에 0을 붙여서 표기합니다.

16진수 표기: 숫자 앞에 0x 를 붙여서 표기합니다.

02, -04 	//8진수
0x5, 0xAC	//16진수

 

실수 데이터 표기 

대문자 E나 소문자 e가 있으면 지수와 가수 표현으로 간주합니다.

0.12E-5		//0.12 곱하기 10의 -5승

 

정수 자료형

byte: 8bit

short: 2byte

int: 4byte

long: 8byte

 

실수 자료형

float: 4byte

double: 8byte

 

문자(16bit 유니코드) 자료형

char: 2byte

작은따옴표로 표현합니다.

char c = 't';

 

문자열(string) 자료형 

큰 따옴표를 써서 표현합니다.

String y = "ABCDEFG";	//기본 데이터 타입 처럼 사용하면 상수 영역에 저장됩니다.

String은 기본 데이터 타입처럼 사용하기도 하지만 사실은 객체(클래스)이기 때문에 인스턴스 형식으로도 사용 가능합니다.

String name = new String("자바"); //instance object로 생성하면 heap 영역에 저장됩니다.

String은 객체이므로 참조 데이터 타입이며 참조하는 메모리 영역에 따라서 == 비교 연산자로 같은 문자열도 false를 리턴할 수 있으니 문자열을 비교할 때는 equals() 메서드를 사용합니다.

 

boolean 자료형

논리 연산을 하기 위한 true와 false를 사용하기 위한 자료형을  boolean이라고 부릅니다.

부울 대수를 만든 조지 부울의 이름을 딴 것입니다.

boolean isSuccess = false;

 

final

변수 타입 앞에 final 키워드를 붙이면 상수가 됩니다. 

상수는 변경 불가이며 읽기 전용입니다.

final float pi = 3.14f;

 

 

확장 특수 출력 문자(escape sequence)  

경고음                                                                       '\a'
new line                                               '\n'
tab                                                      '\t'
backspace                                               '\b'
carriage return(커서 맨 왼쪽으로 옮김)     '\r'
form feed(출력 용지 한 페이지 넘김)         '\f'
\ back slash문자                                                 '\\'
single quote(작은 따옴표)                      '\''
double quote(큰 따옴포)                        '\"'
null   널문자 '\0'
 \는 backslash 기호로 물음표 키 와 함께 있는  / slash 기호와 좌우 반대인 기호입니다.
한글 키보드에는 백 슬래시 기호 대신에 원화 기호 \ 를 대신 사용합니다.

 

배열 

참조 데이터 타입으로, 메모리 공간상 연속적으로 저장되기 때문에 인덱스가 저장된 메모리 위치를 나타냅니다.

// new 키워드로 배열을 선언하는 방법
// int [] 배열이름 = new int [배열 인덱스 갯수];  
// 배열 인덱스 갯수가 5 이면 인덱스는 0부터 시작해서 0,1,2,3,4 입니다.
char [] arrChar = new char[5];

//직접 배열을 초기화 하는 방법
// int [] 배열이름 = {원소1, 원소2, ... , 원소n};
int [] arrNum = {3,6,9};
//위의 경우 원소의 인덱스는 각각 0, 1, 2 가 됩니다.

 

명시적 형 변환(Type Casting)  

int a, c;
a = (short)c;

이와 같이 변환하고자 하는 자료형을 소괄호로 묶은 뒤 변환할 자료 앞에다 써주면 short 자료형이 int 자료형으로 명시적으로(강제로) 형 변환이 됩니다.

이것은 자료형이 변환된다기보다 마치 월드컵 경기(c)를 (short)캐스터가 시청자(a)에게 중계방송을 하는 것과 비슷하다고 할 수 있습니다.

본래 데이터에는 영향이 없지만 받아들이는 시청자 입장에서는 캐스터가 전달해 주는 대로 받아들일 수밖에 없겠죠.

그래서 캐스팅이라는 이름이 붙었습니다.
단, 데이터 크기가 큰 자료형에서 작은 자료형으로 변환할 때는 데이터의 손실이 있을 수 있습니다.
명시적 형 변환을 생략하면 암시적 형 변환이 됩니다.

데이터 타입 크기가 커지는 쪽으로 캐스팅은 자동으로 캐스팅 되지만 반대의 경우는 명시적으로 캐스팅을 해주어야만 합니다.

자동 캐스팅: byte ▷ short ▷ char ▷ int ▷ long ▷float ▷double
* int와 char를 + 하면 런타임 오류가 발생합니다.

 

 

객체와 참조 자료형(reference data type)

인스턴스 객체(instance object):
참조 자료형(reference data type)이라 하여 일종의 구조화된 사용자 정의 자료형인데 구조화된 데이터의 모임이 메모리상에 자리 잡아 구현된 된 상태를 말합니다.
클래스(class):
인스턴스를 만들기 위한 모양(구조화된 데이터)을 기술하는 것을 말합니다.
하나의 클래스로부터 생성된 인스턴스들이 메모리상에 여러 개의 다른 이름으로 생성되어 올려질 수 있습니다. 
클래스 자체도 하나의 object입니다.
멤버(member):
인스턴스에 소속되어 있는 변수들과 메서드를 말합니다. 
멤버 변수를 필드(field)라고 부르기도 합니다.

참조 자료형은 직접 인스턴스의 멤버 변수(속성,필드)가 저장된 주소로 찾아가는 것이 아니라 런타임에서 인스턴스가 저장된 위치에서 상대적인 거리에 저장되기 때문에 인스턴스의 메모리 위치(주소) 참조를 통해서 접근해야 합니다.

인스턴스의 모체인 클래스에서는 멤버 변수를 선언한다고 해서 메모리에 그 위치가 바로 할당 되는 것이 아니라 그 클래스를 런타임(run-time)에서 실체화(객체화, 인스턴스화)해야 메모리에 할당되어 비로소 맴버 변수들(속성)을 사용할 수 있게 되는 것입니다.

 

메서드(method):
멤버 변수들이 할 동작을 정의하는 것입니다. 즉 멤버 변수들을 컨트롤하는 함수 같은 것입니다.
메서드가 어떤 작업을 처리 후에 결과 값을 메소드를 호출한 곳에 돌려 줄려면 return 키워드를 이용하고 리턴값이 없으면 void 를 메소드 앞에 붙여야 합니다.
생성자:
클래스(형틀)를 실체화(인스턴스로 만드는) 하는 작업을 하는 클래스의 이름과 똑같은 매소드로써 객체 생성 시 해줄 작업을 생성자가 따로 지정해 줄 수 있습니다. 

그런데 일일이 생성자가 할 작업을 정의해 지정해 주지 않아도 디폴트 생성자를 자동으로 수행해 줍니다.

생성자는 new라는 키워드를 통해 클래스가 비로소 인스턴스가 되어 메모리에 할당이 됩니다.

그 때야 인스턴스에 대해서 상대적인 위치 힙(heap) 영역에 저장되는 멤버 변수(속성)들에 접근할 수 있는 것입니다.

또한 자바에서는 인스턴스를 메모리상에서 제거하는 메서드인 소멸자를 정의할 수 있지만 쓸모 없어지면(참조가 끊겨서 접근할 수 없게 된 인스턴스) 가비지 컬렉터가 자동으로 메모리에서 해제해 줍니다.

 

객체(Object):
데이터(변수)와 메서드가 합쳐진 클래스와 인스턴스를 가리키는 말입니다.
//자바는 대소문자를 다른 문자로 취급하므로 타이핑시 주의
class  RefInstTest {
    public static void main(String[] args) {
    	RefInst a;                   // 인스턴스를 참조할 참조 변수 a의 선언
    	a = new RefInst();     
 		//생성자 호출에 의한 클래스를 인스턴스화(객체 a 생성)하여 a에 할당
 		// 생성된 인스턴스를 가리키는 객체참조변수(포인터)로 a를 사용 한다는 뜻
 		// a는 생성된 인스턴스의 메모리에서 시작 위치가 저장된 대표 이름(위치)같은 것
 		// 이때 a자체는 객체참조변수로 스택영역에 저장되고 
 		// a에 생성된 인스턴스의 주소가 저장되어 그 주소를 가리키고 있는 곳은
 		//생성된 인스턴스 자체와 맴버들이 저장 된 힙 영역이다.
        a.name = "객체이름";    // 생성된 객체 a의 맴버 변수(속성)에 접근하여 값 지정
        a.count = 5; 
        System.out.println(a.name + "," + a.count);   //생성된 객체의 맴버 변수들 출력        
    }
}

// 객체참조변수 a가 가리키는 인스턴스를 만들기 위한 형틀(클래스) 정의 부분
class RefInst {
	String name;             //  클래스의 맴버 변수(속성) 선언, 메소드도 멤버가 될 수 있다.
	int count;
}

 

열거 타입(Enumeration Type)

열거 타입은 참조 데이터 타입이라 객체 취급을 하며, 열거 타입 이름으로 .java 파일을 생성해야 합니다.

열거 타입의 값은 상수 취급을 하기 때문에 모두 대문자로 작성해야 합니다.

public enum Week{
	MONDY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY, SATURDAY, SUNDAY
}
Week today = Week.SUNDAY;
if(today == Week.SUNDAY){
    System.out.println("참");
}
Week today2 = Week.SUNDAY;
if(today == todya2){
	System.out.println("참");
}

 

열거 타입의 메서드

name() : 열거 객체가 가지고 있는 문자열을 리턴합니다.

ordinal() : 몇 번째 열거 객체인지 int 타입으로 리턴합니다.

compareTo() : 인수로 주어진 객체를 기준으로 몇 번째 위치하는지 리턴합니다. 기준값보다 순번이 빠르면 음수로 리턴하고 늦으면 양수로 리턴합니다.

valueOf() : 인수로 받는 문자열과 동일한 문자열을 가지는 열거 객체를 리턴합니다. 문자열을 열거 객체로 변환할 때 주로 쓰입니다.

values() : 열거 타입의 모든 열거 객체들을 배열로 만들어 리턴합니다.

 

 

 

JVM 메모리 영역

1. 메서드 영역: 모든 스레드가 공유하는 영역입니다. 클래스별로 런타임 constant pool, field/method, method코드, 생성자 코드들이 저장됩니다.

2. Heap 영역: 인스턴스 객체와 배열이 저장됩니다. 참조가 없어진 객체는 가비지 컬렉터가 제거합니다.

3. Stack 영역: 스택 영역은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당이 됩니다. JVM스택은 메서드를 호출할 때마다 프레임을 push 하고 메서드가 종료되면 해당 프레임을 pop 합니다. 프레임 내부에는 로컬 변수 스택이 있는데 여기에는 변수들이 push 되거나 pop 됩니다. 

728x90

'DEV&OPS > Java' 카테고리의 다른 글

조건문과 제어문  (0) 2022.03.25
자바 연산자  (0) 2022.03.24
JDK  (0) 2022.03.22
드디어 이클립스 JSP 한글 깨짐 해결!  (0) 2022.02.22
보안 인증서 오류 탐색이 차단됨. 해결 방법  (1) 2022.02.15