CH02

yeon·2022년 11월 7일
0

이것이자바다

목록 보기
1/15

1. 변수

변수

하나의 값을 저장할 수 있는 메모리 공간으로 프로그램 실행 도중에 필요한 데이터를 저장해놓는 공간을 의미

명명규칙

Java는 Camel Case 명명 규칙을 따라 첫 문자는 소문자, 그 이후에 연결되는 문자의 첫자는 대문자로 표기
예 : camelCase

대소문자 구분이 되기 때문에 같은 뜻의 단어더라도 대소문자가 다르면 서로 다른 변수로 인식
예 : camelCase, calmelcase

이름을 지을 때에는 숫자를 먼저 입력 불가

유형설명예시
Class대문자로 시작, 주로 명사class Thread
class Person
Interface대문자로 시작, 주로 형용사interface Runnable
Method소문자로 시작, 주로 동사add()
run()
setId()
Variable소문자로 시작int age;
String name
String studentNumber
package소문자로 구성com.example.util
Constant대문자로 구성static final int PI = 3.1415

변수 초기화

선언만 한 경우

자바에서는 변수 선언 위치에 따라 선언만 했을 때, 초기화되지 않는 경우와 초기화되는 경우가 나뉜다
이는 각 변수의 생성 시기와 관련이 있는데, 자바에는 클래스 변수, 인스턴스 변수, 지역 변수가 있다

class StudentOfOneHighSchool{
	int studentNumber; // 인스턴스 변수
    static int schoolNumber; //클래스 변수
    boolean isFreshMan(){
    	boolean isTrue = false; //지역 변수
        //...
    }
}
  • 클래스 변수
    • 모든 인스턴스가 동일한 값을 가져야할 때 사용하는 변수, 즉 모든 인스턴스가 공유하는 변수
    • 클래스 안에서 선언되며, 클래스가 메모리에 올라갈 때 메모리를 할당 받음
    • 클래스가 로딩될 때 생성되어 딱 한 번만 메모리를 할당받고, 종료될 때까지 유지되는 변수
  • 인스턴스 변수
    • 각 인스턴스 마다 고유의 값을 가져야할 때 사용하는 변수
    • 클래스 안에서 선언되며, 인스턴스가 선언될 때 메모리를 할당 받음
    • 인스턴스 변수 값을 가져오려면 이 전에 선언되고 초기화되어 있어야 함
  • 지역 변수
    • 클래스 외의 영역인 메소드, 생성자, 초기화블록 등에서 선언되며, 변수 선언문이 수행될 때 메모리를 할당 받음
    • 변수 설정 시 메모리에 할당되며 해당 블록이 종료되면 메모리 해제됨

전역 변수에 해당하는 클래스 변수, 지역 변수는 클래스, 인스턴스가 생성될 때 메모리에 같이 할당되기 때문에 기본값으로 묵시적 초기화
지역 변수는 메서드 등 안에서 생성되어 사용되어야하는데 이 경우 선언 후, 초기화하지 않고 사용 시 컴파일/런타임 오류 발생

선언 및 초기화

  • 명시적 초기화
int value = 10; //기본형 자료형의 명시적 초기화
Person person = new Person(); //참조형 자료형의 명시적 초기화
  • 생성자
class Person{
	int cnt;
    String type;
	int age;
    String studentNumber;
    
    Person(int age, String studentNumebr){
    	this.cnt++;
        this.type="a";
    	this.age = age;
        this.studentNumber = studentNumber;
    }
    Person(int age){
    	this.cnt++;
        this.type="a";
        this.age = age;
        this.studentNumber = "123456";
    }
}
  • 초기화 블럭
    • 인스턴스 초기화 블럭
      static {}
    • 클래스 초기화 블럭
      {}
      두 초기화 블럭의 차이점은 클래스 선언 시 딱 한 번만 사용되는 블럭인지, 인스턴스가 생성될 때마다 사용되는 블럭인지
class Person{
	int cnt;
    String type;
	int age;
    String studentNumber;
    
    {
    	this.cnt++;
        this.type="a";
    }
    
    Person(int age, String studentNumebr){
    	this.age = age;
        this.studentNumber = studentNumber;
    }
    Person(int age){
        this.age = age;
        this.studentNumber = "123456";
    }
}

리터럴(literal)

  • 소스 코드 내에 직접 입력된 값 ( 정수 / 실수 / 문자 / 문자열 / 논리 리터럴 )
  • 변수에 저장되거나 연산식에 이용되는 값을 의미함

❶ 정수 리터럴

byte, char, short, int, long 변수에 저장할 수 있음
1. 10진수 소수점이 없는 정수
2. 8진수 0으로 시작되는 정수
3. 16진수 0x, 0X로 시작하고 0~9, A~F/a~f로 구성된 정수

❷ 실수 리터럴

float, double 변수에 저장할 수 있음
1. 10진수 실수 소수점이 있는 수
2. 10진수 지수와 가수 E/e가 있는 수

❸ 문자 리터럴

char 변수에 저장할 수 있음
1. 작은 따옴표로 묶은 텍스트, 단 하나의 문자열만을 문자로 취급
2. ₩가 붙은 문자리터럴은 특수용도

이스케이프 문자용도
₩t수평 탭
₩n줄 바꿈
₩r리턴
₩"큰 따옴표
₩'작은 따옴표
₩₩
₩u(16진수)16진수에 해당하는 유니코드

₩n, ₩r의 차이점

  • ₩n : 개행, 커서의 위치를 다음줄로 이동
  • ₩r : 커서의 위치를 현재 줄의 맨 앞으로 이동

❹ 문자열 리터럴

String 변수
에 저장할 수 있음
1. 큰 따옴표로 묶인 텍스트, 문자열 리터럴 내부에서 이스케이프 문자 사용 가능

❺ 논리 리터럴

boolean에 저장할 수 있음
1. true
2. false

변수의 사용 범위

변수는 선언된 블록 내에서만 사용이 가능하다
1. 메소드 블록 안에서 선언된 경우에는 해당 메소드에서만 사용 가능하며, 다른 메소드에서는 사용할 수 없다.
2. if, for 블록 안에서 선언된 경우, if문/for문 안에서만 사용 가능하며 각 조건문, 반복문을 벗어난 경우 사용할 수 없다
3. class 블록 안에서 선언된 경우, 해당 class에서만 사용 가능한 지역 변수가 된다.


2. 데이터 타입

기본 타입

종류기본 타입메모리 사용 크기(byte(bit))값의 범위
정수byte
char
short
int
long
1byte(8bit)
2byte(16bit)
2byte(16bit)
4byte(32bit)
8byte(64bit)
-128~127(27-2^7 ~ 2712^7-1)
0~65535(0 ~ 21612^{16}-1)
-32768~32767(215-2^{15} ~ 21512^{15}-1)
231-2^{31} ~ 23112^{31}-1
263-2^{63} ~ 26312^{63}-1
실수float
double
4byte(32bit)
8byte(64bit)
±\pm 1.4E-45 ~ ±\pm 3.4E38
±\pm 4.9E-324 ~ ±\pm 1.7E308
논리boolean1byte(8bit)true, false

byte, short, int, long, float, double의 최상위비트는 부호비트로 0은 양수, 1은 음수를 의미하기 때문에 수를 표현할 수 있는 자리수는 할당된 byte - 1이 됨

정수 타입

❶ byte
부호 있는 정수값 저장하며, 값의 범위를 초과한 경우 최소값(-128)부터/최대값(127)부터 다시 반복 저장

비트 연산 생각해보면
(127 + 1) 01111111 + 00000001 => 1000000 = -128
(-128 - 1) 10000000 - 00000001 => 01111111 = 127

❷ char
하나의 문자를 유니코드로 저장하기 때문에 정수형으로 간주하며, 부호가 없는 정수값을 저장

문자유니코드(16진수)2진수10진수
A0x004100000000 0100000165
B0x004200000000 0100001066
0xAC0010101100 0000000044032

❸ short
부호가 있는 정수값을 저장하며, C언어와의 타입 호환을 위해서 사용됨

❹ int
부호가 있는 4byte 크기의 정수값을 저장, 10/8/16진수 저장 가능
메모리에 저장될 때는 2진수로 저장되며 4byte 크기를 차지하기 때문에 32bit로 표현되어 저장됨
예 : 10 -> 00000000 00000000 00000000 00001010

❺ long
8byte 크기의 부호가 있는 정수값을 저장, int 범위를 벗어나는 정수리터럴을 대입할 경우 L/l을 붙여야 함

실수 타입

부동 소수점 (floating-point) 방식으로 저장하며 지수 비트, 가수 비트로 나뉘어 저장됨
지수, 가수 비트로 나뉘어 표현하는 방식을 통해 동일한 메모리 크기를 가지는 int / long 보다 더 큰 수를 저장할 수 있음
기본 타입은 double이기 때문에 float 리터럴은 F/f를 붙여 구분

❶ float
부호 비트 (1) + 지수 비트 (8) + 가수 비트 (23)

❷ double
부호 비트 (1) + 지수 비트 (11) + 가수 비트 (52)

논리 타입

1 byte 크기를 가지며 true / false를 저장해 두 가지 상태값을 가질 수 있음


3. 타입 변환

타입 변환

데이터 타입을 다른 타입으로 변환하는 것

자동(묵시적) 타입 변환

따로 타입을 명시하지 않아도 알아서 변환
작은 타입을 큰 타입으로 변환할 때 적용됨
byte(1) -> short(2) -> int(4) -> long -> float -> double
char(2) -> int(4)

강제(명시적) 타입 변환

따로 타입을 명시해야만 강제적으로 타입이 변환
큰 타입을 작은 타입 단위로 쪼개고 끝 한 부분만 작은 타입으로 강제 변환함

4 byte 크기의 int 타입 변수를 1 byte 크기의 byte 타입으로 변환한다면 마지막 1byte만 byte 형으로 강제 변환

값이 손실되는 걸 방지하기 위한 검사

 if(i < Byte.MIN_VALUE || i > Byte.MAX_VALUE){
 	System.out.println("변환 불가");
 }else{
  	byte b = (byte) i;
     System.out.println(b);
 }
  • int 타입의 변수를 float으로 강제 타입 변환할 경우 정밀도 손실 발생할 수 있음
    이유 : float의 경우 부호 1bit, 지수 8bit, 가수 23비트 -> int(32bit) 보다 작은 가수 크기

연산식에서의 자동 타입 변환

같은 타입의 피연산자 사이에서만 연산이 수행되기 때문에 서로 다른 타입의 피연산자는 같은 타입, 크기가 큰 타입으로 자동 변환되어 연산됨
작은 타입으로 연산하고 싶다면 강제 변환

int 이하의 타입 연산

int result = a + b;
// a : byte | char | short | int
// b : byte | char | short | int

long 타입 연산

long result = a + b;
// a : long
// b : byte | char | short | int | long

double 타입 연산

double result = a + b;
// a : 실수 리터럴 | double
// b : byte | char | short | int | float | double

float 타입 연산

float result = a + b;
// a : float
// b : float
profile
🐥

0개의 댓글

관련 채용 정보