본문 바로가기
Java

이것이 자바다 (두번째 정리) 2장 변수(2)까지

by 자연송어 2021. 3. 6.

2.1 변수 (1)

변수란

: 하나의 값을 저장할 수 있는 메모리 공간

 

변수의 선언

타입 변수이름;

int age;
double value

변수 이름을 위한 명명 규칙 (naming convention)

- 첫번째 글자는 문자이거나 '$', '_'여야 하고 숫자로 시작할 수 없다 (필수)

- 영어 대소문자가 구분된다. (필수)

- 첫문자는 영어 소문자로 시작하되 ,다른 단어가 붙을 경우 첫자를 대문자로 한다. (관례)

- 문자 수(길이)의 제한은 없다.

- 자바 예약어는 사용할 수 없다. (필수)

 

변수값 저장

int score; //변수  선언
score = 90; //값 저장, '='은 대입연산자임.
// ↓ 동일한 방법
int score = 90;

변수값 읽기

변수는 초기화가 되어야 읽을 수 있고, 초기화 되지 않는 변수는 읽을 수 없다.

 

↓잘못된 예시

int value; //변수 value 선언 (초기화 안됨.)
int result = value + 10; //변수 value 값을 읽고 10을 더한 결과값을 result에 저장 

↓올바른 예시

int value = 30; //변수 value가 30으로 초기화됨.
int result = value + 10; //변수 value 값을 읽고 10을 더한 결과값(40)을 변수 result에 저장

 

예제1

패키지 설정

-> new - package

- src에 패키지 생성 (sec01)

- 또 패키지 생성 (sec01.exam01_variable) <- 패키지와 서브패키지의 구분자는 '.' (섹션1.예제_변수)

- VariableExample 클래스 생성

 

package sec01.exam01_variable;

public class VariableExample {
	public static void main(String[] args) {
		int value = 10;
		int result = value + 10;
		System.out.println(result);
}
}
// 결과값은 20

2.1 변수 (2)

리터럴(literal)

- 소스 코드 내에서 직접 입력된 값

- 종류 : 정수 리터럴, 실수 리터럴, 문자 리터럴, 문자열 리터럴, 논리 리터럴

 

정수 리터럴

- 소수점이 없는 정수 리터럴은 10진수로 간주

package sec01.exam01_variable;

public class LiteralExample {
	public static void main(String[] args) {
		int var1 = 10; //10진수
		System.out.println(var1); //결과값은 10
		
		int var2 = 010; //8진수 출력
		System.out.println(var2); //결과값은 8
		
		int var3 = 0x10; //16진수 출력
		System.out.println(var3); //결과값은 16
	}
}

 

실수 리터럴

- 소수점이 있는 리터럴은 10진수 실수로 간주한다.

0.25, -3.14

- 대문자 E 또는 소문자 e가 있는 리터럴은 10진수 지수와 가수로 간주한다.

5E7 //5 x 10(7승)
0.12E-5 //0.12 x 10(마이너스 5승)

//가수 x 10(지수)
//2 x 10(5승) = 2E5

 

- 실수 리터럴을 저장할 수 있는 타입은 float, double이 있다.

double var1 = 0.25;
double var2 = 5E7;
		double var4 = 0.25;
		System.out.println(var4); //값은 0.25
		
		double var5 = 2E5;
		System.out.println(var5); //값은 200000.0
	}
}

문자 리터럴

- 작은 따옴표(')로 묶은 텍스트는 하나의 문자 리터럴로 간주한다.

'A', '한', '\t', '\n'

- 역슬래쉬(\)가 붙은 문자 리터럴은 이스케이프(escape) 문자라고도 하는데, 다음과 같이 특수한 용도로 사용

'\t' = 수평탭 
'\n' = 줄 바꿈 //라인피드
'\r = 리턴     // 케리지리턴
'\" = " (큰따옴표)   // 큰따옴표를 데이터로 인식 시키고 싶을 때 사용
'\'' = '(작은따옴표)
'\\' = \      //역슬래쉬 하나를 데이터로 인식 시키고 싶을 때 사용
'\u16진수' = 16진수에 해당하는 유니코드

라인피드(LF : Line Feed) => 현재 위치에서 바로 아래로 이동
캐리지리턴(CR: Carriage return) => 커서의 위치를 앞으로 이동

엔터 : 캐리지 리턴과 라인피드가 함께 결합된 것.

 

- 문자 리터럴을 저장할 수 있는 타입은 char 하나 뿐이다.

 

--------------------------------------------------------------------------------

 

1차 당황

Failed to read the project description file (.project) for 'chap02'.  
The file has been changed on disk, and it now contains invalid information.  
The project will not function properly until the description file is restored to a valid state.
Failed to read the project description file (.project) for 'chap02'.  
The file has been changed on disk, and it now contains invalid information.  
The project will not function properly until the description file is restored to a valid state.

- 유튜브가 애드블록으로 갑자기 먹통되서 해결하려고 재부팅 했는데 이클립스 실행하니까 프로젝트를 읽지 못한다고 나오는 상황

 

- 폴더 백업 해놓은 후 작업파일을 깃허브에서 pull해서 가져왔음. 근데 chap01만 가져와서 자바 프로젝트를 새로 생생하니까 거기에 chap02도 같이 있다?! 무슨일인지는 모르겠지만 오류가 뜰 것을 대비해서 커밋을 자주 해놔야겠다는 생각을 하게됨. 

- 의문점 : 프로젝트 생성 하면 디폴트 패키지에 헬로 자바 생성해놓은 파일까지 같이 생성되는데 디폴트 패키지는 왜 있고 삭제하는 방법은 무엇인지 검색해보자.

-------------------------------------------------------------------------------

		char var6 = 'A';
		System.out.println(var6); //값은 A
		
		char var7 = '한';
		System.out.println(var7); //값은 한
		
		System.out.println("\t" + "들여쓰기");  //값은	들여쓰기
		System.out.println("대한" + "\n" + "민국");   //값은 대한(줄바꿈)민국
		System.out.println("This" + '\'' + "s Java");   //값은 This's Java
		System.out.println("이것은" + '\"' + "중요" + '\"' + "합니다");   //값은 이것은 "중요"합니다.
		System.out.println("가격이" + '\\' + "300입니다.");   //값은 가격이 \300입니다.
		
		char var8 = '\u0041'; // '\u'는 지금부터 4자리 16진수로 되어있는 유니코드로 코딩하겠다는 뜻
		System.out.println(var8); //값은 A

문자열 리터럴

- 큰따옴표(")로 묶은 텍스트는 문자열 리터럴로 간주. 큰따옴표 안에는 텍스트가 없어도 문자열 리터럴로 간주. 문자열 리터럴 내부에서  이스케이프 문자 사용 가능

"대한민국"
"탭 만큼 이동 \t 합니다"
"한줄 내려 쓰기 \n 합니다"

- 문자열 리터럴을 저장할 수 있는 타입은 String 하나 뿐이다.

논리 리터럴

- true와 false는 논리 리터럴로 간주한다.

- 논리 리터럴을 저장할 수 있는 타입은 boolean 하나 뿐이다. 

 

		System.out.println("대한" + "민국");
		System.out.println("Java" + 8);
		
		String var9 = "자바";
		
		boolean var10 = true;
		boolean var11 = false;
		System.out.println(var11);

변수의 사용 범위

- 변수는 선언된 블록 내에서만 사용 가능하다.

package sec01.exam01_variable;

public class VariableScopeExample {

	public static void main(String[] args) {
		int var1; 
		
		if(true) {
			int var2;
			
			var1 = 10;
			var2 = 20;
		}
		
		var1 = 10;
		var2 = 20; //if절에 var2가 있어서 안됨

		for(int i=0; i<1; i++) {
			int var3;
			
			var1 = 10;
			var3 = 30;
		}
		var1 = 10;
		var3 = 30; //if절에 var3가 있어서 안됨.
	}
}

 

2.2 데이터 타입(1)

 

자바에서 정수 기본타입 : int

             실수 기본타입 : double

 

정수 타입

byte타입

- 값의 범위 : -128-127

- 초과 : 컴파일 에러

 

byte b = 128; (컴파일 에러)

 

실행 중에 값의 범위를 초과할 경우

- 최소값부터 다시 반복 저장

- 127을 넘으면 돌아서 -128부터 다시 시작

 

오류 해결 

1. 이클립스를 껐다가 키면 chap01, chap02 프로젝트 두개 중 하나가 비활성화되는 오류가 발생

open project has encountered a problem eclipse

- .project 파일을 찾을 수 없다고 나오는데 폴더에 가보면 파일이 멀쩡히 있었다.

- 검색해보니까 프로젝트 이름을 바꾸거나 삭제하고 다시 가져오라고 해서

- 1. 비활성화된 chap01 프로젝트 삭제 후 파일 - open projects from file system으로 chap01 가져오니까 이미 있어서 안된다고 나옴. or 아예 프로그램에 아무 반응도 나타나지 않음.

- 2. 새로운 자바 프로젝트를 같은 이름(chap01)로 가져오자 거짓말처럼 프로젝트가 복구됨.

 

 

2.2 데이터 타입(1)

byte 타입

		byte var1 = -128;
		byte var2= -30;
		byte var3 = 0;
		byte var4 = 30;
		byte var5 = 127;
		
		//byte var6 = 128; 
		
		System.out.println(var1);
	}

}
		byte var1 = 125;
		
		var1++; //증가연산자 var1을 1더 올려줌
		System.out.println(var1);
		
		var1++; 
		System.out.println(var1);
		
		var1++; 
		System.out.println(var1); //127을 넘어가면 값이 -128로 넘어감
	}

}
		byte var1 = 125;
		int var2 = 125;
		
		for(int i=0; i<5; i++) {
			var1++;
			var2++;
			System.out.println("var1:" + var1 + "\t" + "var2:" + var2);
		}
		
	}

}
/* 값은 var1:127	var2:127
var1:-128	var2:128
var1:-127	var2:129
var1:-126	var2:130 */

for문이 반복되면서 음수로 바뀌는 부분은 쓰레기 변수(GarbageValue)

쓰레기 변수를 예방하기 위해 int(충분히 큰 타입) 사용 권장.

 

char 타입

- 2byte 부호없는 정수값 저장
- 한 문자를 유니코드로 저장

- 하나의 문자 리터럴은 작은 따옴표(')로 감싸야 한다.

- 직접 유니코드 정수 값을 저장할 수도 있다.

char var1 = "A', char c = 65;, char c = '\u0041'; // 셋다 동일

- 유니코드를 알고 싶을 경우'

char c = 'A';
int uniCode = c

[참고]

1) 문자와 문자열은 다르다.

 - 문자열은 큰따옴표로 리터럴을 작성한다.

 - String 타입에 저장한다.

 - String name = "홍길동";

2) 빈(empty) 문자 처리

 char c = '';//컴파일 에러 (빈문자에 대한 유니코드 x)

char c = ' '; //공백(유니코드:32) 가능 (스페이스바)

String str = ""; //가능 (스페이스바 안하고 큰따옴표를 붙여서 저장가능)

 

		char c1 = 'A';
		char c2 = 65;
		char c3 = '\u0041';
		
		char c4 = '가';
		char c5 = 44032;
		char c6 = '\uac00';
		
		int uniCode = c1;
		
		System.out.println(c1);
		System.out.println(c2);
		System.out.println(c3);
		
		System.out.println(c4);
		System.out.println(c5);
		System.out.println(c6);
		
		System.out.println(uniCode);
		
	}

}
/* 값은 
A
A
가
가
가
65 */