[Java의 정석] Chapter 02 변수 variable

치즈말랑이·2021년 12월 28일
0

자바의 정석

목록 보기
1/3
post-thumbnail

2021-12-27~2021-12-28

[연습문제]

[2-1] 다음 표의 빈 칸에 8개의 기본형(primitive type)을 알맞은 자리에 넣으시오.

[2-2] 주민등록번호를 숫자로 저장하고자 한다. 이 값을 저장하기 위해서는 어떤 자료형(data type)을 선택해야 할까? regNo라는 이름의 변수를 선언하고 자신의 주민등록번호로 초기화 하는 한 줄의 코드를 적으시오.

리터럴 접미사 L 붙이기

[2-3] 다음의 문장에서 리터럴, 변수, 상수, 키워드를 적으시오.

  1. 변수 : 할당된 값을 저장하는 메모리 공간
  2. 상수 : 한번 할당된 값은 변경할수 없는 메모리 공간, read만 가능
  3. 리터럴 : 변수, 상수에 저장되는 값(그 자체로 값을 의미하는 것)
  4. 키워드 : 예약어

[2-4] 다음 중 기본형(primitive type)이 아닌 것은?

대소문자 구분

[2-5] 다음 문장들의 출력 결과를 적으세요. 오류가 있는 문장의 경우, 괄호 안에 '오류'라고 적으시오.

문자열과 덧셈연산을 하면 그 결과는 항상 문자열이 된다.
true + "" -> "true" + "" -> "true"
"1" + "2" -> "12"
'1' + '2' -> 49+50 -> 99
'A' + 'B' -> 65+66 -> 131

[2-6] 다음 중 키워드가 아닌 것은? (모두 고르시오)

키워드는 다 소문자

[2-7] 다음 중 변수의 이름으로 사용할 수 있는 것은? (모두 고르시오)

변수의 이름 규칙
1. 대소문자가 구분되며 길이에 제한이 없다.
2. 예약어를 사용해서는 안된다.
3. 숫자로 시작해서는 안된다.
4. 특수문자는 '_'와 '$'만을 허용한다.

[2-8] 참조형 변수(reference type)와 같은 크기의 기본형(primitive type)은? (모두 고르시오)

모든 참조형 변수는 4 byte

[2-9] 다음 중 형변환을 생략할 수 있는 것은? (모두 고르시오)

데이터 범위 판단

[2-10] char 타입의 변수에 저장될 수 있는 정수 값의 범위는? (10진수로 적으시오)

[2-11] 다음중 변수를 잘못 초기화 한 것은? (모두 고르시오)

char는 반드시 한 개의 문자를 지정해야 함
char에 두 개의 문자를 저장할 수 없음
접미사 반드시 붙여야함

[2-12] 다음 중 main메서드의 선언부로 알맞은 것은? (모두 고르시오)

매개변수 args의 이름은 달라도 된다.
void는 반드시 main앞에 와야 한다.
public과 static은 위치가 바껴도 된다.
배열을 의미하는 []는 타입 뒤에 와도 되고 변수명 뒤에 와도 된다.

[2-13] 다음 중 타입과 기본값이 잘못 연결된 것은? (모두 고르시오)

접미사 주의, String은 참조형 타입이고, 모든 참조형 타입의 기본값은 null

1. 변수(variable)

변수: 단 하나의 값을 저장할 수 있는 메모리 공간
int(변수타입) age(변수이름);
변수를 선언한 후 사용하기 전에 반드시 초기화(initialization)해야 한다.
메모리는 여러 프로그램이 공유하는 자원이므로 다른 프로그램에 의해 garbage value가 남아있을 수 있기 때문이다.
변수 초기화: 변수를 사용하기 전에 처음으로 값을 저장하는 것

변수의 명명규칙
1. 대소문자가 구분되며 길이에 제한이 없다.
-True와 true는 서로 다른 것으로 간주된다.
2. 예약어를 사용해서는 안된다.
-true는 예약어라서 사용할 수 없지만, True는 가능하다.
3. 숫자로 시작해서는 안 된다.
-top10은 허용하지만, 7up은 허용되지 않는다.
4. 특수문자는 '_'와 '만을허용한다.'만을 허용한다. -harp는 허용되지만, S#arp는 허용되지 않는다.

자바 프로그래머 규칙
1. 클래스 이름의 첫 글자는 항상 대문자로 한다.

  • 변수와 메서드의 이름의 첫 글자는 항상 소문자로 한다.
  1. 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다.
  • lastIndexOf, StringBuffer
  1. 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_'로 구분한다.
  • PI, MAX_NUMBER

2. 변수의 타입

자료형(data type) - 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)
자료형은 크게 기본형과 참조형 두가지로 나눌 수 있다.
기본형 : 실제 data를 저장

참조형 : 어떤 값이 저장되어 있는 객체의 주소(memory address)를 값으로 갖는다.
참조형 변수 간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수이다. 참조형 변수를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 참조변수의 타입이 된다. 그래서 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 셈이다.

클래스이름 변수이름; // 변수의 타입이 기본형이 아닌 것들은 모두 참조변수이다.

Date today = new Date(); // Date객체를 생성해서, 그 주소를 today에 저장

객체를 생성하는 연산자 new의 결과는 생성된 객체의 주소이다. today는 참조변수

정수형(byte, short, int, long) 범위: -2^(n-1)~2^(n-1)-1, n은 bit 수
정밀도: float - 7자리, double - 15자리

상수: 변수와 마찬가지로 값을 저장할 수 있는 공간이지만 변수와 달리 한번 값을 저장하면 다른 값으로 변경할 수 없다. 변수의 앞에 키워드 final을 붙여주면 된다. 상수는 선언과 동시에 반드시 초기화 해야하고 그 후부터는 값 변경이 안된다. 상수의 이름은 모두 대문자로 하는 것이 암묵적인 관례이고, 여러 단어로 이루어져 있는 경우 '_'로 구분한다.

리터럴: 그 자체로 값을 의미하는 것
기존에 우리가 부르던 12, 123, 3.14, 'A'와 같은 값들이 상수이지만 프로그래밍에서는 상수를 다르게 정의했기 때문에 기존에 상수라고 부르던 것들을 리터럴 이라는 다른 이름으로 부른다.

리터럴의 접미사
정수형: L(long)
실수형: f(float), d(double)

문자 리터럴과 문자열 리터럴
'A'와 같이 작은따옴표로 문자 하나를 감싼 것을 '문자 리터럴' 이라고 한다.
두 문자 이상은 큰 따옴표로 감싸야 하며 '문자열 리터럴'이라고 한다.
문자열은 '문자의 연속된 나열' 이라는 뜻이며, 영어로 string이라고 한다.

char ch = 'J';
String name = "Java";
String str = "";
String name = new String("java");

문자열 리터럴은 안에 아무런 문자도 넣지 않는 것을 허용하며 이를 빈 문자열(empty string)이라고 한다. 그러나 문자 리터럴은 안에 하나의 문자가 있어야 한다. 원래 String은 클래스이므로 객체를 생성하는 연산자 new를 사용해야 하지만 특별히 위와 같은 표현도 허용 한다.

형식화된 출력 - printf
println()은 괄호 안 그대로 출력
printf()는 지시자를 쓰면 다른 형식으로 출력 가능

System.out.printf("age:%d", age);

double d = 1.23456789;
System.out.printf("d=%14.10f%n", d);
//전체 14자리 중 소수점 아래 10자리

화면에서 입력받기 - Scanner

Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();

3. 진법

1 byte = 8 bit
1 word = 4 byte
워드 : cpu가 한번에 처리할 수 있는 데이터의 크기

10진수를 n진수로 변환하기 위해서는 더이상 나눌 수 없을 때까지 해당 진수로 나누고 몫부터 나머지를 아래부터 위로 순서대로 적으면 된다.

10진 소수를 2진 소수로 바꾸는 방법
1. 10진 소수에 2를 곱한다
0.625x2 = 1.25
2. 위의 결과에서 소수에만 다시 2를 곱한다.
0.25x2 = 0.5
3. 소수가 없어질때까지 반복한다.
0.5x2=1.0
위의 결과에서 정수만 위에서 아래로 순서대로 적고 0.을 앞에 붙이면 된다.
0.625 -> 0.101

2진 소수를 10진 소수로 바꾸는 방법
0. 1 0 1
0. 2^-1 2^-2 2^-3
1/2+1/8=0.625

2의 보수법
n의 보수: 더했을 때 n이 되는 수
2의 보수 관계에 있는 두 2진수를 더하면 자리올림이 발생하고 0이 된다.
2의 보수=1의보수+1
쉽게말해서 음수 2진수를 나타내고 싶으면 0과 1을 바꾸고 1을 더한다.
-11 이면 절대값 씌워서 11을 만들고 2진수로 바꾸면 01011
0과 1을 바꾸면 10100이고 1을 더하면 10101이다.

4. 기본형(primitive type)

논리형 - boolean
기본값(default)은 false이다.
true, false

문자형 - char
하나의 문자만을 저장할 수 있고 문자의 유니코드(정수)가 저장된다.

char ch = 'A';
char ch = 65;
// 동일한 결과

int code = (int) ch; // 유니코드를 알 수 있다.

16비트로 표현할 수 있는 정수의 개수: 2^16개 (65536)
short타입의 표현 범위: -2^15~2^15-1(-32768~32767)
char타입의 표현 범위: 0 ~ 2^16-1(0~65535)

인코딩과 디코딩
인코딩: 문자를 코드로 변환
디코딩: 코드를 문자로 변환

아스키: American Standard Code for Information Interchange
미국표준코드, 2^7=128개의 문자 집합을 제공하는 7bit 부호
처음 32개의 문자는 인쇄와 전송 제어용으로 사용되는 제어문자로 출력할수 없다
마지막 문자(DEL)를 제외한 33번째 이후의 문자들은 출력할 수 있는 문자들로 기호와 숫자, 영대소문자로 이루어져 있다.

확장아스키
아스키는 1byte보다 1비트가 남으므로 거기에 문자를 추가로 정의한 것이다
하지만 확장 아스키로도 한글을 표현하기에는 역부족이라서 두개의 문자코드로 한글을 표현한다. 확장완성형 CP949

코드페이지(Code Page, CP)
여러 버전의 확장 아스키 버전

유니코드
21bit로 확장되었고, 새로 추가된 문자들을 보충문자 라고 하는데 char타입이 아니라 int타입을 쓴다.
자바에서는 UTF-16을 사용한다.
UTF-16: 모든 문자를 2byte의 고정 크기로 표현
UTF-8: 하나의 문자를 1~4byte의 가변크기로 표현한다.
두 인코딩 모두 처음 128문자가 아스키와 동일하다. 즉, 아스키를 포함하고 있다. UTF-16은 1byte로 표현할 수 있는 영어와 숫자도 2byte로 표현해서 문서의 크기가 크다. UTF-8은 문서의 크기가 작지만 다루기 어렵다. 인터넷은 전송속도가 중요하므로 문서의 크기가 작을수록 유리해서 UTF-8을 주로 사용한다.

정수형 - byte, short, int, long
모든 정수형은 부호가 있으므로 왼쪽의 첫번째 비트를 부호비트(sign bit)로 사용하고 나머지는 값을 표현하는데 쓴다.
n비트로 표현할 수 있는 정수의 개수: 2^n개
표현할 수 있는 정수의 범위: -2^(n-1)~2^(n-1)-1

오버플로우: 타입이 표현할 수 있는 값의 범위를 넘어서는 것
최소값-1-> 최대값
최대값+1-> 최소값

실수형 - float, double
정수형과 실수형은 값 저장 형식이 다르다.
int: 1+31=32bit
S(1), 31bit
float: 1+8+23=32bit
S(1), 지수 E(8), 가수 M(23)
double: 1+11+52=64bit
S(1), 지수 E(11), 가수 M(52)

profile
공부일기

0개의 댓글