혼공자2.변수와 타입, 자동&강제타입변환, 입출력, System.in.read단점 및 해결책
나는나는용2023. 2. 20. 18:48
728x90
2. 변수와 타입
2-1. 변수
값을 저장할 수 있는 메모리의 특정 번지에 붙이는 이름. 변수 선언 ➡ 변수에 값 지정 ➡ 메모리에 값 저장 두가지 값을 동시에 저장 불가.
변수 선언
'저장할 데이터 타입', '변수 이름' 결정. 콤마를 이용하여 한번에 선언 가능(ex. int x,y;) 타입 = 자료형 정수형: int 실수형: double 변수 이름 명명 규칙 • 첫 글자는 '문자','$','_' 중 하나. • 영어 대소문자 구분. • 첫 문자는 영어 소문자로 시작하나, 다른 단어가 붙을 경우 첫 문자를 대문자로.(ex. maxSpeed) •문자 수(길이) 제한 없음. •자바 예약어는 사용 불가.
+)예약어 이미 해당 프로그래밍 언어에서 의미를 갖고 사용되고 있는 단어.
값 저장
대입연산자 =을 사용하여 값 저장. 변수에 값이 저장되지 않으면 변수가 생성(!= 선언)되지 않음. 변수 초기화: 변수에 최초로 값이 저장될 때 변수가 생성되는 것. 초기값: 변수 초기화를 할 때 저장한 값.
아래의 예제에서는 초기화되지 않은 변수 value를 사용하여 컴파일 에러 발생
변수 사용
출력문이나 연산식 내부에서 변수에 저장된 값을 출력하거나 연산할 때 사용.
변수는 또 다른 변수에 대입하여 값을 복사할 수 있음. 아래 예제는 이 특징을 이용하여 두 값을 교환
변수 사용 범위
변수는 중괄호 블록 내에서 선언되고, 선언된 위치로부터 자신이 속한 블록 내부에서만 사용 가능. 로컬 변수: 메소드 블록 내에서 선언/사용되고, 메소드 실행 종료시 메모리에서 자동 삭제됨.
아래 예제의 v2는 v2가 선언된 if블록 내부에서만 사용 가능하므로 에러 발생
변수 선언 주의 사항
변수가 어떤 범위에서 사용될 것인지 생각 ➡ 선언 위치 결정 메소드 블록 전체에서 사용하고 싶다면 메소드 블록 첫머리에 선언. 특정 블록 내부에서만 사용된다면 해당 블록 내에 선언.
이스케이프 문자 \ -문자열 식별기호로 쓰이는 문자를 그대로 사용하고 싶을 경우 사용함 -출력 제어용으로도 사용 --(ex. 탭: \t, 줄바꿈: \n, 캐리지리턴:\r, "출력:\", '출력: \', \출력: \\, 16진수 유니코드에 해당하는 문자 출력: \u16진수)
+) 정수 연산식에서 모든 변수가 int타입으로 변환되는 것은 아님. 두 피연산자 중 허용 범위가 큰 타입으로 변환됨.
ex) long result = long 연산자 (byte,char,short,int)
package sec03.exam04;
publicclassLongOperationExample{
publicstaticvoidmain(String[] args){
byte value1=10;
int value2=100;
long value3=1000L;
long result=value1+value2+value3;
System.out.println(result);
}
}
실행결과
실수 연산에서의 자동 타입 변환
실수 타입 변수가 산술 연산식에서 피연산자로 사용될 때, -두 피연산자가 동일 타입: 해당 타입으로 연산 -하나가 double: 다른 피연산자도 double로 자동 타입 변환되어 연산 결과는 double이 됨. -int와 double: int가 double로 자동 타입 변환되어 연산. --꼭 int로 연산해야할 시: double을 int로 강제 변환하여 연산. +) 자바에서 정수 연산의 결과는 정수이므로, 실수형의 결과를 얻고 싶다면 피연산자들 중 최소한 하나를 실수형으로 강제 형변환을 해야함.
다음은 연산식에서의 자동 타입 변환을 다룬 예제
package sec03.exam05;
publicclassOperationsPromotionExample {
publicstaticvoidmain(String[] args) {
//byte들의 연산결과 int로byte byteValue1=10;
byte byteValue2=20;
//byte byteValue3=byteValue1+byteValue2;int intValue1=byteValue1+byteValue2;
System.out.println(intValue1);
//char들의 연산결과 int로char charValue1='A';
char charValue2=1;
//char charValue3=charValue1+charValue2;int intValue2=charValue1+charValue2;
System.out.println("유니코드"+intValue2);
System.out.println("출력문자"+(char)intValue2);
//정수들의 나눗셈 결과는 정수int intValue3=10;
int intValue4=intValue3/4;
System.out.println(intValue4);
//정수와 실수의 나눗셈 결과는 실수int intValue5=10;
//int intValue6=10/4.0; //정수10을 실수4.0으로 나눈 결과는 실수이므로double doubleValue=intValue5/4.0;
System.out.println(doubleValue);
//정수 하나를 실수로 타입변환하여 나머지 정수와 연산 결과 실수int x=1;
int y=2;
double result=(double)x/y;
System.out.println(result);
double result2=(double)(x/y); // (x/y)가 먼저 연산된 뒤 실수화하여 0.0 출력
System.out.println(result2);
}
}
실행결과
+연산에서의 문자열 자동 타입 변환
'+'의 역할
숫자+숫자: ➡ 덧셈 연산 ➡ 숫자
"문자열"+숫자: ➡ "문자열"+"숫자" ➡ 결합 연산 ➡"문자열숫자"
숫자+"문자열": ➡ "숫자"+"문자열" ➡ 결합 연산 ➡"숫자문자열"
+연산자가 연이어 나올 때, 앞에서부터 순차적으로 +연산 수행. 먼저 수행된 연산이 덧셈 연산: 덧셈 결과 갖고, 다음 +연산 수행. 먼저 수행된 연산이 결합 연산: 이후 +연산은 모두 결합 연산. +) 우선 계산하고 싶은 부분은 괄호()로 감싸준다.
String str = "10";
String str1 = "12.345";
String str2 = "true";
byte value = Byte.parseByte(str); //byte
short value = Short.parseShort(str); //shortint value = Integer.parseInt(str); //int
long value = Long.parseLong(str); //longfloat value = Float.parseFloat(str1); //floatdouble value = Double.parseDouble(str1); //doubleboolean value = Boolean.parseBoolean(str2); //boolean///*숫자가 아닌 알파벳,특수문자,한글 등을 포함한 문자열
숫자 형식 예외 (NumberFormatException) 발생
String str3 = "1a";
int value = Integer.parseInt(str3);
*/// 간단하게 기본 타입의 값을 문자열로 변경하는 경우 메소드 이용String str=String.valueOf(3); // "3"