Java/이것이자바다_개념정리

Java 기초 정리 2차_2)변수와 타입_이것이 자바다

김쟈워니 2024. 5. 22. 10:39
변수 선언

 

컴퓨터 메모리(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 to byte casing 예시 1/ 원래 값이 유지되면서 타입만 바뀐 강제 타입 변환 예시
int to byte casting 예시 2/ 원래 값이 유지 되지 않으면서 타입이 바뀌는 강제변환 예시

  • long to int
    • long타입은 int 타입 보다 더 큰 허용 범위를 가짐
      • long 타입은 8byte, int 타입은 4byte
        • long to int로 강제 타입 변환, 캐스팅을 하게 되면 앞에 4byte는 삭제되고 끝 4byte값만 int 타입 변수에 저장
long longValue=300;
int intValue=(int)longValue;//강제 타입 변환 후에 300이 그대로 유지
  • int to char
    • int 타입은 char 타입 보다 큰 허용 범위를 가짐
      • int 타입은 4byte, char 타입은 2byte
        • 단, char타입은 허용범위가 0~65535 이기 떄문에 그 사이의 값만 원래 값을 유지함.
int intValue=65;
char charValue=(char)intValue;
System.out.println(charValue); //'A'가 출력
  • 실수 to 정수
    • 실수 타입(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로 선언하는 것이 좋음
      • int 타입 보다 허용 범위가 큰 long 타입이 피연산자로 사용되면 다른 피연산자들 역시 long 타입으로 변환됨
        • 연산 결과 역시 long 타입 변수에 저장해야함
    • 실수타입 연산의 경우
      • 피연산자가 통일한 실수 타입일 경우 해당 타입으로 연산
        • float 타입 변수와 float 타입 변수의 연산의 결과는 float 타입
        • float 타입 변수와 double 타입 변수의 연산 결과는 double 타입
    • 실수 타입과 정수 타입 연산의 경우
      • int 타입과 double 타입 변수의 연산 결과는 double 
        • int 타입의 결과 값이 필요할 경우, double 타입 변수를 int타입으로 캐스팅해야함 
  • 연산식에서 자동 타입 변환 예시
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(문자열) / 생략 불가능
형식화된 문자열 설명 출력형태
정수 %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() 메서드를 사용함.