변수 선언
컴퓨터 메모리(RAM)는 수많은 번지들로 구성된 데이터 저장 공간
프로그램은 데이터를 메모리에 저장하고 읽는 작업을 빈번히 수행
이 때 데이터를 어디에, 어떤 방식으로 저장할지 정해져 있지 않다면 메모리 관리가 어려워짐.
프로그래밍 언어는 이 문제를 해결하기 위해 변수를 사용
- 변수(variable)
- 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름
- 변수를 통해 프로그램은 메모리 번지에 값을 저장하고 읽을 수 있음
- 변수 선언
- 어떤 타입의 데이터를 저장할 것인지, 변수 이름이 무엇인지를 결정하는 것
- 변수 이름은 첫 번재 글자가 문자여야함, 중간 부터는 문자,숫자,$,_를 포함할 수 있음
- 첫 문자를 소문자로 시작하되 카멜스타일로 작성하는 것이 관례
[타입][변수 이름];
int age; //정수(int) 값을 저장할 수 있는 age 변수 선언
double value;//실수(double) 값을 저장할 수 있는 value 변수 선언
더보기
로컬(지역) 변수 타입 추론 기능
- 자바 10부터 로컬(지역)변수를 위한 타입추론(type inference for local variables) 기능이 추가됨
- 변수 선언 시 구체적인 타입 대신 예약된 타입(reserved type)인 var 를 사용할 수 있음
캐멀(camel) 스타일
- 코드를 작성할 때 여러 단어를 혼합하여 명명하는 경우, 대소문자가 섞여 있도록 작성하는 스타일
- 자바 소스 파일명과 변수명을 작성할때 관례적으로 사용
- 자바 소스 파일명(클래스명)은 대문자로 시작하는 것이 관례
- Week.java
- MemberGrade.java
- ProductKind.java
- 변수명은 소문자로 시작하는 것이 관례
- score
- mathScore
- sportsCar
- 자바 소스 파일명(클래스명)은 대문자로 시작하는 것이 관례
- 자바 소스 파일명과 변수명을 작성할때 관례적으로 사용
변수가 선언되었다면 값을 저장할 수 있는데 이때 대입연산자인 =를 사용, 수학에서 등호는 '같다' 라는 의미이지만
자바에서는 우측 값을 좌우 변수에 대입한다는 연산자로 사용됨
[좌측 변수] = [우측 값]
우측의 값을 좌측의 변수에 대입한다.
int score; // 변수 선언
score=90; // 값 대입
더보기
변수 이름의 길이와 한글
- 변수의 이름은 어떤 값을 저장하고 있는지 쉽게 알 수 있도록 의미 있는 이름을 지어주는 것이 좋음
- 변수 이름의 길이는 프로그램 실행과는 무관하기 때문에 충분히 길어도 상관없음
- 변수 이름에 한글을 포함하지 않는 것이 관례
- 변수 초기화
- 변수에 최초로 값을 대입하는 행위
- 변수를 초기화 해야 변수가 메모리에 할당되고, 해당 메모리에 값이 저장됨.
- 변수 선언은 저장되는 값의 타입과 이름만 결정한 것이지 메모리에 할당한 것이 아님
- 변수를 선언함과 동시에 대입할 수도 있음
int score=90; //변수 선언과 동시에 초기화
- 초기화 되지 않은 변수를 연산식에 사용할 경우 컴파일 에러 (The local variable value may not have been initialized) 발생 예시
package ch02.sec01;
public class VariableInitializationExamples {
public static void main(String[] args) {
//변수 value 선언
int value;
//연산 결과를 변수 result의 초기 값으로 대입
int result = value+10; // 오류 발생
//변수 result 값을 읽고 콘솔에 출력
System.out.println(result);
}
}
콘솔 출력문
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The local variable value may not have been initialized
at ch02.sec01.VariableInitializationExamples.main(VariableInitializationExamples.java:10)
초기화 되지 않은 변수는 아직 메모리에 할당되지 않았기 때문에 변수를 통해 메모리 값을 읽을 수 없음
즉, 변수 value가 선언 되었지만, 초기화 되지 않았기 때문에 value +10에서 value 변수 값을 읽어 올 수 없음.
따라서 코드는 아래와 같이 변경되어야함.
package ch02.sec01;
public class VariableInitializationExamples {
public static void main(String[] args) {
//변수 value 선언
int value=30; //변수 value가 30으로 초기화
//연산 결과를 변수 result의 초기 값으로 대입
int result = value+10; // 변수 value 값(30)을 읽고 10을 더해서 변수 result 에 저장
//변수 result 값을 읽고 콘솔에 출력
System.out.println(result);
}
}
콘솔 출력문
40
- 변수를 문자열과 결합후 출력하거나 연산식에서 활용하는 예시
package ch02.sec01;
public class VariableUseExample {
public static void main(String[] args) {
int hour =3;
int minute=5;
System.out.println(hour+"시간 "+minute+"분");
int totalMinute=(hour*60)+minute;
System.out.println("총 "+totalMinute+"분");
}
}
콘솔 출력문
3시간5분
총185분
- 변수의 복사
- 변수는 또 다른 변수에 대입되어 메모리 간에 값을 복사할 수 있다.
int x=10; //변수를 x에 10을 대입
int y=x;//변수 y에 변수 x 값을 대입
- 두 변수의 값을 교환하는 방법의 예시
package ch02.sec01;
public class VariableExchangeExample {
public static void main(String[] args) {
int x=3;
int y=5;
System.out.println("x:"+ x +", y:" +y);
int temp=x;
x=y;
y=temp;
System.out.println("x:" + x+ ", y:" +y );
}
}
콘솔 출력문
x:3, y:5
x:5, y:3
- 변수 값의 복사 순서
- 변수 x 값 3을 temp에 대입 (x:3, temp:3, y:5)
- 변수 y값 5를 변수 x 에 대입(x:5, temp:3, y:5)
- 변수 temp 값 3을 변수 y에 대입(x:5, temp:3, y:3)
정수 타입
변수는 선언 될 때의 타입에 따라 저장할 수 있는 값의 종류와 허용 범위가 달라짐
자바는 정수, 실수, 논리 값을 저장할 수 있는 기본(primitive) 타입 8개를 다음과 같이 제공한다
값의 분류 | 기본 타입 |
정수 | byte,char,short,int,long |
실수 | float,double |
논리(true/false) | boolean |
- 정수 타입은 총 5개, 다음과 같이 메모리 할당 크기와 저장되는 값의 범위를 가짐
타입 | 메모리 크기 | 저장되는 값의 허용 범위 | ||
byte | 1byte | 8bit | -2⁷~( 2⁷-1) | -128~127 |
short | 2byte | 16bit | -2¹⁵~( 2¹⁵-1) | -32768~32767 |
char | 2byte | 16bit | 0-(2¹⁶-1) | 0~65535(유니코드) |
int | 4byte | 32bit | -2³¹~( 2³¹-1) | -2147483648~2147483647 |
long | 8byte | 64bit | -2⁶³~( 2⁶³-1) | -9223372036854775808~9223372036854775807 |
- 1byte=8bit, bit는 0과 1이 저장되는 단위
- 각 타입에 저장되는 값의 허용 범위를 모두 외울 필요는 없음
- 메모리 할당 크기는 알고 있는 것이 좋다
- 정수 타입을 메모리 사용 크기 순으로 나열
종류 | byte | short | int | long |
메모리 사용 크기(단위bit) | 8 | 16 | 32 | 64 |
- 메모리 크기를 N이라고 할 때 정수 타입의 구조(2진수로 저장됨)
- byte,short,int,long은 모두 부호 있는(signed) 정수 타입이므로 최상위 bit는 부호 bit로 사용되고, 나머지는 bit는 값의 범위를 결정한다
- 변수에 대입할 정수 리터럴 진수별 작성 방법
- 2진수
- 0b 또는 0B로 시작하고 0과 1로 작성
- 8진수
- 0으로 시작하고 0~7 숫자로 작성
- 10진수
- 소수점이 없는 0~9숫자로 작성
- 16진수
- 0x또는 0X로 시작하고 0~9숫자나 A,B,C,D,E,F(a,b,c,d,e,f) 로 작성
package ch02.sec02;
public class IntegerLiteralExample {
public static void main(String[] args) {
int var1 = 0b1011;//2진수
int var2 = 0206; //8진수
int var3 = 365;//10진수
int var4 = 0xB3; //16진수
System.out.println("var1:"+var1);
System.out.println("var2:"+var2);
System.out.println("var3:"+var3);
System.out.println("var4:"+var4);
}
}
콘솔 출력문
var1:11
var2:134
var3:365
var4:179
- 허용 범위를 초과한 값을 대입했을 경우 컴파일 오류 발생 예시
package ch02.sec02;
public class ByteExample {
public static void main(String[] args) {
byte var1=-128;
byte var2 = -30;
byte var3 = 0;
byte var4 =30;
byte var5 =127;
//컴파일 에러 발생(Type mismatch:cannot convert from int to byte)
byte var6= 128;
System.out.println(var1);
System.out.println(var2);
System.out.println(var3);
System.out.println(var4);
System.out.println(var5);
}
}
콘솔 출력문
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from int to byte
at ch02.sec02.ByteExample.main(ByteExample.java:13)
package ch02.sec02;
public class LongExample {
public static void main(String[] args) {
long var1=10;
long var2 =20L;
long var3 = 1000000000000; //컴파일러는 l,L을 붙이지 않으면 int 로 간주하기 때문에 에러 발생
long var4 = 1000000000000L;
System.out.println(var1);
System.out.println(var2);
System.out.println(var4);
}
}
콘솔 출력문
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The literal 1000000000000 of type int is out of range
at ch02.sec02.LongExample.main(LongExample.java:8)
- 기본적으로 컴파일러는 정수 리터럴을 int 타입 값으로 간주하기 때문에 int 타입의 허용 범위를 초과하는 리터럴은 뒤에 소문자'l'이나 대문자'L을 붙여 long 타입 값임을 컴파일러에게 알려줘야 함
- 허용범위를 넘어서지 않으면 컴파일러가 변수에 대입할 때 자동으로 int를 long 으로 변환해줌
문자 타입
- 하나의 문자를 작은 따옴표(')로 감싼 것을 문자 리터럴이라고 함.
- 문자 리터럴은 유티 코드로 변환 되어 저장
- 유니코드는 세계 각국의 문자를 0~65535 숫자로 매핑한 국제 표준 규약이다
- 유니코드가 정수이므로 char 타입도 정수 타입
- char 변수에 작은 따옴표로 감싼 문자가 아니라 유니코드 숫자를 직접 대입 가능
package ch02.sec03;
public class CharExample {
public static void main(String[] args) {
char c1='A';
char c2=65;
char c3='가';
char c4=44032;
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c4);
}
}
콘솔 출력문
A
A
가
가
- char 타입의 변수에 어떤 문자도 대입하지 않고 단순히 초기화 할 목적으로 작은 따옴표(') 두개를 연달아 붙인 빈 문자를 대입하면 컴파일 에러가 발생
- 공백 하나를 포함해서 초기해야 함.
실수 타입
타입 | 메모리 크기 | 저장되는 길이의 허용 범위(양수 기준) | 유효 소수 이하 자리 | |
float | 4byte | 32bit | 1.4 × 10⁻⁴⁵~3.4 × 10³⁸ | 7자리 |
double | 8byte | 64bit | 4.9 × 10⁻³²⁴ ~ 1.8 × 10³⁰⁸ | 15자리 |
- 실수 타입은 float 와 double 로 구성
- double 타입이 float 타입 보다 큰 실수를 저장할 수 있고 정밀도 또한 높음
- 자바는 IEEE754 표준에 근거 float타입과 double 타입의 값을 부동 소수점(floating-point) 방식으로 메모리에 저장
- 부호/ 가수/ 지수 부분으로 이루어짐
- float(4바이트,32비트): 부호비트+ 지수부(8비트)+가수부(23비트)
- double(8바이트,64비트): 부호비트+지수부(11비트)+가수부(52비트)
- 최상위 1bit는 부호 bit, 0이면 양수,1이면 음수
- 부호/ 가수/ 지수 부분으로 이루어짐
- 컴파일러는 실수 리터럴을 기본적으로 double 타입으로 해석하기 때문에 double 타입 변수에 대입
- float 타입에 대입하고 싶다면 리터럴 뒤에 소문자'f'나 대문자'F' 를 붙여 컴파일러가 float 타입임을 알 수 있도록 해 함
package ch02.sec04;
public class FloatDoubleExample {
public static void main(String[] args) {
//정밀도 확인
float var1 = 0.1234567890123456789f;
double var2 = 0.1234567890123456789;
System.out.println("var1: "+ var1);
System.out.println("var2: "+ var2);
//10의 거듭제곱 리터럴
double var3= 3e6;
float var4 = 3e6f;
double var5 = 2e-3;
System.out.println("var3: "+ var3);
System.out.println("var4: "+ var4);
System.out.println("var5: "+ var5);
}
}
콘솔 출력문
var1: 0.12345679
var2: 0.12345678901234568
var3: 3000000.0
var4: 3000000.0
var5: 0.002
- double 타입이 float 타입 보다 약 2배 정도의 유효 자릿수를 가진 것을 알수 있다.
논리 타입(boolean)
- 참과 거짓을 의미하는 논리 리터럴은 true 와 false
- boolean 타입 변수는 주로 두 가지 상태값을 저장할 필요가 있을 경우에 사용
- 상태 값에 따라 조건문과 제어문의 실행 흐름을 변경하는 데 사용
- 연산식 중에 비교 및 논리 연산 산출값은 true 또는 false 이므로 boolean 타입변수에 대입할 수 있다.
package ch02.sec05;
public class BooleanExample {
public static void main(String[] args) {
boolean stop=true;
if(stop) {
System.out.println("중지합니다.");
} else {
System.out.println("시작합니다.");
}
int x = 10;
boolean result1 =(x==20);
boolean result2 =(x!=20);
System.out.println("result1: "+ result1);
System.out.println("result2: "+ result2);
}
}
콘솔 출력문
중지합니다.
result1: false
result2: true
문자열 타입
작은 따옴표(')로 감싼 한 개의 문자는 char 타입이지만, 큰 따옴표(")로 감싼 여러 개의 문자들은 유니코드로 변환되지 않는다.
큰 따옴표(")로 감싼 문자들을 문자열이라고 부름. 문자열을 변수에 저장하고 싶다면 String 타입을 써야 함
- String
- 자바 기본 타입에 속하지 않는 참조 타입
- 문자열 내부에 역슬래쉬(\)가 붙은 문자를 사용할 수 있음
- 이를 이스케이프(escape) 문자라고 함
- 이스케이프 문자를 사용하하면 특정문자를 포함할 수 있고, 출력에 영향을 미치기도 함.
- 역슬래쉬가 ₩로 표시 될 수도 있는데, 이것은 폰트 떄문이니 상관없음
이스케이프 문자 | 설명 |
\" | "문자 포함 |
\' | '문자 포함 |
\\ | \문자 포함 |
\u16진수 | 16진수 유니코드에 해당하는 문자 포함 |
\t | 출력시 탭만큼 띄움 |
\n | 출력시 줄바꿈(라인피드) |
\r | 출력시 캐리지 리턴 |
package ch02.sec06;
public class StringExample {
public static void main(String[] args) {
String name="홍길동";
String job="프로그래머";
System.out.println(name);
System.out.println(job);
String str = "나는 \"자바\"를 배웁니다";
System.out.println(str);
str = "번호\t이름\t직업";
System.out.println(str);
System.out.print("나는\n");
System.out.print("자바를\n");
System.out.print("배웁니다.");
}
}
콘솔출력문
홍길동
프로그래머
나는 "자바"를 배웁니다
번호 이름 직업
나는
자바를
배웁니다.
- Java 13부터 사용하는 텍스트 블록 문법
- 큰따옴표 3개로 감싸면 이스케이프하거나 라인피드를 할 필요가 없이 작성된 그대로 문자열로 저장된다.
- 텍스트 블록 문법 예시
String str="""
삽입할 내용
""";
package ch02.sec06;
public class TextBlockExample {
public static void main(String[] args) {
String str1 = "" + "{\n" + "\t\"id\":\"winter\",\n" + "\t\"name:\"눈송이\"\n" + "}";
String str2 = """
{
"id:"winter",
"name":"눈송이"
}
""";
System.out.println(str1);
System.out.println("=============================");
System.out.println("=============================");
System.out.println(str2);
System.out.println("=============================");
String str="""
나는 자바를 \
학습합니다.
나는 자바 고수가 될 겁니다.
""";
System.out.println(str);
}
}
콘솔 출력문
{
"id":"winter",
"name:"눈송이"
}
=============================
=============================
{
"id:"winter",
"name":"눈송이"
}
=============================
나는 자바를 학습합니다.
나는 자바 고수가 될 겁니다.
- 텍스 블록에서 줄바꿈은 \n 에 해당
- 줄바꿈을 하지 않고 다음 줄에 이어서 작송하고 싶으면 맨 끝에 \를 붙여줌
- 이 기능은 Java14부터 제공
자동 타입 변환
- 자동 타입 변환(promotion)
- 자동으로 타입 변환이 일어나는 것
- 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 대입될때 발생
- 기본 타입을 허용 범위 순으로 나열하면
- byte<short,char<int<long<float<double
- 정수 타입이 실수 타입으로 대입될 경우에는 무조건 자동 타입 변환
- 실수 타입은 정수 타입보다 허용 범위가 더 크기 떄문
- char타입의 경우 int타입으로 자동변환되면 유니코드 값이 int 타입에 대입된다.
- 예외 byte타입은 char타입으로 자동 변환 될 수 없음
- char 타입의 허용 범위는 음수를 포함하지 않지만, byte 타입은 음수를 포함 하기 때문
- 기본 타입을 허용 범위 순으로 나열하면
- 자동 타입 변환 예시 (byte to int)
byte byteValue=10;
int intValue =byteValue; //자동 타입 변환
- 자동 타입 변환 예시 2(정수 to 실수)
long longValue=5000000000L;
float floatValue=longValue; //5.0E9f
double doubleValue=longValue;//5.0E9
- 자동 타입 변환 예시 3(char to int)
char charValue='A';
int intValue=charValue; //65저장
- 자동 타입 변환 실패 예시(byte to char)
byte byteValue=65;
char charValue =byteValue;
//Type mismatch: cannot convert from byte to char 컴파일 에러 발생
- 자동 타입 변환 예시4(종합)
package ch02.sec07;
public class PromotionExample {
public static void main(String[] args) {
byte byteValue = 10;
int intValue = byteValue;
System.out.println("intValue: " + intValue);
char charValue = '가';
intValue = charValue;
System.out.println("\'가\'의 유니코드: " + intValue);
intValue = 50;
long longValue = intValue;
System.out.println("longValue: " + longValue);
longValue = 100;
float floatValue = longValue;
System.out.println("floatValue: " + floatValue);
floatValue = 100.5F;
double doubleValue = floatValue;
System.out.println("doubleVlaue: " + doubleValue);
}
}
=============================================================
콘솔 출력문
intValue: 10
'가'의 유니코드: 44032
longValue: 50
floatValue: 100.0
doubleVlaue: 100.5
=============================================================
강제 타입 변환
큰 허용 범위 타입은 작은 허용 범위 타입으로 변환 될 수 없다
- 강제 타입 변환(casting,캐스팅)
- 큰 허용 범위 타입을 작은 허용 범위 타입으로 쪼개어서 저장하는 것
- 캐스팅 연산자로 괄호()사용, 괄호 안에 들어가는 타입은 쪼개는 단위
- 강제 타입 변환의 목적은 원래 값이 유지 되면서 타입만 바꾸는 것
- 작은 허용 범위 타입에 저장될 수 있는 값을 가지고 강제 타입 변환 하는 것을 권장
작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입
- int to byte
- int 타입은 byte 타입보다 더 큰 허용 범위를 가짐
- int 타입은 4byte, byte 타입은 1byte
- int to byte로 강제 타입 변환, 캐스팅을 하게 되면 앞에 3byte는 삭제되고 끝 1byte 값만 byte타입 변수에 저장
- int 타입은 4byte, byte 타입은 1byte
- int 타입은 byte 타입보다 더 큰 허용 범위를 가짐
- long to int
- long타입은 int 타입 보다 더 큰 허용 범위를 가짐
- long 타입은 8byte, int 타입은 4byte
- long to int로 강제 타입 변환, 캐스팅을 하게 되면 앞에 4byte는 삭제되고 끝 4byte값만 int 타입 변수에 저장
- long 타입은 8byte, int 타입은 4byte
- long타입은 int 타입 보다 더 큰 허용 범위를 가짐
long longValue=300;
int intValue=(int)longValue;//강제 타입 변환 후에 300이 그대로 유지
- int to char
- int 타입은 char 타입 보다 큰 허용 범위를 가짐
- int 타입은 4byte, char 타입은 2byte
- 단, char타입은 허용범위가 0~65535 이기 떄문에 그 사이의 값만 원래 값을 유지함.
- int 타입은 4byte, char 타입은 2byte
- int 타입은 char 타입 보다 큰 허용 범위를 가짐
int intValue=65;
char charValue=(char)intValue;
System.out.println(charValue); //'A'가 출력
- 실수 to 정수
- 실수 타입(float,double) 은 정수 타입(byte,shor,int,long)보다 항상 큰 허용 범위를 가진다.
- 이 경우 소수점 이하 부분은 버려지고 정수 부분만 저장
- 실수 타입(float,double) 은 정수 타입(byte,shor,int,long)보다 항상 큰 허용 범위를 가진다.
double doubleValue = 3.14;
int intValue=(int)doubleValue; //intValue는 정수 부분인 3만 저장
- Casting 예시(종합)
package ch02.sec08;
public class CastingExample {
public static void main(String[] args) {
int var1=10;
byte var2= (byte)var1;
System.out.println(var2); //강제 타입 변환 후에 10이 그대로 유지
long var3=300;
int var4=(int)var3;
System.out.println(var4); //강제 타입 변환 후에 300이 그대로 유지
int var5=65;
char var6= (char)var5;
System.out.println(var6); //'A'가 출력
double var7=3.14;
int var8=(int) var7;
System.out.println(var8);//정수 부분인 3이 출력
}
}
==========================================================
콘솔 출력문
10
300
A
3
==========================================================
연산식에서 자동 타입 변환
- 자바는 실행 성능을 향상시키기 위해 컴파일 단계에서 연산을 수행
- 정수 리터럴이 아니라 변수가 피연산자로 사용되면 컴파일 단계가 아닌 실행 시 연산을 수행
- 정수타입 변수의 연산
- int 타입 보다 작은 byte,short 타입의 변수는 int 타입으로 자동 타입 변환 되어 연산 수행
- 즉, 연산의 결과 값은 byte 변수에 저장할 수 없고 int 변수에 저장 해야함.
- 특별한 이유가 있는 것이 아니라면 정수 연산에 변수가 사용 될 경우에는 변수 역시 int로 선언하는 것이 좋음
- 즉, 연산의 결과 값은 byte 변수에 저장할 수 없고 int 변수에 저장 해야함.
- int 타입 보다 허용 범위가 큰 long 타입이 피연산자로 사용되면 다른 피연산자들 역시 long 타입으로 변환됨
- 연산 결과 역시 long 타입 변수에 저장해야함
- int 타입 보다 작은 byte,short 타입의 변수는 int 타입으로 자동 타입 변환 되어 연산 수행
- 실수타입 연산의 경우
- 피연산자가 통일한 실수 타입일 경우 해당 타입으로 연산
- float 타입 변수와 float 타입 변수의 연산의 결과는 float 타입
- float 타입 변수와 double 타입 변수의 연산 결과는 double 타입
- 피연산자가 통일한 실수 타입일 경우 해당 타입으로 연산
- 실수 타입과 정수 타입 연산의 경우
- int 타입과 double 타입 변수의 연산 결과는 double
- int 타입의 결과 값이 필요할 경우, double 타입 변수를 int타입으로 캐스팅해야함
- int 타입과 double 타입 변수의 연산 결과는 double
- 정수타입 변수의 연산
- 연산식에서 자동 타입 변환 예시
package ch02.sec09;
public class OperationPromotionExample {
public static void main(String[] args) {
byte result1 = 10 + 20;
System.out.println("result1: " + result1);
byte v1 = 10;
byte v2 = 20;
int result2 = v1 + v2; // int 타입으로 변환 후 연산
System.out.println("result2: " + result2);
byte v3 = 10;
int v4 = 100;
long v5 = 1000L;
long result3 = v3 + v4 + v5;
System.out.println("result3: " + result3);
char v6 = 'A';
char v7 = 1;
int result4 = v6 + v7;
System.out.println("result4: " + result4);
System.out.println("result4: " + (char)result4);
int v8 = 10;
int result5= v8/4;
System.out.println("result5: "+ result5);
int v9=10;
double result6=v9/4.0;
System.out.println("result6: "+ result6);
int v10=1;
int v11=2;
double result7=(double)v10/v11;
System.out.println("result7: "+ result7);
}
}
=================================================================
콘솔출력문
result1: 30
result2: 30
result3: 1110
result4: 66
result4: B
result5: 2
result6: 2.5
result7: 0.5
=================================================================
- int 보다 작은 허용범위를 가진 byte,short,char 의 경우 연산의 결과는 int(result2,result4)
- 다양한 타입의 연산시에는 가장 큰 허용 범위를 가진 타입이 결과의 타입
- 정수보다 실수가 더 큰 허용 범위를 가지고 있음
- 자바에서 '+' 연산자
- '+'연산자의 두가지 기능
- 피연사자가 모두 숫자일 경우 덧셈 연산
- 피연산자 중 하나가 문자열일 경우 나머지 피연산자도 모두 문자열로 자동 변환
- 연산식에서 + 연산자가 연이어 나오면 순차적으로 + 연산
- 먼저 수행된 연산이 덧셈 연산이라면 이후 덧셈 결과
- 먼저 수행된 연산이 결합 연산이라면 이후 + 연산은 모두 결합연산
- 연산식에서 특정부분을 우선 연산하고 싶다면 해당 부분을 괄호()로 감싼다.
- '+'연산자의 두가지 기능
package ch02.sec09;
public class StringConcatExample {
public static void main(String[] args) {
// 숫자연산
int result1 = 10 + 2 + 8;
System.out.println("result1: " + result1);
// 결합연산
String result2 = 10 + 2 + "8";
System.out.println("result2: " + result2);
String result3 = 10 + "2" + 8;
System.out.println("result3: " + result3);
String result4 = "10"+2+8;
System.out.println("result4: "+ result4);
String result5 = "10"+ (2+8);
System.out.println("result5: "+ result5);
}
}
========================================================
콘솔 출력문
result1: 20
result2: 128
result3: 1028
result4: 1028
result5: 1010
========================================================
문자열을 기본 타입으로 변환
변환 타입 | 메서드 | 사용 예시 |
String ▶ byte | Byte.parseByte(); | String str="10"; byte value= Byte.parseByte(str); |
String ▶ short | Short.parseShort(); | String str="200"; short value = Short.parseShort(str); |
String ▶ int | Integer.parseInt(); | String str="30000"; int value = Integer.parseInt(str); |
String ▶ long | Long.parseLong(); | String str="40000000000"; long value=Long.parseLong(str); |
String ▶ float | Float.parseFloat(); | String str="12.345"; float value=Float.parseFloat(str); |
String ▶ double | Double.parseDouble(); | String str="12.345"; double value=Double.parseDouble(str); |
String ▶ boolean | Boolean.parseBoolean(); | String str="true"; booleanValue=Boolean.ParseBoolean(str); |
- 기본 타입의 값을 문자열로 변경하는 경우 String.valueOf()메서드 이용
- ex) String str=String.valueOf(기본타입값);
package ch02.sec10;
public class PrimitiveAndStringConversionExample {
public static void main(String[] args) {
int value1 = Integer.parseInt("10");
double value2 = Double.parseDouble("3.14");
boolean value3 = Boolean.parseBoolean("true");
System.out.println("value1: "+ value1);
System.out.println("value2: "+ value2);
System.out.println("value3: "+ value3);
String str1=String.valueOf(10);
String str2=String.valueOf(3.14);
String str3=String.valueOf(true);
System.out.println("str1: "+ str1);
System.out.println("str2: "+ str2);
System.out.println("str3: "+ str3);
}
}
=======================================================
콘솔출력문
value1: 10
value2: 3.14
value3: true
str1: 10
str2: 3.14
str3: true
=======================================================
변수 사용 범위
- main() 메소드 블록에는 다른 중괄호{} 블록들이 작성 될 수 있음
- 조건문 if, 반복문 for,while 등이 중괄호{}블록들을 가질 수 잇는데, 이러한 중괄호{}블록 내에서 선언된 변수는 해당 중괄호{}블록 내에서만 사용이 가능하고 밖에서는 사용 할 수 없다
- 메서드 블록 전체에서 사용하고 싶다면 메서드 블럭 첫머리에 선언하는 것이 좋고, 특정 블록 내부에서만 사용된다면 해당 블록 내에서 선언하는 것이 좋다
package ch02.sec11;
public class VariableScopeExample {
public static void main(String[] args) {
int v1=15;
if(v1>10) {
int v2= v1-10;
}
int v3= v1+v2+5; //v2변수를 사용할 수 없기 때문에 컴파일 에러 발생
}
}
===========================================================================
콘솔출력문
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
v2 cannot be resolved to a variable
at ch02.sec11.VariableScopeExample.main(VariableScopeExample.java:10)
===========================================================================
콘솔로 변수 값 출력
- 표준 출력 장치인 모니터(명령 프롬프트,터미널,콘솔)에 값을 출력하기 위한 메서드
메서드 | 의미 |
println(내용); | 괄호 안의 내용을 출력하고 행을 바꿔라 |
print(내용); | 괄호 안의 내용을 출력하고 행을 바꾸지마라 |
printf("형식문자열",값1,값2,...); | 형식 문자열에 맞추어 뒤의 값을 출력해라. |
- printf() 형식의 문자열
- pintf("형식문자열",값1,값2,...)
- "형식문자열"의 포맷
- %[argument_index$][flags][width][.precision]conversion
- %와 conversion(변환문자)는 필수로 작성, 그 외의 항목은 생략할 수 있음
- %:형식문자열의 시작 /생략 불가능
- [argument_index$]: 값의 순번, 형식 문자열에 포함될 값이 2개 이상일 경우 사용 /생략가능
- 1$은 첫번째 값, 2$은 두번째 값 ...
- [flags]: 빈 공간을 채우는 방법/ 생략 가능
- 생략되면 왼쪽이 공백으로 채워짐
- -가 오면 오른쪽 공백으로 채워짐
- 0은 공백대신 0으로 채움
- [width]: 소수점을 포함한 전체 자릿수/생략가능
- [.precision]:소수 이하 자릿수/생략가능
- conversion: 제공되는 값의 타입에 따라 d(정수),f(실수),s(문자열) / 생략 불가능
- %와 conversion(변환문자)는 필수로 작성, 그 외의 항목은 생략할 수 있음
- %[argument_index$][flags][width][.precision]conversion
- "형식문자열"의 포맷
- pintf("형식문자열",값1,값2,...)
형식화된 문자열 | 설명 | 출력형태 | |
정수 | %d %6d %-6d %06d |
정수 6자리 정수,왼쪽 빈자리 공백 6자리 정수, 오른쪽 공백 6자리 정수, 왼쪽 빈자리 0으로 채움 |
123 ___123 123___ 000123 |
실수 | %10.2f %-10.2f %010.2f |
정수 7자리+소수점+소수2자리,왼쪽 빈자리 공백 정수 7자리+ 소수점 +소수 2자리, 오른쪽 빈자리 공백 정수 7자리 + 소수점 + 소수 2자리, 왼쪽 빈자리 0 채움 |
----123.45 123.45---- 0000123.45 |
문자열 | %s %6s $-6s |
문자열 6자리 문자열, 왼쪽 빈자리 공백 6자리 문자열, 오른쪽 빈자리 공백 |
abc ___abc abc___ |
특수문자 | \t \n %% |
탭(tab) 줄바꿈 % |
% |
package ch02.sec12;
public class PrintfExample {
public static void main(String[] args) {
int value = 123;
System.out.printf("상품의 가격:%d원\n", value);
System.out.printf("상품의 가격:%6d원\n", value);
System.out.printf("상품의 가격:%-6d원\n", value);
System.out.printf("상품의 가격:%06d원\n", value);
double area = 3.14159 * 10 * 10;
System.out.printf("반지름이 %d인 원의 넓이:$10.2f\n", 10, area);
String name = "홍길동";
String job = "도적";
System.out.printf("%6d|%-10s|%10s\n", 1, name, job);
}
}
===========================================================================
콘솔 출력문
상품의 가격:123원
상품의 가격: 123원
상품의 가격:123 원
상품의 가격:000123원
반지름이 10인 원의 넓이:$10.2f
1|홍길동 | 도적
===========================================================================
키보드 입력 데이터에 변수를 저장
- Scanner
- 키보드로 부터 입력된 데이터를 읽고 변수에 저장하는 가장 쉬운 방법
- scanner.nextLin()을 실행하면 키보드로 입력된 내용을 문자열로 읽고 좌측 String 변수에 저장
- 엔터키가 입력되기전 까지 블로킹(대기) 상태가 됨
- 엔터키가 입려되면 지금까지 입력된 모든 내용을 문자열로 읽음
Scanner [scanner변수명] = new Scanner(System.in);
[Scanner 변수 선언] [Scanner 객채 생성]
String inputData= scanner.nextLine();
[String 변수 선언] [엔터 키를 누르면 입력된 문자열을 읽음]
package ch02.sec13;
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("x 값 입력: ");
String strX = sc.nextLine();
int x = Integer.parseInt(strX);
System.out.println("y 값 입력: ");
String strY = sc.nextLine();
int y = Integer.parseInt(strY);
int result = x+y;
System.out.println("x+y: "+ result);
System.out.println();
//q를 입력하면 문자 출력을 종료하는 프로그램
//반복문 while
while(true) {
System.out.print("입력 문자열: ");
String data = sc.nextLine();
if(data.equals("q")){
break;
}
System.out.println("출력 문자열: " + data);
System.out.println();
}
System.out.println("종료");
}
}
========================================================================
콘솔 출력문
x 값 입력: 4
y 값 입력: 4
x+y: 8
입력 문자열: q
종료
- while(true) 중괄호 안을 무한히 반복 실행하는 코드
- 자바 기본타입(byte,shor,in,long,float,double,boolean) 값이 동일한지 비교할때는 == 를 사용하고
- String 타입 값이 동일한지 비교 할떄는 equals() 메서드를 사용함.
'Java > 이것이자바다_개념정리' 카테고리의 다른 글
Java 기초 정리 2차_5)참조 타입_이것이 자바다 (0) | 2024.06.05 |
---|---|
Java 기초 정리 2차_4)조건문과 반복문_이것이 자바다 (0) | 2024.06.02 |
Java 기초 정리 2차_3)연산자_이것이 자바다 (0) | 2024.05.27 |
Java 기초 정리 2차_1)자바 시작하기_이것이 자바다 (0) | 2024.05.21 |