JAVA의 정석 2장 - 변수(Variavle)

김동환·2023년 12월 24일

JAVA의 정석

목록 보기
2/8
post-thumbnail

제 2장 - 변수(variavle)


1. 변수(Variavle)

변수란?

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

변수의 명명 규칙

  • 대소문자가 구별되며 길이에 제약이 없다.
True와 true는 서로 다른 것으로 간주된다.
  • 예약어를 사용하면 안된다.
true는 예약어라서 사용할 수 없지만, True는 가능하다.
  • 숫자로 시작해서는 안 된다.
top10은 허용되지만, 7up은 허용되지 않는다.
  • 특수문자는 '_'와 '$'만 허용한다..
$harp은 허용되지만, S#arp은 허용되지 않는다.

권장하는 규칙

  • 클래스 이름의 첫 글자는 항상 대문자로 한다.
    변수와 메서드의 이름의 첫 글자는 항상 소문자로 한다.

  • 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다.
    ex) lastIndexOf, StringBuffer

  • 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_'로 구분한다.
    ex) PI, MAX_NUMBER


2. 변수의 선언

1. 변수의 선언 이유

  • 값(data)을 저장할 공간을 마련하기 위해서

2. 변수의 선언 방법

변수타일 변수이름;
int age;

변수에 값 저장하기

1) 변수에 값 저장하기
int age; //int 타입인 변수 age를 선언
age = 23; //변수 age에 값 23을 저장

2) 변수의 초기화
변수에 처음으로 값을 저장하는 것
int x = 0, y = 5; //변수 x, y를 선언 후 0, 5로 초기화

변수의 타입

기본형(primitive type) 계산을 위해 실제 값을 저장한다. (총 8개)

  • 논리형(boolean) - true/false. 조건식과 논리적 계산에 사용
  • 문자형(char) - 문자를 저장, 변수 당 하나의 문자만을 저장할 수 있다(여러 문자는 String)
  • 정수형(byte, short, int, long) - 정수 값을 저장, 주로 int, long 사용, byte는 이진 데이터를 다루는데 사용
  • 실수형(float, double) - 실수 값을 저장, folat와 double

참조형(reference type)

  • 기본형을 제외한 나머지(String, System 등 무한개)
  • 메모리 주소를 저장(4byte or 8byte)
  • 객체의 주소를 저장한다. (8개의 기본형을 제외한 나머지 타입)
  • 참조형 변수를 선언할 때 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 참조변수의 타입이 된다.

기본형(primitive type) - 종류와 크기

1byte2byte4byte8byte
논리형boolean
문자형char
정수형byteshortintlong
실수형floatdouble

#boolean을 제외한 나머지 7개의 기본형은 서로 연산과 변환이 가능하다.

기본형의 범위

자료형저장 가능한 값의 범위크기(byte)
booleanfalse, true1
char'\u0000'~'\uffff' (0~216-1, 0~65535)2
byte-128~127 (-27~27-1)1
short-32,768~32,767 (-215~215-1)2
int-2,147,483,648~2,147,483,647 (-231~231-1)4
long-9,223,372,036,854,775,808~9,223,372,036,854,775,807 (-263~263-1)8
float1.4E-45~3.4E38 (1.4x10-45~3.4x1038)4
double4.9E-324~1.8E308 (4.9x10-324~1.8x10308)8

값의 타입

값(data)
   - 문자 - char

   - 숫자 
     - 정수 - byte, short, int, long
     - 실수 - float, double

   - 논리 - boolean
1) 변수의 타입은 저장할 값의 타입에 의해 결정된다.
int age = 23;
age = 3.14; //에러

2) 저장할 값의 타입과 일치하는 타입으로 변수를 선언;
char ch = "가";
double pi = 3.14;

변수, 상수, 리터럴

  1. 변수(Variable): 하나의 값을 저장하기 위한 공간

  2. 상수(Constant): 한 번만 값을 저장 가능한 변수
    ⓐ 변수의 타입 앞에 키워드 'final'을 붙여준다.
    ⓑ 반드시 선언과 동시에 초기화해야 한다.
    ⓒ 상수의 값을 변경하는 것이 허용되지 않는다.

  3. 리터럴(Literal): 그 자체로 값을 의미하는 것

int score = 100; //score는 변수, 100은 리터럴
final int MAX = 200; //MAX는 상수, 200은 리터럴

프로그래밍에서는 상수를 '값을 한 번 저장하면 변경할 수 없는 저장공간'으로 정의했기 때문에 이와 구분하기 위해 상수를 리터럴이라는 다른 이름으로 불러야만 했다.

리터럴의 접두사와 접미사

종류리터럴접미사
논리형false, true없음
정수형123, 0b0101, 077, 0xFF, 100LL
실수형3.14, 3.0e8, 1.4f, 0x1, Op-1f, d
문자형'A', '1', '\n'없음
문자열"ABC", "123", "A", "true없음
int small = 100;
long big = 100_000_000_000L;

float pi = 3.14f;
double rate = 1.618d;

float pi = 3.14;		//에러. float타입 변수에 double타입 리터럴 지정 불가
double rate = 1.618;	//OK
byte b = 128; //에러. byte타입 범위 -128~127
int oct = 0100; //8진수. 접두사 0
int hex = 0x100; //16진수. 접두사 0x
long l = 10_000_000_000L; //100억. L 생략불가
long l = 100; //L 생략가능
float f = 3.14f; //f 생략불가
double d = 3.14d; //d 생략가능
10. --> 10.0
.10 --> 0.10
10f --> 10.0f
1e3 --> 1000.0(d)

타입이 달라도 저장범위가 넚은 타입에서 좁은 타입의 값을 저장하는 것은 허용된다.

int		i = 'A';	// OK. 유니코드인 65가 변수 i에 저장된다.
long	l = 123;	// OK.
double	d = 3.14f;	// OK.

변수와 리터럴의 타입 불일치

1)범위가 '변수 > 리터럴'인 경우, OK
int i = 'A' //int > char
long l = 123; //long > int
double d = 3.14f; // double > float

2)범위가 '변수 < 리터럴'인 경우, 에러
int i = 30_0000_0000; //에러. int의 범위(약 -20억~20억) 벗어남
long l = 3.14f //에러. long < float
float f = 3.14; //에러. float < double

3)byte, short 변수에 int리터럴 저장가능
byte b = 100; //OK. byte범위(-128~127)에 속함
byte b = 128; //에러. byte범위를 벗어남

문자와 문자열

char ch='A'; //문자
char ch='AB'; //에러
String s="ABC"; //문자열

String s1="AB";
String s2=new String("AB");

String s1 = "A" + "B"; //"AB"
"" + 7 --> "" + "7" -->"7" //숫자 + 문자열 --> 문자열

문자열 + any type --> 문자열
any type + 문자열 --> 문자열

문자 리터럴과 문자열 리터럴

  • 문자열 리터럴은 "" 안에 아무런 문자도 넣지 않는 것을 허용하지만 문자 리터럴은 반드시 ''안에 하나의 문자가 있어야 한다.
String	str = "";	// OK.
char	ch = '';	// 에러.
char	ch = ' ';	// OK. 공백 문자(blank)로 변수 초기화
  • 덧셈 연산자(+)는 어느 한 쪽이 String이면 나머지 한쪽을 String으로 변환한 다음 결합한다.
    따라서 기본형 타입 값을 문자로 변환할 때 빈 문자열("")을 더해주면 된다.
ex) 27 + " " -> "27 "
	" " + 27 -> " 27"
	7 + "27" -> "727"

두 변수의 값 교환하기

int x = 10, y = 20;
int tmp; //1. 빈 컵
tmp = x; //2. x의 값을 tmp에 저장
x = y; //3. y의 값을 x에 저장
y = tmp; //4. tmp의 값을 y에 저장

형식화된 출력 - printf( )

종류설명데이터 타입
%bboolean 형식으로 출력정수
%d정수 형식으로 출력정수
%o8진수 정수의 형식으로 출력정수
%x or %X16진수 정수의 형식으로 출력정수
%e 또는 %E지수 표현식의 형식으로 출력실수
%f소수점 형식으로 출력실수
%c문자형식으로 출력문자
%s문자열 형식으로 출력문자
%n줄바꿈 기능-

'%n' 대신 '\n'을 대신 사용해도 되지만, OS마다 줄바꿈 문자가 다를 수 있기 떄문에 '%n'을 사용하는 것이 더 안전하다.

printf( )의 지시자

1)정수를 10진수, 8진수, 16진수로 출력
System.out.printf("%d", 15); // 15 , 10진수
System.out.printf("%o", 15); // 17 , 8진수
System.out.printf("%x", 15); // f , 16진수
System.out.printf("%s", Integer.toBinaryString(15)); // 1111 , 2진수
2)8진수와 16진수에 접두사 붙이기
System.out.printf("%#o", 15); // 017 , 8진수
System.out.printf("%#x", 15); // 0xf , 16진수
System.out.printf("%#X", 15); // 0Xf , 16진수
3)실수 출력을 위한 지시자 %f - 지수형식(%e), 간략한 형식(%g)
System.out.printf("%f", f); // 123,456787 소수점아래6자리
System.out.printf("%e", f); // 1,234568e + 02 지수형식
System.out.printf("%g", 123.456789); // 123.457 간략한 형식
System.out.printf("%g", 0.00000001); // 1.000000e-8 간략한 형식
System.out.printf("[%5d]%n", 10); //5자리
System.out.printf("[%-5d]%n", 10); //왼쪽정렬, 5자리
System.out.printf("[%05d]%n", 10); //공백 0으로 채움, 5자리
System.out.printf("d=%14.10f%n", d); //전체 14자리 중 소수점 아래 10자리
String url = "www.codechobo.com";
System.out.printf("[%s]%n", url); // [www.codechobo.com]
System.out.printf("[%20s]%n", url); // [   www.codechobo.com]
System.out.printf("[%-20s]%n", url); // [www.codechobo.com   ]
System.out.printf("[%.8s]%n", url); // [www.code] 8글자 부분출력

화면에서 입력받기

  • 화면으로부터 데이터를 입력받는 기능을 제공하는 클래스
1. import문 추가
import java.util.*;
2. Scanner 객체의 생성

Scanner scanner = new Scanner(System.in);
3. Scanner 객체를 사용

int num = scanner.nextInt(); // 화면에서 입력받은 정수를 num에 저장
String input = scanner.nextLine(); // 화면에서 입력받은 내용을 input에 저장
int num = Integer.parseInt(input); // 문자열(input)을 숫자(num)로 변환
Scanner scanner = new Scanner(System.in);
		
int num = scanner.nextInt();
int num2 = scanner.nextInt();
System.out.println(num);
System.out.println(num2);
	
String input = scanner.nextLine();
int num3 = Integer.parseInt(input);	System.out.println(num3);

Counter

오버플로우: 표현 가능한 범위를 넘는 것

최대값 + 1 --> 최소값
최소값 - 1 --> 최대값

형변환

기본형과 참조형 간의 형변환은 불가능하다.

자동 형변환

표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없으므로 두 타입 중에 표현범위가 더 넓은 쪽으로 형변환된다.
char와 short는 둘 다 2byte의 크기 이지만 범위가 서로 달라서 자동 형변환이 수행될 수 없다.

타입간의 변환방법

  1. 문자와 숫자간의 변환
    숫자 + '0' --> 문자
    문자 - '0' --> 숫자

  2. 문자열로의 변환
    숫자 + "" --> 문자열
    문자 + "" --> 문자열

  3. 문자열을 숫자, 문자로 변환
    Integer.parseInt("문자열") --> 숫자
    "문자열".charAt(0) --> 문자

String url = "www.codechobo.com";
float f1 = .10f; // 0.1
float f2 = 1e1f; //10.0
float f3 = 3.14e3f;//3140.0
double d =1.23456789;//1.23456789
	
    System.out.printf("f1=%f, %e, %g%n", f1, f1, f1);
	//0.100000, 1.000000e-01, 0.100000
	System.out.printf("f2=%f, %e, %g%n", f2, f2, f2);
	// 10.000000, 1.000000e+01, 10.0000
	System.out.printf("f3=%f,%e,%g%n",f3,f3,f3);
	//3140.000000, 3.14000e+03, 3140.00
	System.out.printf("d=%f%n", d);
	//d=1.234568
	System.out.printf("d=%14.10f%n",d);
	//d=  1.2345678900 전체14자리 중 소수점10자리
	System.out.printf("[12345678901234567890]%n");
	//[12345678901234567890]
	System.out.printf("[%s]%n",url);
	//[www.codechobo.com]
	System.out.printf("[%20s]%n",url);
	//[   www.codechobo.com]
	System.out.printf("[%-20s]%n",url);
	//[www.codechobo.com   ]
	System.out.printf("[%.8s]%n",url);
	//[www.code] 왼쪽에서 8글자만 출력

[참고 문헌]
https://velog.io/@tone8943/%EC%9E%90%EB%B0%94%EC%9D%98%EC%A0%95%EC%84%9D-2%EC%9E%A5
https://velog.io/@pjoon357/%EC%9E%90%EB%B0%94%EC%9D%98-%EC%A0%95%EC%84%9D-2%EC%9E%A5-%EC%A0%95%EB%A6%AC

profile
신입 백엔드 개발자입니다!

0개의 댓글