본문 바로가기
뒷북 정리 (국비 교육)/java

[Java] step02. Data type

by 규글 2022. 4. 11.

step02. Data type

 어떤 method 안에서 만들어진 변수를 local variable(지역 변수)이라고 한다. 이전의 javascript에서의 function 안에서 선언하는 것과 같은 것이다. 그때의 경우 function 밖에서 선언한 변수를 global variable(전역 변수)이라고 했으나, java에서는 method 밖에 선언하는 변수를 field variable이라고 한다. 변수는 숫자로 시작하면 안되고, 예약 변수와 같은 것을 이용해도 안된다.

 javascript에서는 number type이든, string type이든, object type이든 상관없이 let 하나만으로도 변수를 선언할 수 있었다. 하지만 java에서는 다르다. 당장 number type만 봐도 여러 형태로 구분한다. 이들의 type을 지정해주어야하고 바꿀 수 없다. 이 data type은 primitive(기본) data type  reference(참조) data type 으로 나뉜다.

 primitive data type에는 숫자형 6종류(byte, short, int, long), 논리형(boolean), 문자형(char)의 총 8개가 끝이고, 나머지는 모두 reference data type이고 대표적으로 string이 있다. 이 reference data type 의 개수는 무한이다. 

 

- 01 : 숫자형1

/*
 *  [ Java 기본 데이터 type ]
 *  
 *  1. 숫자형
 *  
 *  정수형 : byte, short, int, long
 *  
 *  - byte 변수명;  // -128 ~ 127 (2**7 = 128)
 *  - short 변수명;  // -32768 ~ 32767 (2**15 = 32768)
 *  - int  변수명; // -2,147,483,648 ~ 2,147,483,647 (2**31 = 2147483648 ~ 2E+09)
 *  - long 변수명; // -9223372036854775808 ~ 9,223,372,036,854,775,807 (2**63 ~ 9E+18)
 *  
 *  실수형 : float, double
 *  
 *  - float 변수명; // 1.40129846432481707e-45 ~ 3.40282346638528860e+38
 *  - double 변수명; //4.94065645841246544e-324d ~ 1.79769313486231570e+308d
 */

 

 number type은 정수형과 실수형으로 나뉘고, 위와 같이 각각 여러가지로 또 나뉘는데 각각 범위가 다르기 때문에 type들을 모두 외워야 한다. 정수형에는 byte, short, int, long, 실수형에는 float, double이 있다. 그 중에서도 가장 많이 쓰는 것은 int라고 한다. 선언한 type에 따라 사용할 수 있는 숫자의 범위가 다른 이유는 효율적으로 메모리를 사용하기 위함이라고 한다.

 

		//정수형 변수 선언하고 값 대입하기
		byte iByte=10;
		short iShort=10;
		int iInt=10;
		long iLong=10;
		/*
		 *  int type 변수에 byte type 변수에 담긴 내용을 대입한다면?
		 *  - 표현 가능 범위가 좁은 변수에 담긴 값을 표현 가능 범위가 더 넓은 변수에 
		 *    대입 하는것은 문제가 없다
		 *  - 따라서 에러를 발생 시키지 않는다. 
		 */
		int tmp=iByte;
		
		/*
		 *  표현 가능한 범위가 더 넓은 변수에 담긴 내용을 대입 하려면 
		 *  명시적으로 casting 을 해야 한다. 
		 */
		byte tmp2=(byte)iInt; // (byte) 는 byte type  으로 변환하는 casting 연산자

 예를 들어 작은 숫자를 선언하는데, 범위가 넓은 type으로 선언한 변수에 넣는다면 효과적이지 않다고 생각할 수 있다. 그릇의 크기에 비해 음식의 양이 터무니없이 부족한 것에 비유할 수 있다. 그래도 이 경우는 문제가 발생하지는 않는다.(byte로 선언할 것을 int에)

 반대로 int로 선언할 것을 byte에 선언한다면 어떻게 될까? 이 경우는 그릇의 크기에 비해 음식의 양이 터무니없이 많아서 넘치게 될 것이다. 문제가 발생한다고 했다. 때문에 명시적으로 casting 해야한다고 한다. 이때 사용하는 것을 casting operator(연산자) 라고 한다.

 

		//실수형 변수 선언하고 값 대입하기
		float num1=10.1f;
		double num2=10.2d;
		double num3=10.3; // d, f 를 붙이지 않으면 double type 으로 간주 된다.
		
		// float type 에 있는 값을  double type 에 담기 
		double tmp3=num1;
		
		// casting 연산자가 필요하다. 
		float tmp4=(float)num2;

 실수형은 조금 다른데 double type이면 숫자의 뒤에 d, float type이면 f를 붙인다. 만약에 붙이지 않는다면 암묵적으로 d가 생략된 것으로 본다. 하지만 float type이라면 f를 명시적으로 꼭 붙여야한다.

 

이런 식으로 data type을 입력하고 그에 맞는 값을 대입하여 변수를 선언하게 된다.

 

- 02 : 숫자형2

		//국어 점수
		int kor=95;
		//영어점수
		int eng=100;
		
		//국어 점수와 영어 점수의 평균을 구해서 변수에 담고 그 결과를 콘솔창에 출력해 보세요.
		
		// int type  과  double type 을 연산하면 결과는 double type 이다. 
		double ave=(kor+eng)/2.0;

 javascript에서와는 달리 java에서는 number type끼리의 계산 시, 어느 하나는 실수여야 결과 값이 실수이다. 예시의 2.0은 사실은 뒤에 d가 생략된 2.0d이다.

 

- 03 : 논리형

/*
 *  [ Java 기본 데이터 type ]
 *  
 *  2. 논리형 (boolean)
 *  
 *  - true, false 두가지 값중 하나이다.
 *  - true, false 를 직접 쓰거나 비교연산 혹은 논리 연산의 결과로 얻어낼수 있다. 
 *  - 참과 거짓을 나타내는 데이터 type 
 */

 

		// 논리형 변수 선언과 동시에 값 대입하기
		boolean isRun=true;
		if(isRun) {
			System.out.println("달려요");
		}
		
		// 비교 연산의 결과로 얻어진 boolean 값 담기
		boolean isGreater=10>1;
		// 논리 연산의 결과로 얻어진 boolean 값 담기
		boolean result=true||false;
		
		// 한번 선언한 변수는 다시 선언 할수 없다.
		// boolean result=false;
		result=false; //변수에 다른 값을 대입 할수 있다(동일한 type 인 경우)
		// 다른 type 값은 변수에 담을 수 없다.
		// result=10;

 변수에 true나 false의 값을 대입하기 위해서는 boolean 이라고 type을 선언해주어야 한다. javascript에서와 마찬가지로 비교 연산의 결과를 변수에 담는 것이 가능하고, 논리 연산의 결과를 담는 것도 가능하다.

 한 번 boolean으로 선언한 변수에는 동일한 type의 다른 value를 대입할 수는 있지만 다시 선언하는 것은 불가능하며, 다른 type의 값을 다시 대입하는 것도 불가능하다.

 

- 04 : 문자형1

/*
 *  [ Java 기본 데이터 type ]
 *  
 *  3. 문자형 (char)
 *  
 *  - 65536 가지의 코드값을 가질수 있다
 *  - 전 세계에서 사용하는 모든 문자 1글자를 표현할수 있다.
 *  - single quotation 을 이용해서 만든다.  
 */

 

		//char 형 변수 선언과 동시에 값 대입하기 
		char ch1='a';
		char ch2='b';
		char ch3='c';
		char ch4='가';
		char ch5='나';
		char ch6='다';
		char ch7='@';
		
		//정수값에 1:1 대응되는 char 값이 존재한다. 
		int code1=ch1;
		int code2=ch2;
		int code3=ch3;
		int code4=ch4;
		int code5=ch5;
		int code6=ch6;
		int test='a';
		char result1=100;
		char result2=101;
		char result3=102;

 문자형인 char type은 딱 한 글자를 표현한다. 총 65536가지를 표현할 수 있다. 글자를 작은 따옴표(single quotation)를 사용해서 감싸 만든다. 이 char type에 대입되는 문자는 어떤 특정 정수 값과 1:1로 대응되기 때문에 int에 대입해서 출력해보면 a는 97, d는 100인 것을 알 수 있다.

 

- 05

/*
 *  [ Java 참조 데이터 type ]
 *  
 *  String type
 *  
 *  - 문자열을 다룰때 사용하는 데이터 type 이다.
 */

 

		// "김구라" 정보를 담고 있는 참조값(id값) 이 변수에 들어간다. 
		String name="김구라";
		String tmp=name; // 참조값 복사해 주기 
		name="원숭이"; // 새로운 참조값으로 대입하기
		name=null; // name 변수를 empty(빈) 상태로 만들기

 String은 reference data type의 대표적인 예시이다. char type이 한 글자라면, String type은 한 자리 이상을 담을 수 있다. 다른 변수에 String type을 대입하는 것은 값 자체를 대입하는 것이 아니라 참조값을 복사하는 것이다. javascript에서의 문자열과 같다. 또한 새로운 값을 대입하면 참조값 또한 바뀌게 된다. null은 빈 공간이다.

 그런데 primitive data type은 8종류인데, 왜 reference data type의 개수는 무한일까? 이것은 javascript에서 string type을 공부했을 때의 사물함 key 값 예시를 기억하면 좋다. 두 data type의 차이는 debugging 할 때 볼 수 있다. 다음을 보자.

 

 이미지가 좀 크긴 한데 빨간색으로 표시된 곳을 보자. 다른 변수들과는 다르게 'id' 라고 표기되어 있다. 이것이 javascript에서 예시를 든 사물함의 key 이다. 하지만 다른 type에 id가 없이 표시된 변수들은 값 자체가 실제로 들어있는 것이다.

 

- 06 ~ 07

		// int type 지역변수를 선언만 하면 만들어 지지 않는다.
		int num1;
		// String type 지역변수를 선언만 하면 만들어 지지 않는다.
		String name1;
		
		// 아직 만들어 지지 않았기 때문에 num1  은 참조 불가
		// int result=10+num1;
		
		// 아직 만들어 지지 않았기 때문에 name1 은 참조 불가 
		// System.out.println("name1:"+name1);
		// 지역변수를 만들고 값을 나중에 넣고 싶으면 초기값을 대입 하는것이 좋다.
		int num1=0;
		// 참조 데이터 type 이 들어갈 빈 변수는 null 을 대입 해서 만든다. 
		String name1=null;

 local variable은 선언만 하면 만들어지지도 않는다. 단지 만들 준비를 하다 만 것이다. 그래서 만들어만 두고 나중에 값을 넣어 사용하고 싶다면 선언하면서 값을 대입하면 된다. 예를 들어 number type이라면 0, boolean type이라면 false, String과 같은 reference type이라면 null을 대입한다. javascript에서 undefined로 만들어지는 것과는 조금 다르다.

 

- 08

		// String type 의 메소드 사용해 보기 
		String str="abcde12345";
		// 문자열의 길이
		int size=str.length();
		// 5 번째 인덱스의 문자1개(char)
		char ch=str.charAt(5);
		// 소문자를 모두 대문자로 변환한 문자열 얻어내기 
		String result=str.toUpperCase();
		// reference data type local variable
		String d = "xxx";
		int result = d.length();

 reference type data에 '.' 을 찍으면 뭔가 기능이 있는데, 이것이 큰 특징이다. 다음 이미지로 이어서 설명하겠다.

 

 객체는 field(저장소)와 method(기능)로 구성된다. 그림으로 예시를 들면 String type 객체 d는 20번 key 값으로 heap 영역에 만들어진다. 그리고 이 객체는 field와 method로 구성되어있다. 객체는 변수에 '.' 을 찍어 참조할 수 있는데, 이때 field는 괄호를 동반하지 않고, method는 괄호를 동반한다. (물론 오른쪽 이미지와 같이 String의 경우는 따로 field는 존재하지 않고 method로만 구성되어 있긴 하다.)

 이때 쓰는 method라는 단어는 main method의 method와 같지만, main이 좀 특별한 것이라고 했다. main method는 class의 method라고 했다.

 

 다시 돌아와서 보이는 d.length(), 그리고 str.length()와 같은 자리는 어떤 값으로 바뀔 수 있다. 이런 기능들은 어떤 type의 값으로 return(반환)되는지, 괄호 안에는 어떤 index를 필요로 하는지 잘 인지하고 사용해야 한다. 때문에 괄호 안에 넣어주는 값도 정확한 type으로, 변수로 받을 때도 해당 field나 method를 통해 return 되는 정확한 type으로 받아야 한다. 오른쪽 이미지의 '- String' 이나 '- Object' 등의 의미는 나중에 배울 예정이라고 했다.

'뒷북 정리 (국비 교육) > java' 카테고리의 다른 글

[Java] step05. Method  (0) 2022.04.13
[Java] step04. Class  (0) 2022.04.13
[Java] step03. Operator  (0) 2022.04.11
[Java] step01. Hello  (0) 2022.04.05
Java 설치 및 eclipse 설정  (0) 2022.04.05

댓글