본문 바로가기
Language/Java

[Java] Data, 변수, 데이터 타입(DataType)

by 키튼햄 2023. 3. 30.
목차
1. 데이터 저장단위 & 데이터 표현방법
2. 변수
2-1. 리터럴
2-2. 변수
3. 데이터 타입(DataType)
-정수형, 실수형

 

1. 데이터 저장 단위와 표현방법

1-1. 데이터 저장 단위

1. 비트 Bit : 0 or 1. 가장 최소의 저장단위
2. 바이트 Byte : 8bit

  • 1byte = character(영문자)
  • 프로그램을 사용할 때 기본단위
  • 숫자->영문자 변환 (ASCⅡ코드 사용해서)

3. 1KB = 1024byte

4. 1MB = 1024KByte

5. 1GB = 1024MByte

6. 1TB = 1024GByte

 

*bps(bit per second) : 1초동안 전달할수있는 비트의 수 ex) 1Gbps

 

1-2. 데이터 표현 방법

8비트 중 가장 앞에 있는 Bit = " sign bit " 라고 함. (0 : 양수, 1 : 음수)

맨 앞을 뺀 나머지 7비트 = " data bit " 라고 함.

Q. 정수 50 → 1byte(8bit)로 표현해보기

A.
50 → 0010010(2)
1의 보수화 → 11001101(2)
2의 보수화 → 11001110(2)

 

 

 

 

 

2. 변수 Variable

2-1. 리터럴

: 프로그램에서 을 표현하는 방식

 

정수형(IntegerType) 리터럴 : 소수점이 없는 숫자값

=>java에서 정수형 리터럴은 기본적으로 4byte로 표현.

 

2-2. 변수 (Variable)

: 리터럴(값)을 저장하기 위해 메모리에 부여된 이름.

 

- 변수는 만들어서 사용.
- 변수명 : 리터럴을 저장해 메모리를 구분하기 위해 사용되는 식별자 (Identifier)
- 변수 선언 : 메모리에 변수 생성
- 형식 : 자료형 변수명;

 

[식별자 작성규칙]
1. 영문자, 숫자, 특수문자( _ or $ 사용가능)를 조합하여 작성 
- java에서는 한글을 식별자로 사용가능(자바는 아스키코드가 아니라 유니코드로 인식하기 때문. but 권장은X)
2. 숫자시작X
3. 영문자 대소문자 구분하여 작성
4. 길이 제한X
5. 기존 사용단어(키워드(예약어), 이미 사용한 식별자)는 식별자 재선언 불가.

 

[Java에서 사용되는 식별자 작성 방법]

- 표기법 : 영문자의 소문자를 기본으로 식별자 작성
1. 파스칼 표기법(PascalCase) - 조합된 단어의 첫문자를 대문자로 작성 (클래스명, 인터페이스명, 나열형 등)
2. 카멜 표기법(CamelCase) - 첫번째 단어를 제외한 나머지 단어의 첫문자를 대문자로 표현하여 작성 (변수명, 메소드명)
3. 스네이크 표기법(SnakeCase) - 조합된 단어를 언더바(_)로 구분하여 작성 (상수constant :상수는 무조건 대문자로작성)

 

[정수값(Int)을 저장하기 위한 변수 선언(생성)]
1) 대입연산자(=)를 이용하여 값을 변수에 저장.

     *대입연산자(=)는 같다가 아님. 같다는 (==) 이다.

2) 변수는 왼쪽. 값은 오른쪽에 작성해야만 한다. (안 지키면 error) 

3) 읽을 때는 오른쪽에서 왼쪽으로. ["대입연산자, 단항연산자" 2개만 해당. 나머지는 왼->오 순서로 읽음.]

package basic;
public class VariableApp {
	public static void main(String[] args) {
		int su; 	// 정수값을 저장하기 위한 변수 선언(생성)
		su = 100; 	// 대입연산자(=)를 이용하여 값을 변수에 저장. 변수는 왼쪽. 값은 오른쪽에 입력.
		System.out.print("초기값 = ");
		System.out.println(su); 		//변수에 저장된 값을 화면에 출력하겠다=> ()안이 공백이기 때문에.
        
        //int su:		//동일한 이름의 변수를 재선언 할 경우 에러 발생
		su = 200; 		//기존에 변수 su에 저장되어 있던 100은 삭제됨. 새로운 값200 저장. 
            			//새로운 변수가 선언되면 그 전에 저장되어있던 값은 삭제되고 새로운 값이 변수에 대입됨.
		System.out.print("변경값 = ");
		System.out.println(su);
	}
}
        
        
<출력 결과>
초기값 = 100
변경값 = 200

 

 

*피연산자가 하나라도 문자열이면(문자열과 값 결합) 문자열 -> 결과값 : 문자열

  • 프로그램을 읽을 때 왼쪽부터 오른쪽으로 읽기 때문에 맨 앞이 문자열이면 문자열로 인식한 이후로는 숫자가 와도 전부 문자열로 인식함.
  • 앞에 문자열 없이 숫자가 오면 숫자자체로 인식하기 때문에 연산자가 있으면 연산을 진행. 그러나 그 이후에 문자열이 또 온다면 그 이후로는 숫자가 와도 문자열로 인식한다.
System.out.println("num = " + num);
	System.out.println("올해는 "+2+0+2+3+"년입니다.");		//올해는 2023년 입니다.
	System.out.println(2+0+2+3+"년은 토끼띠해입니다.");		
		//7년은 토끼띠해입니다. =>실행오류.(잘못된 결과 발생) - 앞에 문자열 없이 숫자만 있기 때문에 더해짐.
		//프로그램을 읽을 때 왼쪽부터 오른쪽으로 읽기 때문에 맨 앞이 문자열이면 문자열로 인식한 이후로는 숫자가 와도 전부 문자열로 인식함.
		//앞에 문자열 없이 숫자가 오면 숫자자체로 인식하기 때문에 연산자가 있으면 연산을 진행. 그러나 그 이후에 문자열이 또 온다면 그 이후로는 숫자가 와도 문자열로 인식한다.
	System.out.println(""+2+0+2+3+"년은 토끼띠해입니다.");		
		//디버깅 완료. ("" : NullString 비어있는 문자열- 추가) => 2023년은 토끼띠해입니다.
        
        
<출력 결과>
올해는 2023년 입니다.
7년은 토끼띠해입니다.
2023년은 토끼띠해입니다.

 

* 동일한 자료형의 변수는, 기호를 사용하여 나열선언 가능

int num1 = 100, num2 = 200;
		System.out.println("연산결과 = "+num1+num2); // 잘못된 결과 발생. 더하기가 안됨. 문자열로 인식.
		System.out.println("연산결과 = "+(num1+num2)); // 디버깅. 원하던 결과. 300. 계산 우선순서 : () → *,/ → +,-
		System.out.println("연산결과 = "+(num1*num2));
		System.out.println("연산결과 = "+num1*num2);
        
        
<출력 결과>
error
300
20000
20000

 

* other 예시

int kor = 88, eng = 90;
int tot = kor + eng;		
	//연산 결과를 변수(tot)에 저장. 국어점수+영어점수(88+90이지만 점수가 바뀌면 변수에 들어가는 값도 바뀔 수 있도록)
	// 값은 무조건 변수에다가 저장해서 사용하기~
System.out.println("점수 합계 = " + tot);



<출력 결과>
점수 합계 = 178

 

* 변수의 값이 저장되어 있지 않은 상태에서 변수를 사용할 경우 에러 발생

int count;		//변수 값 저장 안 된 상태
System.out.println("count = "+count);	//에러0
		
int count = 10;
System.out.println("count = "+count);	//에러X
		
int count = 10.0;
System.out.println("count = "+count);	//에러0. count값이 정수가 아닌 실수값이라서.


<출력 결과>
error
count = 10
error

 

 

 

 

 

3. 데이터 타입

- 자료형, 실수형, +(추가)

 

<자료형(DataType)> 

: 값을 표현하기 위한 키워드 또는 특정대상을 표현하기 위한 식별자
=> 값이나 특정 대상을 저장하기 위한 변수를 선언하기 위해 사용
- 변수에 저장될 리터럴의 형태(원시형, 참조형)

 

public class DataTypeApp {
	public static void main(String[] args) {
		System.out.println("<<정수형(IntegerType)>>");
		System.out.println("정수형(10진수 100) = "+100);	//10진수 정수형 리터럴 출력
		System.out.println("정수형(8진수 100) = "+0100);	
			//10진수 앞에 0 붙이면 => 8진수 정수형 리터럴 출력
			//println() 메소드는 정수값을 무조건 10진수로 변환하여 출력하기 때문에 진수변경시 0 or 0x 를 붙여야함.
		System.out.println("정수형(16진수 100) = "+0x100);
			//10진수 앞에 0x 붙이면 => 16진수 저수형 리터럴 출력
		
		System.out.println("정수형(10진수 100) = "+100L);	
			//숫자값L - 정수형 리터럴(8Byte - LongType)
		
		System.out.println("정수형(10진수 100) = "+2147483647);
			// 4Byte로 표현 가능한 정수값 : -2147483648~2147483647
			// 4Byte로 표현 불가능한 정수값을 사용할 경우 에러 발생
			// System.out.println("정수형(10진수 100) = "+2147483648);	//에러발생.
			// 따라서 이럴때는 Long(L)type을 사용 - 정수값 뒤에 L(소문자l도 가능)을 붙여 8byte의 LongType으로 작성하여 사용한다.
		System.out.println("정수형(10진수 100) = "+2147483648L);
        }
}



<출력 결과>
<<정수형(IntegerType)>>
정수형(10진수 100) = 100
정수형(8진수 100) = 64
정수형(16진수 100) = 256
정수형(10진수 100L) = 100
정수형(8진수 100) = 2147483647
정수형(8진수 100) = 2147483648

 

* 정수값을 표현하기 위한 자료형(키워드) : byte (1Byte), short (2Byte), int (4Byte), long (8Byte)

byte (1Byte) : 네트워크 프로그램 만들 때 사용
short : C언어 때문에 만들어졌지만 거의 사용X

public class DataTypeApp {
	public static void main(String[] args) {
		byte a1 = 127;			//1Byte : -128~127
		short a2 = 32767;		//2Byte : -32768~32767
		int a3 = 2147483647;	//4Byte : -2147483648~2147483647
		long a4 = 2147483648L;
		
		System.out.println("a1 = "+a1);
		System.out.println("a2 = "+a2);
		System.out.println("a3 = "+a3);
		System.out.println("a4 = "+a4);
		
		//int a5 = 100L;		//값에 대한 손실이 발생할 수 있으므로(가능성임) => 에러발생. error
        long a6 = 100;			//숫자에 비해 그릇이 크므로 에러발생X(공간이 남아도는 것이라 효율은 떨어짐. 가독성떨어짐)
		System.out.println("a6= "+a6);
    }
}


<출력 결과>
a1 = 127
a2 = 32767
a3 = 2147483647
a4 = 2147483648
a6 = 100

 

 

<실수형(DoubleType) 리터럴>

: 소수점이 있는 숫자값

=> Java에서 실수형 리터럴은 기본적으로 8Byte(Double)로 표현 >> 부동 소수점 형식으로 숫자값 표현

 

public class DataTypeApp {
	public static void main(String[] args) {
		System.out.println("<<실수형(DoubleType)>>");
		System.out.println("실수값(4Byte) = "+12.3F);	//실수값F >> 4Byte 실수형 리터럴(FloatType)
		System.out.println("실수값(8Byte) = "+12.3);	//실수값 >> 8Byte 실수형 리터럴(DoubleType)
			//println() 메소드는 실수값이 아주 작거나 큰 경우 지수형태로 변환하여 출력
		System.out.println("실수값(8Byte) = "+0.000000000123);
			//실수값을 지수형태로 표현하여 사용 가능 
		System.out.println("실수값(8Byte) = "+1.23E+10);
    }
    
}
        

<출력 결과>
<<실수형(DoubleType)>>
실수값(4Byte) = 12.3
실수값(8Byte) = 12.3
실수값(8Byte) = 1.23E-10		//1.23*10의-10승
실수값(8Byte) = 1.23E10

 

* 실수값을 표현하기 위한 자료형 - float(4Byte), double(8Byte)

public class DataTypeApp {
	public static void main(String[] args) {
        float b1=1.23456789F;//가수부를 표현하기 위한 크기(정밀도) : 7자리
		double b2=1.23456789;//가수부를 표현하기 위한 크기(정밀도) : 15자리
		
		System.out.println("b1 = "+b1);
		System.out.println("b2 = "+b2);
    }
    
}


<출력 결과>
b1 = 1.2345679
b2 = 1.23456789

 

 

 

 

 

 

 

 

복습 후 느낀점

변수까지는 천천히 나가다가 마지막에 데이터타입에서 빠르게 진행되었다. 훅훅 지나가는 바람에 놓쳤지만 옆자리분과 강사님의 친절한 대답덕분에 이해할 수 있었다.

중간중간 비는 완벽하지 않은 복습이지만, 앞으로 공부하면서 더 정확하고 자세한 지식을 가질 수 있도록 노력해야할 것 같다.

정확하지 않은 정보는 정말,,, 쓸모도 없고 바보로 보이게 만드는... 절레절레다.

그리고 깃이랑 깃허브는 따로 공부 많이 해야 할 것 같았다. 와 진짜 우주세계다. 이리저리 제대로 사용하려면 제대로 공부해야 할 것 같은 느낌... 걍 소스 공유랑 저장만 할 거 아니니까.

 

양 옆으로 한 분은 전공자고, 한 분은 예습을 많이 해 온 상태라 혼자서도 뚝딱뚝딱 만드시는데 괜히 의기소침해지지만 오히려 나도 놀지만 말고 공부해야겠다는 생각이 많이 들었다. 따라가려면 힘들 것 같다ㅠㅠ

 

이번주는 무난해도 다음주부터는 좀 힘들겠다는 생각이 많이 들었다.

아무래도 이번 주말은 꼼짝없이 틀어박혀서 공부해야할 것 같다.

일단 자바의 정석 보면서 이번 주에 나간 분량 복습도 하면서 복습 노트 빈 부분과 부실한 부분 채워넣고, 나갈 부분 미리 예습 해 놓아야 겠다.

 

지하철 타고 다니는 시간이 많이 비던데 그 동안에 뭘 듣던가 해야할 것 같다.

팟캐스트나 영어듣기 연습해야할 듯.

 

열심히 공부하자!! 하다보면 실력은 는다!!!