프로그래밍 언어/JAVA

[JAVA] 자바의 데이터 타입

Rateye 2021. 1. 18. 11:43
728x90
반응형

처음 공부할 때 엄청 헷갈렸던 변수의 데이터 타입..

자바에서 변수는 태어날 때부터 돌잡이 때 물건을 쥐는 아기처럼 자신이 담을 데이터 쥐어줘야 한다.

연필을 잡았지만 공부를 못했던 나와는 달리 자바의 변수들은 지정해준 데이터 타입을 충실히 지킨다.

 

자바에서 실행되는 모든 코드들은 RAM이라고 하는 메모리에서 실행된다. (RAM의 특정 공간을 할당받아 사용)

 

자료형 Data Type

기본 데이터 타입 Primitive Type

자바에서 사용하는 기본적인 데이터타입 8가지(기본형)

 

1. 정수형 - 소수점이 없는 데이터

표현 가능한 정수 범위에 따라 4가지 타입으로 분류

  • byte (1Byte = 8bit) : -128 ~ + 127까지 표현 가능
  • short (2Byte = 16bit) : -32768 ~ +32767까지 표현 가능
  • int (4Byte = 32bit) : -21억 ~ +21억 까지 표현 가능
  • long (8Byte = 64bit) : -922경 ~ +922경 까지 표현 가능

2. 실수형 - 소수점이 있는 데이터

표현 가능한 실수 범위 또는 정확도에 따라 2가지 타입으로 분류

  • float (4Byte = 32bit)
  • double (8Byte = 64bit)
		// 정수형 표현 범위
		byte b = 100; // byte 타입 변수 b 에 정수 100 저장
		System.out.println(b);
		
		b = 127;
		
		// byte 타입 변수 b 에 새로운 정수 128 저장
		// b = 128; // 오류 발생! byte 타입에 저장 가능한 정수는 -128 ~ +127 까지
		
		short s = 128;
		System.out.println(s);
		
		s = 32767;
		// s = 32768; // 오류 발생! short 타입에 저장 가능한 정수 -32768 ~ +32767 까지
		
		int i = 32768;
		System.out.println(i);
		
		i = 2147483647;
		
		//	System.out.println(2147483648); // 오류 발생!
		// => 정수형의 기본 타입은 int 형이며, int형의 표현 가능 범위는 약 21억이다.
		//    따라서, 기본형태로 표현 가능한 정수 자체의 범위가 21억으로 한정되어 있음
		// => int형으로 표현 불가능한 정수는 long 타입으로 표현해야함
		//    long 타입 숫자를 나타내기 위해서는 숫자 뒤에 접미사 L 붙여서 표현
		System.out.println(2147483648L);
		
		// i = 2147483648L; // 오류 발생! long 타입 데이터는 int형 변수에 저장 불가
		
		long l = 2147483648L;
		System.out.println(l);
		
		
		// float 타입 실수를 표현하는 경우 접미사 F 를 사용
		float f = 3.14f;
		System.out.println(f);
		
		f = 1000000000000000000000f;
		System.out.println(f);
		
		
		double d = 3.14;
		System.out.println(d);

 

 

3. 문자형 - 문자 1개를 나타내는 데이터

  • char (2Byte = 16bit)

문자 데이터 1개(1글자)를 저장할 수 있는 데이터 타입

문자 데이터는 작은따옴표 사이에 1개의 문자를 지정하여 표현

ex) 'A', 'r', '1' 등

주의!
작은따옴표 사이에 2개 이상의 문자가 올 수 없으며 반드시 1개의 문자가 포함되거나 공백 문자가 있어야 함

ex) ''는 사용 불가

문자 데이터를 2Byte 정수 형태로 저장

 

표현 가능 범위 : 2^16 = 0 ~ 65535

표현 범위의 차이 때문에 byte 또는 short 타입과 상호 강제 형 변환 필수!

최소 int타입에 저장 시 자동 형변환

실제 사용되는 문자 데이터들은 유니코드 방식을 사용하여 전 세계의 모든 문자 표기

 

		char ch = 'A'; // 대문자 A 를 변수 ch 에 저장
		System.out.println(ch);
		
	//ch = ''; // 오류 발생! 작은따옴표 사이에는 반드시 1글자 필수!
		ch = ' '; // 공백 가능
		
	//ch = 'ab'; // 오류 발생! 작은따옴표 사이에 2글자 이상 사용 불가!
	// => 2글자 이상의 문자는 문자열 형태로 큰따옴표 "" 를 사용해야함
		
		char ch2 = 65;
		System.out.println(ch2);
		
		char ch3 = '\u0041'; // 유니코드를 사용하는 방법
		// => '\u0000' 형식으로 u 뒤에 16진수 4자리 표기
		System.out.println(ch3);
		
		
		// char 타입은 정수형태로 관리되므로 정수 데이터처럼 연산 가능
		System.out.println('A' + 3); // 65 + 3 = 68 출력됨

 

반응형

 

4. 논리형 - true 또는 false 값을 갖는 데이터

  • boolean

정수형 숫자에 별도의 표시(접두사)가 없을 경우 **10진수(0 ~ 9)**로 취급됨

2진수(0 또는 1) 표기법 : 숫자 앞에 접두사 0b를 붙여서 표기

8진수(0 ~ 7) 표기법 : 접두사 0을 붙여서 표기

16진수(0 ~ 15, 0 ~ 9 그리고 A ~ F) 표기법 : 접두사 0x 붙여서 표기

자동으로 10진수로 변환되어 사용

 

		System.out.println(255); // 10진수
		
		System.out.println(0b11111111); // 2진수
	//System.out.println(0b1234); // 오류 발생! 2진수에서는 0 또는 1 외에는 표기 불가
		
		System.out.println(0377); // 8진수
	//System.out.println(0378); // 오류 발생! 8진수에서는 0 ~ 7 외에는 표기 불가
		
		System.out.println(0xFF); // 16진수
		System.out.println(0xff); // 16진수(대소문자 무관)
	//System.out.println(0xFG); // 오류 발생! 16진수 알파벳 A ~ F 외에는 표기 불가
		
		long l = 1_000_000_000_000L;
		System.out.println(l);

 

참조 데이터 타입Reference Type

  • String 문자열

큰 따옴표("")로 둘러싸서 표기하는 문자

1개 이상의 문자를 사용할 수 있으며, 아무것도 없는 빈 문자("" = 널스트링)도 표현 가능하다

문자열을 저장할 수 있는 데이터 타입은 String 타입

String 타입은 기본 데이터 타입이 아닌 참조 데이터타입

 

	//String 타입 변수 str 에 문자열 "Hello, World!" 저장
		String str = "Hello, World!";
		System.out.println(str);
		
		str = "A"; // 1글자 표기도 가능
		System.out.println(str);
		
		str = ""; // 큰따옴표 사이에 아무 문자도 없는 널스트링도 사용 가능
		System.out.println(str);

 

기본 데이터 타입 vs 참조 데이터 타입의 복사

객체 지향 프로그래밍을 공부하면서 배운 거

 

두 종류의 데이터 타입에 대한 값을 전달할 경우 해당 값을 복사하여 전달

기본 데이터 타입은 실제값의 복사가 일어남

=> 전달받은(복사된) 데이터(복사된 실제값)를 변경하더라도 원본 데이터에는 아무런 영향이 없다

 

참조 데이터 타입은 주소 값의 복사가 일어남

=> 전달받은 데이터(복사된 주소 값)의 데이터(실제값)를 변경하면 원본 데이터도 동일한 주소 값을 참조하므로 변경된 내용이 동일하게 적용되어 있다

즉, 동일한 위치의 주소를 공유하므로 변경 사항 공유

		int money = 100000; // 로컬변수이면서 기본형 변수
		
		System.out.println("변경 전 money = " + money);
		
		// primitiveChange() 메서드를 호출하여 int형 변수 money 의 값 전달
		primitiveChange(money); // 실제 값(100000)을 복사하여 전달
		
		// 메서드에서 전달받은 실제값을 변경하더라도
		// 원본 데이터는 아무런 영향을 받지 않는다!
		System.out.println("변경 후 money = " + money);
		
		System.out.println("===========================");
		
		// MyMoney 클래스의 인스턴스 생성
		MyMoney mm = new MyMoney();
		
		System.out.println("변경 전 mm.money = " + mm.money);
		// => 멤버변수이자 기본형 변수인 money 에 접근
		
		// primitiveChange() 메서드를 호출하여 MyMoney 인스턴스의
		// 인스턴스 변수인 기본데이터타입 money 를 파라미터로 전달
		//		System.out.println("MyMoney 인스턴스의 money = " + mm.money);
		primitiveChange(mm.money); // 실제 값(100000)을 복사하여 전달
		// => MyMoney 인스턴스 mm 의 기본데이터타입 money 변수값 전달
		// => 멤버변수이자 기본형 변수인 money 의 값을 복사하여 전달
		
		// 메서드에 전달하는 변수가 인스턴스 내의 변수라 하더라도
		// 기본 데이터타입일 경우 값을 복사하여 전달함.
		// 따라서, 실제 값을 복사하여 전달받은 메서드에서 값을 변경하더라도 
		// 원본 데이터는 아무런 영향을 받지 않는다!
		System.out.println("변경 후 mm.money = " + mm.money);
		
		System.out.println("===================================");
		
		MyMoney mm2 = new MyMoney();
		
		System.out.println("변경 전 mm2.money = " + mm2.money);
		
		// referenceChange() 메서드를 호출하여
		// MyMoney 인스턴스의 주소값(mm2)을 파라미터로 전달
		referenceChange(mm2); // 주소값을 복사하여 전달
		
		// 참조변수가 가진 주소값을 복사하여 메서드에 전달한 뒤
		// 메서드 내에서 해당 참조변수에 접근하여 인스턴스 변수값을 변경하면
		// 원본 데이터가 있는 곳의 값을 변경하게 되므로
		// 원본 데이터도 영향을 받는다!
		// => 즉, 원본 데이터와 전달받은 값이 가리키는 인스턴스가 동일하므로
		//    한 곳에서 값을 변경하면 다른 곳에서도 동일한 값을 사용하게 됨
		System.out.println("변경 후 mm2.money = " + mm2.money);
		// => 메서드 내에서 변경된 값이 그대로 적용되어 출력됨
	}
	
	public static void referenceChange(MyMoney mm) {
		// 외부로부터 전달받은 데이터(주소값)에 접근하여
		// 해당 인스턴스 내의 멤버변수 값(실제값)을 변경
		System.out.println("메서드 내의 변경 전 mm.money = " + mm.money);
		mm.money -= 9999; // 전달받은 주소값의 인스턴스 변수값 변경
		System.out.println("메서드 내의 변경 후 mm.money = " + mm.money);
	}
	
	public static void primitiveChange(int money) {
		// 외부로부터 전달받은 데이터(실제값)를 변경
		System.out.println("메서드 내의 변경 전 money = " + money);
		money -= 9999;
		System.out.println("메서드 내의 변경 후 money = " + money);
	}

 

728x90
반응형