디지털 컨버전스/JAVA

[Java] 자료형 , 아스키코드, 연산자

gimyeondong 2020. 2. 5. 09:52

 

Q. CPU가 보조기억장치에 접근 할 수 없다? 사용은 어떻게함?

A. 하드 디스크의 내용을 램에 복사(로딩). 목록만 

 


  • char (2)
    • 전기신호(0,1)만 아는 컴퓨터가 어떻게 문자를 저장할까?
    • 아스키 ASCII 라는 기관이 정한 코드표
    • A 65 , a 97 정도는 알아두자
    • char형을 정수형으로 분류한 이유 : 문자로 보이지만 실제로는 숫자데이터로 저장
    • 자바에서는 문자를 유니코드로 처리 (2byte)
    • 현재는 UTF-8를 주로 사용
    • 음수에 문자를 매칭시키지 않음, char은 음수를 표현하지 못함, 216
    • char에는 '만 사용. "는 문자열로 인식

아스키 코드표

 

char에는 음수를 넣을 수 없다. 문자를 표현하는 것을 목적으로 만들어 졌기 때문에

 

(a) 위에서 아래로 적용, (c) 70값이지만 char은 문자로 표현

 

  • int (4바이트)
    • 232개 표현 가능
    • 숫자 저장시 자주 사용
  • long (8)
    • 100억 에러?
    • int 범위를 벗어난 숫자는 뒤에 L을 붙여서 롱형임을 알려줘야함
    • 소문자l도 가능하지만 숫자1과 혼동될 수 있기에 대문자L을 사용
  • 실수형 변수
  • float(4)
    • 뒤에 f를 넣어서 컴파일러에게 더블형이 아닌 플룻형임을 알려줘야함
  • double(8)
    • 자바에서는 double(8)을 주로 사용
  • 논리형 boolean (1)
    • true 또는 false
  • 기본 8대 자료형 Primitive Type
    • 논리형 : boolean(1)
    • 정수형 : byte(1) / short(2) / char(2) / int(4) / long(8)
    • 실수형 : float(4) / double(8)
  • 참조형 변수 Reference Type
    • 기본형을 제외한 나머지 자료 형
    • 객체의 주소를 저장한다
    • String 등 참조 형 변수는 모두 4 byte (변수 자체는 주소값, 주소로 찾아가는 데이터가 가변적)
  • 자료형들의 대소관계
    • boolean은 뺀다.
    • 하나의 자료형이 포함하는 범위를 기준으로 대소를 구분
    • char는 바이트보다 크다고 할 수 없다. char는 short와 같다고 할 수 없다 : 범위의 대소관계가 존재하지 않음.다르다.
    • int는 char, short보다 크다.
    • 정수형은 얼마나 큰 수를 담을 수 있는가로 비교, 실수형은 얼마나 정밀한가를 기준으로 대수관계 비교
    • 실수형은 무조건 정수형보다 크다고 정함. float(4)은 long(8)보다 크다. 
    • String은 double(8)보다 크다? 예외상황 존재... 일단 논외로 한다.
  • 기본자료형들은 사이즈가 작고 고정되어 있다.
  • 참조형들은 사이즈가 가변적이다. 사이즈가 작을수도 있지만 엄청나게 커질 수도 있다.

 

  • 운영체제 : 시스템의 자원을 관리해주는 장치
    • Resource Manager
    • RAM : 가상 메모리 시스템으로 관리
      • 4개의 영역으로 나누어서 관리
      • Stack : (디폴트) 변수 저장, 작고 고정된 데이터를 저장하기 적합(기본자료형)
      • Data
      • Heap : 동적메모리(가변적으로 변하는 데이터)
      • Test
    • 참조형에서 변수는 Stack에 그 값은 Heap에 넣고, 그 데이터의 주소값을 변수에 저장

참조형에서 변수는 주소값을 저장
Data Type (32bit 운영체제 기준)

  • void는 특수형, 값이 없다.

 

  • 서로다른 자료형에 대입했을 때

  • Data type Promotion (자료형 진급)
    • 좁은 범위의 자료형이 넓은 범위의 자료형에 대입 될 때, 자동으로 발생하는 현상 (cf.문법은 구현)
    • short = byte / int = short / long = int 등... 
    • Float 또는 Double = 정수형
    • 실수는 항상 정수형 보다 크다.
    • 자동으로 형 변환 된다.
  • Data Type Casting
    • 넓은 범위의 자료 형이 좁은 범위의 자료 형에 대입 될 때, 문법적으로 구현해야 함
    • byte = short / short = int / int = long
    • Char = short 역시 Casting (char는 unsigned)
    • Cast 연산자를 이용한다.
  • boolean과 String은 형 변환이 되지 않는다.

 


 

  • bit값을 short에 대입
    • short b
      • 0000 0000 0000 0000
    • bit a
      • 0000 1010
      • 0000 0000 0000 1010 (작은자료형이 큰쪽에 맞춰지는 promotion현상)
      • 일시적으로 비트가 늘어나면서 대입 성공
  • int가 double로 Promotion
    • 10 -> 10.0
  • 사람은 10(정수)/3(정수) = 3.3333(실수) 
  • 컴퓨터는 10(정수)/3(정수) = 3(정수)
  • sysout(10+5)
  • 결과 : 15
    • sysout("결과 : "+10+5)
    • sysout("결과 : 10"+5)
    • sysout("결과 : 105") // 오류, 왼쪽부터 문자열로 프로모션
    • sysout("결과 : "+ (10+5)) // 괄호 먼저 계산후 문자열로

  • Casting
    • 문법적으로 구현해 줘야 함
    • 강제 형 변환 
    • 데이터의 손실이 일어난다.

캐스팅이 필요한 경우, 형이 다르면 애초에 대입을 막는다
byte 범위보다 큰 값을 강제로 형 변환, 데이터 손실 발생


  • String에 기본자료형 대입은 안된다. (덧셈연산에 한하여 프로모션됨)

예제 캐스팅




Q. char끼리 더했을 때 연산결과가 숫자로 출력된 이유? (문자로 변환되서 나오는게 아니라?)

A. 유니코드로 변환되어 나오게 하는 법? 캐스팅 (char)(a+b)



  • 상수 : 항상 같은수
  • Literal 상수

상수

  • 변수 앞에 final을 붙이면 상수


  • Literal : 100 /  1 / 값들
  • 변수 : i / l
  • 상수 : ON
  • 예약어 : 보라색 글자, main

연산자의 종류

  • 대입 연산자
    • 왼쪽은 대입을 받을 수 있는 '공간(변수)'이어야 한다.
    • 오른쪽은 공간안에 들어있는 '값'을 의미
    • 우항이 좌항으로 들어간다.
  • +=
    • A+=B
    • A = A + B
    • A라는 이름의 공간에 A가 가진 값과 B가 가진 값을 넣어라
    • 식 실행 후 A의 값이 변한다.
  • %
    • 나머지 연산자
  • 증감 연산자
    • A++ (후치형 증감연산자) , ++A (전치형 증감연산자)
      • A = A + 1
    • A-- , --A
      • A = A - 1

후치형 증감연산자와 전치형 증감연산자

  • 관계연산자의 연산 결과는 true false (boolean값)만 나온다
  • <= 작거나 같다.
    • 둘중 하나만 맞으면 true
    • =<는 에러

관계연산자

  • 논리 연산자
    • 한개 이상의 관계 연산을 취합
    • ! : NOT, boolean반전연산자
    • & : 엔퍼센드, and연산자, 그리고 연산자
    • | : 버티컬바, or연산자, 또는 연산자
    • && : 양쪽 다 true일때만 true, 단 하나라도 false가 끼면 false
    • || : 하나라도 true가 있으면 true, 양쪽다 false일때만 false
    • 10 < x < 20 대신에 10 < x && x < 20 로 입력
    • 10 < x || x < 100 , 거나
    • 논리 연산자는 shortcut연산이 적용된다
      • A == B && A != B
      • A! = B || A = B
        • t or... -> t  (뒤에는 처리되자 않고 바로 결과 나옴)

관계 연산자와 논리 연산자. 많이 사용하게 된다.

 

Shortcut 발생시 오류가 생길 수 있다


  • //1번 int형 변수 x가 10보다 크고 20보다 작다
    int x;
    10 < x && x < 20;
  • //2번 char형 변수 ch가 알파벳y 또는 Y와 같다.
    char ch;
    ch == 'y' || ch == 'Y'; // 관계연산자도 char으로(')
  • //3번 변수 x가 100(포함)~200(포함) 이거나 300과 같다.
    (100<= x && x<=200) || x == 300; // 연산우선순위를 모를때 확실하게 하기 위해 괄호처리하자.

  • 기본 입력
    • 일괄처리 프로그램 : 여태까지 만든 예제프로그램
    • 기본입력 파트부터는 대화형 프로그램으로 변화
  • 예외전가의 필요성
    • 프로그램 안정성을 중시하는 자바언어의 특성 상, 모든 입출력에 대해 발생 할 수 있는 예외적인 상황을 대배해야 한다.
    • 지금까지 사용해왔던 출력 Method는 모두 내부적으로 예외처리가 되어 있는 함수였지만 대체로 그렇지 않은 것들이 많다.
  • 예외전가 방법
    • 첫째, 자바에서의 입출력과 관련된 Library를 사용하기 위해 관련 패키지를 import 할 것
      • import java.io.*;

'사용자의 입력을 받아라', 입력할때까지 프로그램 동작 중(콘솔창 사각형이 빨간색으로 변함)
첫 문자의 아스키 코드값을 받아서 다시 출력