Chapter2

생성일: 2021년 9월 5일 오전 11:47

변수

변수란 단 하나의 값을 저장할 수 있는 메모리 공간.

변수의 초기화

변수를 사용하기 전에는 항상 변수를 초기화 해주어야 한다. (클래스 변수인스턴스 변수는 초기화를 생략할 수 있다.)

변수의 명명규칙

필수 규칙

  • 대소문자가 구분되며 길이의 제한이 없다. (True ≠ true) ac ≠ AC
  • 예약어(ex. if)를 사용할 수 없다
  • 숫자로 시작해서는 안된다
  • 특수문자는 _$ 만 허용한다.

권장 규칙

  • 클래스 이름의 첫 글자는 항상 대문자로 한다
  • 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다.
    • 카멜 케이스 : lastIndexOf (첫글자만 소문자 이후 단어마다 대문자로 시작)
    • 스네이크 케이스: last_index_of (단어마다 _를 사용)
    • 파스칼 케이스: LastIndexOf (모든 단어의 시작이 대문자)
  • 상수의 이름은 모두 대문자로 한다. 여러단어일 경우는 _를 사용하여 구분한다. (MAX_NUMBER)
  • 패키지 이름은 소문자로 한다

변수의 타입

변수의 타입은 크게 2가지로 나뉜다.

  • 기본형(primitive type)
    • 논리형(boolean), 문자형(char), 정수형(byte,short,int,long), 실수형(float,double) 계산을 위한 실제 값을 저장
  • 참조형(reference type)
    • 객체의 주소를 저장한다. 기본형을 제외한 나머지 타입 (변수 타입이 클래스)
    • 참조변수는 null 또는 객체의 주소를 값으로 가진다.
// 참조형의 선언
**클래스이름** 변수이름; -> 주소할당이전

// 참조형의 초기화
Date today = new Date(); // Date객체 생성후 주소를 today에 저장

기본형

상수(Constant) & 리터럴(literal)

상수란?

변수와 마찬가지로 '값을 저장할 수 있는 공간' 이지만 한번 값을 저장하면 다른 값으로 변경 불가능

상수를 사용하기 위해서는 final을 붙여주면 된다

final int MAX_SPEED = 10; 

MAX_SPEED = 11; -> (x)

상수를 사용할 때는 선언과 동시에 초기화를 항상 해줘야한다.

또한, 상수의 이름은 모두 대문자로 하는 것이 암묵적 관례이다.

리터럴(literal)이란?

그 자체로 값을 의미하는 것이다.

기본적으로 상수는 숫자 (1,221,123) 또는 문자 ('a','B')같이 그 자체로 값인 것을 의미 하는데 ****

프로그래밍에서의 상수는 따로 의미가 있기 때문에 리터럴이라는 단어를 사용하여 기본 상수의 의미를 구별하기로 하였다.

리터럴의 접미사

리터럴을 사용할 때는 항상 접미사를 붙여줘야한다.

// 정수형 접미사 사용 예제
long number = 10; // (x) -> 실행이 되긴함 권장 x
Long number = 10; // (x) -> 실행이 안됨
long number = 10L; // (o)
long number = 10_000L; // (o) JDK 1.7부터

//실수형 접미사 사용 예제
float pi = 3.14; // (x) 실수형의 기본 접미사는 double의 D이다
float pi = 3.14f; // (o)
float pu = 3.14F; // (o)

double rate = 1.618; // (o)
double rate = 1.168D; // (o)
double rate = 1.168d; // (o)

접미사 예제

타입이 불일치 할때

기본적으로 리터럴의 타입은 변수의 타입과 일치하는 것이 보통이지만 타입이 달라도 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용이 된다.

// 모두 큰 범위
int i = 'A'; // 65가 저장
long l = 123; 
double d = 3.14f

문자 리터럴 , 문자열 리터럴

  • 문자 리터럴
    • 작은 따옴표 (``)로 문자 하나를 감싼 것
    • 무조건 작은 따옴표 안에 적어도 하나의 문자를 넣어야한다
  • 문자열 리터럴
    • 큰 따옴표 ("")로 두 문자 이상 감싼것
    • 큰 따옴표 안에 문자가 없어도 된다
String str = ""; // 내용이 없는 빈 문자열
char ch = ''; // (x) 적어도 하나의 문자가 있어야한다
char ch = ' '; // 공백이 있기 때문에 (o)

String의 클래스 선언

String은 클래스 입으로 객체를 생성 할 때 new를 사용 해야하지만 그냥 할당도 특별히 허용된다

String name = new String("java"); 뿐만아닌 String name = "java" 도 허용한다.

문자열의 덧셈

문자열은 기본적으로 기본형과 참조형의 구별 없이 어떤 타입의 변수도 문자열과 덧셈 연산을 수행하면 문자열이 된다.

그렇기 때문에 문자열로 형변환을 시켜줄 때 ""만 더해줘도 문자열이 된다.

문자열 + Any Type = 문자열

// 예시
String name = "java";
String str = name + 0.8; // "java0.8"

int temp = 10;

Printf()

자바에서의 출력은 C언어와 비슷하다.

System.out.printf();를 사용하여 출력을 진행한다

지시자

Printf 예제

// 지시자 사용 예제
int age = 20;
System.out.printf("age:%d", age);

// 간격 맞추는법
System.out.printf("[%5d]",age); // [   20]
System.out.printf("[%05d]",age); // [00020]
System.out.printf("[%-5d]",age); //[20   ]

화면에서 입력받기

C언어에서 scanf를 사용하는것과 같이 자바에는 Scanner라는 객체가 있다.

사용하기 위해서는 import java.util.*; 를 import해야한다

그 후 Scanner 객체를 생성하고 nextLine()매소드를 호출하면 받을 수 있다.

// 사용 예제
import java.util.*; 
// 또는
import java.util.Scanner;

Scanner scanner = new Scanner(System.in); // 객체생성

String input = scanner.nextLine(); // input에 입력받는 내용 저장 문자열로 저장
int num = Integer.parseInt(input); // 입력받은 내용을 num에 int 타입으로 변환
// 숫자만 입력했을때 변환가능

//입력받자마자 변환 없이 정수로 받는법
int num = scanner.nextInt();

//입력 받자마자 실수로 받는법
float num = scanner.nextFloat();

//공백으로 받는법
String num = scanner.next(); 
int num = scanner.next(); // (x)반환형이다름

nextInt()nextFloat()매서드를 사용해 입력을 받으면 연속적인 값을 얻기 힘들기 때문에

nextLine()을 사용해서 받고 변환하여 사용하는 것을 책에서는 권장하고 있다.

진법 변환

  • 2의보수법을 사용하여 진법 변환을 한다.
  • 실수의 진법 변환
    • 10진 소수에 2를 곱한다
    • 위의 결과에서 소수부만 가져와서 다시 2를 소수부가 0이 될때까지 곱한다.
    • 나온 결과에서 정수부만 위에서 아래로 순서대로 적고 0.을 붙인다.
0.625를 변환

0.625 *2 = 1.25
0.25 * 2 = 0.5
0.5 * 2 = 1.0

0.101이 된다.

바이트 와 비트 와 워드

  • 8bit를 1Byte라 한다.
  • 1bit는 한자리의 2진수를 나타낸다.
  • 워드는 Cpu가 한번에 처리 할 수있는 데이터의 크기를 의미한다.
  • 32비트 컴퓨터의 워드는 4바이트이다.

문자형에서 유니코드 사용법

// 3 문장 다 '가'를 나타낸다.
char hch = '가';
char hch = 0xAC00;
char hch = '\uAc00';

// 특수문자 다룰 때는 c언어와 같다

// 2 문장은 같다
char ch = 'A';
char ch = 65;

오버플로우

  • 타입이 표현할 수 있는 값의 범위를 넘어서면 Overflow가 발생하면 제일 낮은값이 나온다.
  • 예를들어 2진수 0000에서 1을 뺴면 1111이 된다. 2의보수법으로 고쳐 표현하면 제일 낮은 값이 나온다.
  • 최대값 + 1 → 최소값 / 최소값 - 1 → 최대값

실수형에서의 오버플로우

  • 실수형은 저장할 수 있는 범위를 넘어나면 오버플로우가 발생하는데 정수형과 달리 변수의 값이 무한대가 된다.
  • 또한 언더플로우가 정수형과 달리 존재한다. → 자바에서 언더플로우 C언어랑
  • 실수형으로 표현할 수 없는 아주 작은 값을 넣었을 때의 변수의 값은 0이 된다.
  • float7자리 까지 double15자리 까지 표현이 가능하다.

실수형의 값 저장 방식

실수형은 값을 저장하기 위해서 부동소수점형태로 값을 저장한다.

부동소수점은 부호지수가수로 이루어져있다.

  • 부호
    • 1 bit를 차지하고 0이면 양수, 1이면 음수를 나타낸다
  • 지수
    • 부호가 있는 정수라고 생각하면 된다. 지수의 범위는 10의 n승 할때 제곱을 의미한다
    • flaot는 -127128까지 double은 -10231024까지 나타낸다.
  • 가수
    • 실제 값을 저장하는 부분으로 정밀도를 저장할 수 있다.
    • float는 2진수 23자리를 저장할 수 있다 = 약 7자리 (10진수로 고쳤을때)
    • double은 2진수 52자리를 저장할 수 있다. 약 15자리 (10진수로 고쳤을 때)

부동소숫점의 오차

  • 부동소수점은 기본적으로 2진수 이기 때문에 오차가 발생 할 수있다.
  • 파이 같은 무한소수를 정확하게 나타낼 수 없다.
  • 또는 예를들면 float같은 경우 7자리 수까지 밖에 나타내지 못하는데 7자리를 넘어가는 유한소수 일 경우에 오차가 발생 할 수 있다.

형변환(casting) 이란?

  • 형변환은 변수 또는 상수의 타입을 다른 타입으로 변환하는 것이다.

형변환을 하기 위해서는 변수나 리터럴 앞에 변환하고자 하는 타입을 괄호화 함께 붙여주면 명시적 형변환이 가능하다

double d = 85.4;
int score = (int)d; // 명시적 형변환

// 2진 정수로 변환한 문자열 얻는 법
Integer.toBinaryString(int i);

// 상수를 보다 작은 타입으로 변환 했을 때
double d = 1.0e100;
float f = (float)d; // INFINITY가 출력된다

double d = 1.e-50;
float f = (float)d; // 0.0이 출력된다.

// 실수형과 정수형의 변환
float f = 1.666;
int i = (int)f; // 1 **반올림이 되지 않는다**

자동형변환

서로 다른 타입간의 대입이나 연산을 할 때, 형변환으로 타입을 이치시키는 것이 원칙이지만 편의상 형변환을 생략할 수 있다. 이때 컴파일러가 이를 자동적으로 형변환 해주는 것을 자동형변환 이라고 한다.

자동 형변환은 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환 한다. 즉 표현 범위가 좁은 타입에서 넓은 타입으로 형변환이 된다.

int i = 3;
double d = 1.0 + i; // i 가 3.0으로 자동형변환 된다. 

Reference

자바의 정석

'Java > Java' 카테고리의 다른 글

[Java/Study] 오버라이드  (0) 2021.09.07
[Java/Study] 상속  (0) 2021.09.07
[Java/Study] 생성자  (0) 2021.09.07
[Java/Study] 변수와 메서드  (0) 2021.09.07
[Java/Study] 클래스와 객체  (0) 2021.09.06

+ Recent posts