본문 바로가기

기술 서적/자바의 정석

[자바의 정석] ch2. 변수

1. 변수

더보기

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

 

변수의 선언

int(변수의 타입) age(변수의 이름)

변수타입 : 변수에 저장될 값의 자료형

변수이름 : 저장된 메모리공간의 이름

 

=> 변수가 선언되면 변수타입에 알맞은 저장공간이 확보됨

=> 앞으로 이 저장공간은 변수이름을 통해 사용

 

변수의 초기화

'int age=25;

-지역변수의 경우 무조건 초기화를 해주어야 한다.

ex)

public class Main {
    public static void main(String[] args)
    {
        int year=0;
        int age=14;

        System.out.println(year);
        System.out.println(age);

        year=age+2000;
        age+=1;
        System.out.println(year);
        System.out.println(age);
    }
}

 

=>결과

0
14
2014
15

 

>>변수의 명명규칙

1. 대소문자 구분
2. 길이제한x
3. 예약어 사용x
4. 숫자로 시작 x
5. 특수문자는 _ / $만 허용

 

>프로그래머들에게 권장되는 규칙

1) 첫글자 :  클래스(대문자) vs 변수와 메소드(소문자)

2) 여러 단어로 이루어진 이름은 단어의 첫글자를 대문자로 함
- curPos/ lastPos

3) 상수 이름은 모두 대문자로, 여러 단어로 이루어지면 _로 구분
- PI / MAX_NUMBER

 

 

 

2. 데이터 타입

더보기

>>변수의 타입

 

>> 기본형과 참조형

기본형 : data를 저장하는 변수 -논리 문자 정수 실수형

참조형 : memory address를 저장하는 변수

 

ex)참조형 예시

Date today = new Date();

 

>>기본 자료형의 크기

 

>>상수와 리터럴

 

final int MAX_SPEED =10;

- 변수 타입 앞에 final을 붙임

- 반드시 선언과 동시에 초기화

- 한번 선언하면 값을 바꿀 수 없음

- 리터럴에 의미를 부여하여 이해+수정을 쉽게 만듦

 

>>리터럴의 타입과 접미사

: 디폴트 타입과 다른 타입을 선언해야할 때 주로 사용

ex) Long, Float

float pi =3.14 //에러 : default인 8byte double을 4byte float에 저장하려 했기에

=>수정
float pi = 3.14f

 

>>타입의 불일치

 

-상황1) 타입의 값이 변수의 타입범위를 넘어설 때

ex) int i= 0x123456789;

 

상황2) 리터럴의 타입이 변수의 타입보다 넓을 때

ex) float f=3.14(double)

 

>>문자와 문자열 리터럴

 

문자 : char ch ='J'  (단 하나만 저장 가능)

문자열: String name ="Java"

 

#문자는 안에 반드시 하나의 문자가 있어야 하나, 문자열은 빈문자열 가능

String str ="" // OK
char ch =''    // 에러! 반드시 하나의 문자 포함
char ch=' '   // 공백문자로 처리

 

- 문자열과의 결합은 문자열이 되며 연산순서에 영향을 받음

 

>>형식화된 출력 - printf()

:지시자를 이용해 변수의 값을 여러가지 형식으로 변환 가능

: printf 줄바꿈 문자가 없기에 마지막에 %n을 넣음 

 

ex)정수형 출력

public class PrintfEx1 {
    public static void main(String [] args)
    {
        byte b=1;
        short s=2;
        char c='A';

        int finger=10;
        long big=100_000_000_000L;
        long hex=0xFFFF_FFFF_FFFF_FFFFL;

        int octNum= 010;
        int hexNum =0x10;
        int binNum=0b10;

        System.out.printf("b=%d%n", b);
        System.out.printf("S=%d%n", s);
        System.out.printf("c=%c, %d %n", c, (int)c);
        System.out.printf("finger = [%5d]%n" ,finger);
        System.out.printf("finger = [%-5d]%n" ,finger);
        System.out.printf("finger = [%05d]%n" ,finger);

        System.out.printf("big =%d%n" ,big);
        System.out.printf("hex = %#x%n%n" ,hex);
        System.out.printf("octNum = %o, %d%n" ,octNum, octNum);
        System.out.printf("hexNum = %x, %d%n" ,hexNum, hexNum);
        System.out.printf("binNum = %s, %d%n" ,Integer.toBinaryString(binNum), binNum);


    }
}

 실행결과

b=1
S=2
c=A, 65 
finger = [   10]
finger = [10   ]
finger = [00010]
big =100000000000
hex = 0xffffffffffffffff

octNum = 10, 8
hexNum = 10, 16
binNum = 10, 2

 

=>C언어에서는 char 타입의 값을 지시자 %d로 출력가능했지만, 자바에서는 허용x

=> 꼭 형변환을 해주어야 함

 

System.out.printf("c=%c, %d%n", c, (int)c)

 

>>실수형 출력예제

public class PrintfEx2 {
    public static void main(String [] args)
    {
        String url="www.codechobo.com";

        float f1= .10f;
        float f2=1e1f;
        float f3= 3.14e3f;
        double d= 1.23456789;

        System.out.printf("f1= %f, %e, %g%n", f1, f1, f1);
        System.out.printf("f2= %f, %e, %g%n", f2, f2, f2);
        System.out.printf("f3= %f, %e, %g%n", f3, f3, f3);

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

        System.out.printf("[12345678901234567890]%n");
        System.out.printf("[%s]%n", url);
        System.out.printf("[%20s]%n", url);
        System.out.printf("[%-20s]%n", url);
        System.out.printf("[%.8s]%n", url);



    }
}

 

 >>실행결과

f1= 0.100000, 1.000000e-01, 0.100000
f2= 10.000000, 1.000000e+01, 10.0000
f3= 3140.000000, 3.140000e+03, 3140.00
d= 1.234568
d=  1.2345678900
[12345678901234567890]
[www.codechobo.com]
[   www.codechobo.com]
[www.codechobo.com ]
[www.code]

 

 

>>화면에서 입력받기 : Scanner

- 라이브러리 호출 import java.util.*

- 객체 생성 : new Scanner(System.in)

- .nextLine() :입력 대기 상태에 있다가 엔터키를 누르면 반환됨

 

import java.util.*; //라이브러리 호출

public class Scannerex1 {
    public static void main(String [] args)
    {
        Scanner scanner = new Scanner(System.in); //scanner객체 생성

        System.out.print("두자리 정수를 하나 입력해주세요.>");
        String input = scanner.nextLine(); //nextLine() 메소드 활용
        int num= Integer.parseInt(input); //Integer.parseInt를 통해 정수로 변환
        System.out.println("입력 내용: "+input);
        System.out.printf("num=%d%n", num);


    }
}

 

3. 진법

더보기

>>비트와 바이트

비트 : 컴퓨터가 값을 저장하는 최소단위 (0 or 1)

바이트 : 비트 8개를 묶은 것

 

워드 : CPU가 한번에 처리할 수 있는 데이터의 크기

=> CPU성능에 따라 다름

=> 32bit CPU에서 1word=32bit

=> 64bit CPU에서 1word=64bit

 

>>실수의 진법변환

https://woo-dev.tistory.com/93

 

소수점 이진수로 변환하는 법 | 소수점 이진법

ex) 68.625 -> ??? 1. 정수부(68)는 그대로 이진수로 변환한다. 64 + 4 -> 100 0100 2. 소수부(0.625)만 가져온다. 0.625 3. 소수부에 2를 곱하는데 그 결과가 1로 떨어질 때까지 혹은 똑같은 소수점이 나올 때까지

woo-dev.tistory.com

 

>>2의 보수법

https://jamanbbo.tistory.com/52

 

2의보수법 개념정리

10진수에도 양수 1이 있고 음수 1이 있듯이 2진수에도 음수가 존재한다. 먼저, 어떤 수의 'n의 보수'는 어떤 수에 더했을 때 n이 되는 수이다.7의 10의 보수는 3이다. 7+3 = 103의 10의 보수는 7이다. 3+7 =

jamanbbo.tistory.com

 

[음수의 2진 표현을 구하는 방법]
1) 음수의 절대값을 2진수로 변환한다 ex)-5를 5로 변환
2) 1의 보수를 구한다 ex) 0101 -> 1010
3) 1을 더한다. ex) 1011 ==-5

 

4. 기본형

더보기

4-1.논리형

: true / false(디폴트)

: 대소문자 구분 -> true <> TRUE

 

4-2.문자형-char

: 유니코드를 사용하기 때문에 2byte

: 문자 자체가 아닌 문자의 유니코드가 저장

 : 음수를 표현할 필요가 없으므로 저장범위가 다름

 

#문자의 유니코드를 알아내는 법

int code= (int )ch

 

>특수문자 다루기

특수문자 문자 리터럴
\t tab
\b back space
\f form feed
\n new line
\r carrige return
\\ 역슬래쉬
\' 작은 따음표
\" 큰따음표
\u유니코드 유니코드

 

>>인코딩과 디코딩

- 인코딩 : 문자-> 코드

- 디코딩 : 코드->문자

 

>> 문자 인코딩 방식

 

1) 아스키

: 128개의 문자집합

: 7bit

: 0-9 / a-z가 연속적으로 배치되어 있음

 

2) 확장 아스키

: 남은 1bit를 활용하여 문자를 추가정의

: 한글을 표현하기엔 어려움 -> 조합형 / 완성형

: 조합형 - 초성, 중성, 종성을 조합하여 표현

: 완성형 - 하나의 완성된 글자를 표현

 

=> 완성형인(CP949)를 사용

 

-- 코드 페이지

: 확장 아스키를 도입할 때, 국가에 따라 여러 버전의 확장 아스키가 필요

: 이를 코드페이지라 하고 CP XXX라 명명함

: 한글 윈도우는 CP949 / 영문 윈도우는 CP439

 

4) 유니코드

-국가간 문서교환 활발

- 어려움 해소를 위해 문자를 하나의 통일된 집합으로 표현

- 자바가 사용하는 유니코드 : UTF-16

 

--UTF-16 vs UTF-8

: UTF-16 : 문자를 2byte의 고정길이로 표현 -> 편하지만 문서의 크기가 커짐

: UTF-8  : 문자를 1-3byte의 가변길이로 표현 => 어렵지만 문서의 길이를 줄임

=> 웹은 전송속도가 중요하므로 문서크기를 줄일 수 있는 UTF-8을 주로 사용

 

 

4.3) 정수형

정수형의 오버플로우

=> 부호가 있는 경우 : 부호비트가 0->1이 될 때 오버플로우 발생

public class overflowex {
    public static void main(String []args)
    {
        short SMin =-32768;
        short SMax =32767;
        char cMin=0, cMax=65535;

        System.out.println("sMin = "+SMin);
        System.out.println("sMin -1= "+(short)(SMin-1));
        System.out.println("sMax = "+SMax);
        System.out.println("sMax+1 = "+ (short)(SMax+1));
        System.out.println("cMin = "+(int)cMin);
        System.out.println("cMin-1 = "+ (int)(--cMin));
        System.out.println("cMax = "+(int)cMax);
        System.out.println("cMax+1 = "+(int)(++cMax));



    }

}

 

=>실행결과

sMin = -32768
sMin -1= 32767
sMax = 32767
sMax+1 = -32768
cMin = 0
cMin-1 = 65535
cMax = 65535
cMax+1 = 0

 

 4.4 실수형

 

>>저장방식 :기저법 기억하기

출처 : https://zapiro.tistory.com/entry/4-byte-float-format-float-%ED%98%95%EC%9D%98-%EC%8B%A4%EC%88%98-%EC%A0%80%EC%9E%A5-%EB%B0%A9%EC%8B%9D

 

 

4 byte float format (float 형의 실수 저장 방식)

일반 정수형 자료형은 보수법을 이용해 음수와 양수를 저장하지만, 실수형 자료형인 float 는 부동 소수점 방식과 부호 비트 방식을 사용하여 데이터를 저장합니다. float 자료형은 4 bytes의 크기

zapiro.tistory.com

 

=> 필연적으로 오차가 발생(정밀도)

=> float의 정밀도 : 7 / double의 정밀도 : 15

 

 

5. 형변환

더보기

형변환 : 변수/상수의 타입을 다른 타입으로 변환하는 것

 

>>형변환의 방법

(타입) 피연산자

-기본형 <=>참조형은 불가능

 

>>실수형 간의 형변환

 

- float => double

가수부분의 빈자리가 0으로 채워짐 == 정밀도에는 차이가 없음

 

- double=> float

24자리 가수부터 버려지는데 반올림하여 자름

== 24번째 자리에서 반올림이 발생 가능

public class CastingEx3 {

    public static void main(String []args)
    {
        float f= 9.123456789f;
        double d= 9.1234567;
        double d2= (double)f; //float->double로 형변환

        System.out.printf("f= %20.18f\n", f);
        System.out.printf("d= %20.18f\n", d);
        System.out.printf("d2= %20.18f\n", d2);
    }
}

 

=>실행결과

f= 9.123456954956055000
d= 9.123456700000000000
d2= 9.123456954956055000 

=> double로 형변환해도 가수부분이 0으로 채워졌기에 정밀도 차이x

 

>>정수형과 실수형 간의 형변환

 

주의1) 정수 ->실수

- 정밀도 차이로 만약 8자리 이상의 값을 실수형으로 변환할시 double활용

 

주의2) 실수->정수

- 실수의 저장범위가 더 크므로, 만약 범위가 넘었다면 오버플로우 발생

 

>>자동 형변환 : 기존의 값을 최대한 유지할 수 있는 방향으로

형변환의 방향성
 1. boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능함
2. 기본형과 참조형은 서로 형변환이 불가능
3. 값의 범위가 작은 타입 -> 큰 타입은 생략이 가능