패스트캠퍼스 핀테크 서비스 개발자 3기 - Day4 ( 자료형, 연산자 )

유재학·2022년 9월 20일
0

자료형

자료형 - 정수의 표현

  • 변수를 선언하면 해당되는 자료형의 크기 만큼 메모리가 할당된다
  • 변수는 할당된 메모리를 가리키는 이름이다
int level = 10; // 4바이트 정수형 메모리가 level이라는 이름으로 할당 됨
  • 정수 자료형의 크기

    • byte(1byte) : 2^7 ~ 2^7-1
    • short(2byte) : 2^15 ~ 2^15-1
    • int(4byte) : 2^31 ~ 2^31-1
    • long(8byte) : 2^63 ~ 2^63-1
  • byte와 short

    • byte : 1바이트 단위의 자료형으로 동영상,음악,파일,실행 파일의 자료를 처리할 때 사용한다.
    • short : 2바이트 단위의 자료형으로 C/C++언어와 호환 시 사용한다.
  • int

    • Java에서 사용하는 정수에 대한 기본 자료형이다.
    • 크기는 4byte이다.
    • 프로그램에서 사용하는 모든 숫자(literal)은 int로 저장된다.
    • 32bit를 초과하는 숫자는 long자료형으로 처리해야 한다. (표현 범위를 넘기 때문)
  • long

    • 크기는 8byte이다.
    • 숫자의 뒤에 알파벳 L또는 l을 붙여 long형임을 표시해서 사용한다.
    long lNum = 12345678900; // ERROR: 숫자(리터럴) 자체가 항상 int형(4byte)으로 잡히기 때문에 오류가 남
    long lNum = 12345678900L; // 소문자l은 1과 헷갈릴 수 있기 때문에 가독성을 위해 가급적이면 대문자L을 사용해주는 것이 좋음

자료형 - 실수의 표현

부동 소수점 방식

  • 실수는 정수보다 정밀하기 때문에 정수와는 다른 방식으로 표현한다.
  • 부동 소수점 방식으로 실수값 0.1을 표현한 예시이다.
  • 지수부와 가수부로 나누어 표현한다.
  • 컴퓨터에서는 밑수를 2로 사용한다.
  • 정규화 : 가수가 밑수보다 작은 한 자리까지 기수로 표현되는 것을 말한다.
  • 밑수가 2인 경우 정규화를 하게 되면, 가수부분의 첫 번째 자리 숫자는 항상 1이다.

float와 double

  • float : 4byte로 8비트를 지수부에, 23비트를 가수부에 사용한다. 1비트는 부호
  • double : 8byte로 11비트를 지수부에, 52비트를 가수부에 사용한다. 1비트는 부호
  • 실수는 기본적으로 double형에 저장되며, float형을 쓰고싶은 경우엔 literal뒤에 식별자 F또는 f를 붙여 사용한다.
    float fNum = 12.23f // f는 숫자와 헷갈릴 일이 없기 때문에 대,소문자 중 자유롭게 사용해도 된다.

부동 소수점 방식의 오류

  • 지수와 가수로 나타내는 부동 소수점 방식에서는 지수부가 0을 표현할 수 없기 때문에 약간의 오차가 발생할 수 있다.

자료형 - 문자의 표현

문자도 정수로 표현한다!

  • 어떤 문자를 컴퓨터 내부에서 표현하기 위해 정수 값을 정의하여 사용
  • A는 65를 사용
  • 문자세트 : 각 문자를 얼마로 표현할 것인지 코드 값을 모아둔 것을 문자세트(Character Set)이라고 한다. ex) ASCII, utf-8, utf-16
  • 인코딩(Encoding) : 문자를 숫자로 변환하는 것. ex) 'A' -> 65
  • 디코딩(Decoding) : 숫자를 문자로 변환하는 것. ex) 65 -> 'A'

Java에서는 문자가 어떻게 표현되는가?

  • 각 나라의 문자 세트가 달라서 호환이 안되는 문제가 발생하였다, 이를 해결하기 위해 모든 나라의 문자를 어느 하나의 코드표로 표준하자고 하여 나온 것이 바로 UNICODE이다. Java에서는 이 UNICODE를 사용한다.
  • utf-16 인코딩을 사용한다. (모든 문자를 2바이트로 표시한다.)
  • utf-8은 1~4바이트의 유동적인 문자 표현이 가능하다. (인터넷, 네트워크 통신을 할 때 주로 사용)
  • 문자형 변수 선언과 사용
char ch = 'A' // ' '이 문자를 나타낸다. " " 은 문자열을 나타내는 것이니 주의

// 내부적으로 숫자로 표현되므로 숫자를 넣어도 문자가 출력될 수 있음 (음수 불가)
char ch = 66; -> B 출력 

자료형 - 논리형과 자료형 없이 변수 사용하기

논리형

  • true(참), false(거짓) 두 가지만 나타낸다.
  • 1byte이다.
  • 값이 존재하는지, 배열이 비어있는지, 결과가 참인지 거짓인지 표현할 때 주로 사용한다.

지역 변수 자료형 없이 사용하기 (java 10부터 지원)

  • local variable type interface
  • 추론 가능한 변수에 대한 자료형을 선언하지 않음.
  • 한번 선언하여 추론된 변수는 다른 타입의 값을 대입할 수 없음.
  • 지역 변수만 사용 가능
논리형
boolean b = true;

자료형 없이 변수 사용
var i = 10; // Integer
var j = 10.0 // Double
var s = "hello" // String

변하지 않는 수(상수)와 리터럴(Literal)

상수(Constant)

  • 변하지 않는 수를 나타낸다.
  • final 예약어를 사용하여 선언한다.
final int num = 10;
  • 상수를 사용하면 변하지 않는 값을 반복하여 사용할 때 의미있는 문자로 인식하기 쉽고, 혹 변하더라도 선언한 부분만 변경하면 되므로 여러 부분을 수정할 필요가 없음.
ex) 나쁜 코드 예시
int r = 3.14 * 5;
int l = 3.14 * 2;
/* 만약 이런 코드가 여러 줄 있다고 가정했을 때, 3.14부분을 상수로 두고 사용하지 않으면 
나중에 값을 변경할 일이 있을 때 굉장히 많은 수정을 해야 함. */

ex) 좋은 코드 예시
final int PI = 3.14; // 상수는 항상 대문자로 표현 (Convention)
int r = PI * 5;
int l = PI * 2;
  • 나중에 바꿀 수 없음.

리터럴(Literal)

  • 프로그램에서 사용하는 숫자, 문자, 논리값을 뜻함.
  • 리터럴은 상수 풀(constant pool)에 있음.
  • 정수 리터럴은 int로 실수 리터럴은 double로 저장됨. 정수의 범위가 넘어가는 경우 L(l), 실수를 float형으로 사용하고 싶은 경우 F(f) 식별자를 맨 끝에 붙여 사용함.

형 변환(type conversion)

  • 서로 다른 자료형 간에 연산등의 수행을 위해 하나의 자료형으로 통일하는 것.
  • 묵시적 형 변환(explicit type conversion, 자동 형 변환)과 명시적 형 변환(implicit type conversion, 강제 형 변환)이 있다.
  • 바이트 크기가 작은 자료형에서 큰 자료형으로 형 변환은 자동으로 이루어 짐 (정보의 유실이 없음)
  • 덜 정밀한 자료형에서 더 정밀한 자료형으로의 형 변환은 자동으로 이루어 짐
  • 실수 -> 정수로의 형 변환은 강제 형 변환으로 진행되며 정보의 유실이 있을 수 있음.
ex)
double d = 3.14;
int i = (int)d;
출력 : i = 3; // 0.14가 유실

연산자

항과 연산자

  • 항(operand) : 연산에 사용되는 값
  • 연산자(operator) : 항을 이용하여 연산하는 기호

대입 연산자(assignment operator)

  • 변수에 다른 변수나 값을 대입하는 연산자
  • 이항 연산자 중 우선 순위가 가장 낮은 연산자
int a = b

부호 연산자

  • 단항 연산자
  • 변수의 부호를 유지하거나(+) 바꿈(-)
  • 실제 변수의 부호가 바뀌려면 대입 연산자를 사용해야 함.

산술 연산자

복합 대입 연산자

증가, 감소 연산자

  • 단항 연산자
  • 변수의 값을 1 더하거나 1 뺄때 사용
  • 연산자가 항의 앞에 있는가, 뒤에 있는가에 따라 연산 시점과 결과가 달라짐.
  • 문장의 끝을 기준으로 연산 시점을 생각해야 함.

관계 연산자

  • 이항 연산자
  • 연산의 결과가 true(참),false(거짓)으로 반환 됨, 비교 연산자라고도 함.
  • 조건문, 반복문의 조건식으로 많이 사용 됨.

논리 연산자

  • 관계 연산자와 혼합하여 많이 사용 됨.
  • 연산의 결과가 true(참), false(거짓)으로 반환 됨.
&&(논리 곱) : 두 항이 모두 참인 경우 return true, 둘 중 하나라도 아니면 false
|| (논리 합) : 두 항 중 하나만 참이면 return true, 둘 다 아니면 false
! (부정) : 단항 연산자, true -> false

논리 연산에서 모든 항이 실행되지 않는 경우

  • 단락 회로 평가 (short circuit evaluation)
  • 논리 곱(&&)은 두 항의 결과가 모두 true일 때만 결과가 true,
    (앞의 항의 결과가 false이면 뒤 항의 결과는 평가하지 않음)
  • 논리 합(||)은 두 항의 결과가 모두 false일 때만 결과가 false
    (앞의 항의 결과가 true이면 뒤 항의 결과는 평가하지 않음)

조건 연산자

  • 삼항 연산자
  • 조건식의 결과가 true(참)인 경우와 false(거짓)인 경우에 따라 다른 결과가 수행됨
  • if(조건문)을 간단히 표현할 때 사용할 수 있음
          (조건식) ? 결과1: 결과2;
int num = (5 > 3) ? 10 : 20;  // 조건식이 참이면 결과1, 거짓이면 결과2 대입
결과 : num = 10

비트 연산자

  • 대입 연산자와 다른 연산자가 함께 쓰임
  • 마스크 : 특정 비트를 가리고 몇 개의 비트값만 사용할 때를 나타냄
  • 비트켜기 : 특정 비트들만을 1로 설정해서 사용하고 싶을 때 씀
  • 비트끄기 : 특정 비트들만을 0으로 설정해서 사용하고 싶을 때 씀
  • 비트토글 : 모든 비트들을 0은 1로, 1은 0으로 하고 싶을 때 씀

연산자 우선순위

후기

본격적으로 자바의 기초를 배우기 시작했다. 전공자인 나는 이미 대부분 알고있는 내용이지만 여러 회사의 면접을 보면서 내가 다루는 기술의 기초지식이 얼마나 중요한지 알게 되었고, 내 기초지식이 아주 탄탄하지는 못하다는 것도 깨닫게 되면서 이번에 다시한번 기초를 탄탄히 다지고자 열심히 수업을 들었다.

확실히 이미 알고있는 내용을 다시한번 들으니 전반적으로 내용이 더 잘 이해되고, 내가 알고있는 더 깊은 지식과 연결하니 어중간하게 알고 있던 개념이 정립되는 느낌을 받았다. 이래서 기초가 중요하구나 다시한번 느끼게 되는 순간이었다.

profile
github : https://github.com/kiaeh2323 , email : kiaeh9269@gmail.com

0개의 댓글