0611. 리터럴 문법과 숫자표기법

.java 파일과 .class 파일

클래스 블록과 컴파일

Hello.java -> 컴파일 -> Hello.class

ex.  Exam0120.java -> classA{ } classB{ } classC{ }

자바는 소스파일 이름으로 클래스파일을 만드는 것이 아니라 파일 내의 클래스 이름으로 만듦

각각 클래스 단위로 컴파일 → 클래스별로 클래스파일 생성

⇒ A.class, B.class, C.class 세개의 클래스 생성

class X -> X.clas

클래스 이름과 소스파일 이름

보통은 소스파일명과 파일 내 클래스명이 일치 → 다르면 컴파일 오류 발생

비공개 클래스는 달라도 오류 발생X

클래스명과 파일명이 다르면 class 파일명은 소스파일 내 클래스명을 따름

클래스명 시작은 무조건 대문자

  • 공개 클래스 → public class 클래스명 { ... }

  • 비공개 클래스 → class 클래스명 { ... }

    	ex. Exam0220.java – public class Exam2_2 -> Error

만약 한 java 파일 내에 public 클래스와 그냥 클래스가 여러 개 섞여있으면?

→ public만 파일 명과 일치시키면된다

만약 public class가 여러 개면?

→ 한 파일 내의 public class는 이름이 같을 수 없음, 파일명과 public class명이 달라도 안됨

⇒ 즉 하나의 소스파일에 public class 두개 존재 불가


만약 public class가 없으면?

→ 각 클래스명대로 class 파일생성, 파일명과 달라도 에러X

!! 그래도 public이든 아니든 되도록 소스파일명과 클래스파일명을 같도록 하는 것이 좋음

이름 다르면 해당클래스 파일이 어떤 소스파일의 컴파일 결과인지 알기 어려워 유지보수 시 소스파일 찾기가 어려움

되도록 한 소스파일에 하나의 클래스만 두고, 클래스 패키지와 같은 경로에 소스파일 두기

⇒ 나중에 소스파일과 클래스파일 매치시키기가 쉽다

소스파일 인코딩 지정

컴파일 시 소스파일의 인코딩 문자 집합 지정

지정하지 않으면? → 운영체제의 기본 문자집합으로 저장된 것으로 간주하고 컴파일

소스파일 인코딩이 기본 문자표와 다르면 컴파일 오류 발생 (특히 한글 섞여있을시!)

컴파일 시 옵션을 지정해 오류 방지

*$ javac -encoding 문자집합 소스파일명*

*$javac -encoding utf-8 Hello.java*

main( ) method

JVM 통해 클래스파일 실행 시 main 메서드를 찾아 실행함

*$ java -cp bin/main com.eomcs.basic.ex01.Exam4*

main 메서드 없을 시 실행 오류 발생

public class Hello {
  public static void main(String[] args) {
  }
}

주석 comment

보통 문장 앞에 //

코딩 프로그래밍에 무시되도록 설계

일반 주석

//한 줄 주석
//줄이 끝날 때까지 주석으로 간주
//여러 줄에 한번에 실시하려면 드래그 후 Ctrl + /

/*여러 줄 주석
주석 표시가 끝날때까지
주석으로 간주*/

Javadoc 주석

java document comment

javadoc에서 HTML 문서를 생성할 때 사용

주로 API 문서 자동 생성시 사용

클래스, 메서드, 변수 앞에 적용

개발자가 보는 문서를 만들 때 사용

/**
 * 클래스에 대한 설명
 */
public class Hello {
  /**
   * 변수에 대한 설명
   * 변수 선언 앞에 설명을 붙여 놓으면 
   나중에 HTML 문서를 만들 때 추출할 수 있다.
   */
  public static String message = "Hello, world!";
  
  /**
   * 메서드에 대한 설명
   * 메서드에 대한 설명을 여기에 붙여 놓으면 
   나중에 HTML 문서를 만들 때 추출할 수 있다.
   * @param args 애플리테이션 아규먼트 값을 보관한 배열
   */
  public static void main(String[] args) {
    System.out.println(message);
  }
}

Javadoc 문서 작성하는 이유

기존엔 개발자가 소스코드.java 작성하면서 .doc 문서를 따로 작성했음

그러다보면 소스파일에서 코드 변경하면서 설명 작성시 번거로움 발생

소스파일에서 코드변경하고 변경내역 설명은 문서에 따로 추가안하는 경우 발생

그래서 코드 작성시 문서에 저장할 설명도 소스파일에 한번에 다 작성하는 방법이 javadoc

Java Document 만들기

$ javadoc -encoding [소스 파일의 문자집합] -charset [생성될 HTML 파일의 문자집합] -d [생성된 파일을 놓아둘 디렉토리] -sourcepath [자바 소스 경로] [자바 패키지]

$ javadoc -encoding UTF-8 -charset UTF-8 -d javadoc -sourcepath src/main/java com.eomcs.basic.ex02

⇒ html 문서 생성

!! Javadoc 명령은 Javadoc 주석만 출력하고 일반 주석은 추출하지 않음!

애노테이션

컴파일러와 JVM 관리 하는 주석

컴파일 후에도 클래스파일에 주석 유지 가능

@애노테이션 (프로퍼티=값, 프로퍼티=값, ...)

Literal 리터럴 - 값 data를 표현하는 문법

java에서 표현하는 data type

1. 정수

100 : 일반적인 정수 표현

약 -21억 ~ +21억까지 표현 가능

100L/l : 뒤에 영어L. 숫자 1과 소문자l이 헷갈리므로 보통 대문자 L 사용

약 -900경 ~ +900경 정도 표현 가능

2. 부동 소수점 ( 실수 )

3.14 : 전체 숫자 개수 15자리 정도의 소수점 표현 가능

3.14F/f : 보통 소문자 f 사용

약 7자리로 소수점 표현

3.141592f 
31415.92f

3. 문자 (‘ ‘ 작은 따옴표 사용)

한 개의 문자 : ‘A’ ‘가’ 

4. 논리값 (소문자로만!)

true / false

5. null (주소없음)

6. 문자열(" " 큰 따옴표 사용)

"ABC가각간"

숫자 표현

10진수, 8진수, 2진수, 16진수

8진수는 잘 사용하지 않음

10진수를 다른 기수법으로 변환

10진수

	128 – 100*1 + 10*2 + 1*8 = 128

8진수

	0127 - 64*1 + 8*2 + 1*7 = 87 

2진수

	0b0110 – 8*0 + 4*1 + 2*1 + 1*0 = 6

16진수

    0x24 - 16*2 + 1*4 = 36

2진수와 16진수의 관계

2진수 → 16진수 변환

2진수를 4비트씩 끊어서 변환하면 16진수가 됨

0 1 2 3 4 5 6 7 8 9 a10 b11 c12 d13 e14 f15

 0101 1101

0x  5  d

정수의 2진수 표현

1. 부호-크기/절대값 (Sign-Magnitude) 매그니티드 방법

24   + 24 : 0001 1000

     - 24 : 1001 1000

부동 소수점의 가수부 (significand or mantissa) 를 저장할 때 사용

맨 왼쪽 1비트를 부호 비트로 사용한다. 양수는 0, 음수는 1

나머지 비트는 절대값(magnitude)으로 저장

8비트 = 1비트(부호) + 7비트(절대값)

+4  :   0000 0100

-2  :   1000 0010

     	1000 0110 = -6 => 결과값에 차이 발생

⇒ 그래서 사용하는 것이 보수

2. 1의 보수 (Ones' Complement)

음수는 모든 비트를 반대값으로 바꿈

결과에서 메모리 크기 벗어난 것을 다시 뒤에 가져다 붙여줘야 값이 완성됨

+4  :   0000 0100

-2  :   1111 1101

      1 0000 0001 = 1 + 앞에서 버린 1 = 2

3. 2의 보수 (Two's Complement)

1의 보수에서 뒤에 1을 더해주는 번거로움 없애기 위해서 고안

1의 보수처럼 음수는 모든 비트를 반대값으로 바꾸고 1을 더해줌

+4  :   0000 0100

-2  :   1111 1110   <- 1111 1101 +  끝에 1 더해주기 ->1111 1110

      1 0000 0010 = 2

대부분의 컴퓨터에서 정수를 저장하는 방식

4. Excess-K (K값 초과)

부동소수점의 지수부를 저장할 때 사용

K값 + 표현하려는 값

K값 : 2^(비트수-1)

  • 보통 8비트라서 K = 128

  • 부동소수점은 2^(비트수-1)-1, K = 128-1 = 127

    		+ 24 : 128 +   24  = 152 = 1001 1000 
    		- 24 : 128 + (-24) = 104 = 0110 1000

cpu는 - 연산 못하고 무조건 + 연산만 수행
그래서 이런 방법들 사용해줘야함

2진수를 쓰는 이유??

데이터를 저장하는 메모리의 단위 : 1 byte = 8 bit

각각의 bit 칸에 전기를 채우면 1 아니면 0 → 값을 저장할 때 1과 0으로만 저장해서

전하의 유무로 값을 표현하기 때문에

Data 저장

하드디스크 HDD 저장 구조

track 과 sector 구조

섹터 펼친 구조 512byte

각 칸마다 자석, NS면 0, SN이면 1로 기록

SSD

각 비트에 전기가 차있는데 한번 찬 전기가 빠져나오지 못하게 절연체 처리

전원을 꺼도 전기가 남아서 메모리가 계속 남아있게됨

HDD는 디스크에 기록된 자성의 세기가 1년에 1% 감소하고, SSD는 전원이 인가되지 않은 상태에서는 셀의 누설전류로 인해 빠르면 1년 이내에 데이터 손실이 일어날 수 있다고 합니다.

그러므로 장기간 데이터를 보존할 목적으로 관리하는 HDD는 1년 1회 정도는 전체 데이터를 동일한 내용으로 재기록하고, SSD는 6개월에 한번은 시스템에 연결하여 전원이 인가된 상태로 최소한 10분 이상 사용을 하여야 안전하다고 합니다

등등등…

숫자를 H/W메모리에 저장

전기 유무로 정보 표현. 0은 없음 1은 있음 → 0과 1로만 이루어진 2진수 사용

어떤 값을 2진수로 변환한다면 하드웨어에 저장하기 더 쉬움

정수값을 2진수로 → 매그니티드 방법, 1의 보수, 2의 보수 등

부동소수점을 2진수로 → IEEE 754

문자를 2진수로 → characterset : ASCII, EUC-KR, 조합형, MS-949, Unicode, UTF-8 등 규칙

논리값을 2진수로 → true 면 1, false 면 0

빛을 2진수로 → RGB로 표현 Red Green Blue 빛의 세기를 정수값으로 다시 2진수로 바꿔 저장

소리를 2진수로 → Sampling 과정 통해 2진수로 바꿔 저장

주파수의 위치정보를 저장해서 소리의 세기도 저장 가능

!! 값을 저장매체에 저장하려면 2진수로 꼭 바꿔야함

Ram 크기와 data 크기의 연관관계

1 byte = 8 bit          -128~+127

2 byte = 1byte + 1byte  -32768 ~ +32767

Ram 용량

application → 실행 → 사용자가 입력한 값, 중간 실행결과, 출력할 결과 임시보관

ex. 동영상 파일 → 출력할 화면의 데이터 압축해제 후 그래픽카드로 보내 출력

여기서 압축해제하는 과정 – 임시 보관이 필요한 부분 → 여기에 Ram 사용

메모리 크기와 Data 크기

1 byte = 8 bit

1 bit : □ - 0 1 -2가지

2 bit : □□ - 00 01 10 11 -4가지 -2 ~ 1

3 bit : □□□ - 8가지 -4 ~ +3 → 왜? 양수쪽은 0을 포함해서

1 byte : -128 ~ +127

2 byte : -32,768 ~ 32,767

bit 값 최대수 = -2^(비트수-1) ~ 2^(비트수-1)-1

ex. 12 bit의 최대최소수 -2048 ~ 2047 (단, 2의 보수로 표현한다고 할 때)

리터럴과 메모리 크기 in Java

1. 정수

4byte 정수리터럴 : -21억 ~ +21억        100 → 4byte 메모리에 저장      integer

8byte 정수리터럴 : -920경 ~ +920경     100 L/l → 8byte 메모리에 저장      long

4바이트 메모리 크기를 초과했는데 L안붙이면 컴파일 오류가 발생

System.out.println(2147483648);
System.out.println(-2147483649);

⇒ 범위 초과해서 실행 시 error: integer number too large 발생

2. 부동소수점

4byte 부동소수점 리터럴 : 3.14 F/f

8byte 부동소수점 리터럴 : 3.14, 3.14 D/d

3. 문자

2byte 문자 리터럴 : UTF-16(UCS2)

4. 논리

4byte 논리 리터럴 true/false

단, 배열일 경우 1byte로 저장

문자의 2진수화

ASCII -> characterset 코드표   

참고 : https://dojang.io/mod/page/view.php?id=740

‘A’ -변환규칙-> 100 0001 -> 16진수 0x41

‘B’ -> 1000010

‘C’ -> 1000011

‘a’ -> 1100001

‘0’ -> 0110000

‘1’ -> 0110001

characterset 코드표

1. ASCII (7bit) 128자

프랑스, 독일 글자 등에 대해 코드값 (2진수) 정의X 표현X

2. ISO-8859 (8bit) 256자

ASCII + 유럽문자 / 한글, 한자 등에 대해 코드값 정의X 표현X

3. EUC-KR (16bit)

현재 유통되는 한글 음절을 모두 포함하지XX (한글 11172자)

가 - 0xB0A1 / 각 - 0xB0A2 / 간 - 0xB0A3 / …2350자

4. 조합형 인코딩

한글의 모든 글자 표현 가능

초성 ㄱㄴㄷㄹ.. 중성 ㅏㅐㅑㅒ.. 종성 ㄱㄲㄳㄴ..

초성 : ㄱ 00010 ㄲ 00011 ㄴ 00100 … 
중성 : ㅏ 0011 ㅐ 00100 ㅑ 00101 … 
종성 : ㄱ 00010 ㄲ 00011 ㄳ 00100

가 – 1 00010 00011 00001 → 4bit씩 끊어서 16진수로 변환 가능 → 0x8861

단, 국제표준이 아님

5. MS-949 (CP949) 16bit

EUC-KR +@ = 11172자

기존의 EUC-KR코드에 추가해서 기존 문서와 100%호환 가능

but 국제 표준XX, windows에서만 사용 가능 다른 OS에서 사용시 깨지는 현상 발생

6. Unicode (1~4byte)

ucs2(UTF-16) -> Java에서 문자를 다룰 때 쓰는 방식

모든 문자를 2byte로 표현

A -> 0x0041
가 -> 0xAC00

영어도 한글도 모두 2byte -> 영어권 사람들 불만 높음 (용량차지 많이하고 기존 1byte의 두배 크기라)

7. UTF-8 (1~4byte) (Unicode(Universal Coded character set) Transformation Format)

유니코드 문자 중에서 8bit로 표현 가능한 것은 그대로 8bit로 표현 (영어는 그대로)

그 외 문자는 변형규칙에 따라 2~4byte 문자로 변환

국제 통용

Unicode 2byte(UTF-16) vs UTF-8

A       0041   →  41  (1byte. ASCII 코드와 같음)

B       0042   →  42

가      AC00  →  EAB080

UTF-16 에서 UTF-8로 변환하려면

1010 1100 0000 0000   → utf-16

1110  xxxx 10xx  xxxx  10xx  xxxx  ⇒ utf-8

1110 1010 1011 0000 1000 0000

0x E   A    B    0    8    0

줄바꿈 코드

Windows : 0D0A -2byte

0D → CR. carriage return / 0A → LF Line Feed     ⇒ 타자기의 갬성,, 라인정리 나타냄

Unix/Linux : 0A -1byte

이스케이프 문자(escape character) = 문자 제어 코드

화면에 출력하는 문자가 아니라 문자 출력을 제어하는 문자

\n - 줄바꿈 문자. Line Feed(LF), 0x0a

\r - 커서 맨 앞으로. Carrage Return(CR), 0x0d

\f - Form Feed, 0x0c

\t - Tab, 탭만큼 띄우기, 0x09

\b - Backspace, 커서를 한 칸 씩 뒤로, 0x08

\' - Single Quote,작은따옴표, 0x27

\" - Double Quote, 큰따옴표, 0x22

\ - Backslash,역슬래쉬 \출력, 0x5c

파일 경로같은거 프린트 할 때 \하나만 치면 원하는 결과 안나올수도 있음

c:\Users\user\git 이렇게 하면 \u \g \U 가 각각 이스케이프 문자로 인식될 가능성

좋은 웹페이지 즐겨찾기