[JAVA]3일차(변수와 자료형/상수와 형 변환/연산자)

정효진·2021년 7월 16일
0

Developer Study

목록 보기
3/47
post-thumbnail

7월16일(금)

+프로그램을 실행하기 위해서는 메모리가 필요하다
+운영체제가 메모리를 관리함
+운영체제가 공간확보 못하면 메모리가 부족하다고 뜸
+메인 메소드(함수) 안에서는 코드가 순차적으로 진행됨

2. 변수와 자료형

  • 상수는 항상성을 가지고 있어서 그 값이 고정
  • 변수(Variable)는 변하는 수이기 때문에 값이 언제 변할지 모름
  • 각각의 메모리는 모두 주소값이라는 것이 존재
  • 자료형은 int, char, float, double 등
자료형데이터메모리 크기표현 가능 범위
boolean참과 거짓1바이트true, false
char문자2바이트모든 유니코드 문자
byte정수1바이트-128 ~ 127
short정수2바이트-32768 ~ 32767
int정수4바이트-2147483648 ~ 2147483647
long정수8바이트-9223372036854775808~9223372036854775807
float실수4바이트±(1.40X10-45 ~ 3.40X1038)
double실수8바이트±(4.94X10-324 ~ 1.79X10308)

8bit == 1byte
IPv6 ->0000000.0000000.0000000.0000000 32bit ==4byte

변수의 이름을 짓는 방법

  • 숫자로 시작 불가
  • $와 _ 이외의 다른 특수문자는 사용 불가
  • 키워드는 변수의 이름으로 사용

음의 정수 표현

  • 1의 보수를 취하고(0을1로 1을0으로) -> 그리고 +1을 해주면 됨!
  • byte 기반의 데이터 타입 시작이 1로 시작하면 음수임!(5번~10번)

<예제>

■■■ 음의 정수 표현 ■■■
①-10을 byte 기반의 비트열로 나타낸다.
00001010 ->11110101-> 11110110
(2진수로 만들고 ->보수하고->1을 더함)
②-27을 byte 기반의 비트열로 나타낸다.
00011011 ->11100100->11100101

③-31을 byte 기반의 비트열로 나타낸다.
00011111->11100000->11100001

④-13을 byte 기반의 비트열로 나타낸다.
0001101->1110010->0000011

⑤ byte 기반의 11001010을 10진수 정수형으로 나타낸다.
1을 뺌 : 11001001
1의 보수 : 00110110
32+16+4+2=54
-54

⑥ byte 기반의 11110101을 10진수 정수형으로 나타낸다.
1을 뺌 : 11110100
1의 보수:00001011
1+2+8=11
-11

⑦ byte 기반의 10000001을 10진수 정수형으로 나타낸다.
1을 뺌 : 10000000
1의 보수:01111111
1+2+4+8+16+32+64=127
-127

⑧ byte 기반의 10101010을 10진수 정수형으로 나타낸다.
10101000
01010111
1+2+4+16+64=87
-87

⑨ byte 기반의 10000101을 10진수 정수형으로 나타낸다.
10000100
01111011
1+2+8+16+32+64=123
-123

⑩ byte 기반의 11111111을 10진수 정수형으로 나타낸다.
11111110
00000001
1
-1

<비트뺄셈>
02
10
01
01

실수표현의 문제점

  • 0과1사이에 무한대의 수가 있음 단순히 몇 바이트 정도로 모든 실수의 표현은 불가능

문제점에 대한 해결책

  • 정밀도를 포기하고, 대신에 표현할 수 있는 값의 범위를 넓히자

자료형 정수를 int를 많이 쓰는 이유는?

-> 연산때문!
byte나 short로 저장을 해도 나중에 다른값과 연산하면서 int로 바꿔야하는 경우가 많음

  • byte나 short있는 이유는 연산보다 데이터의 양이 중요시 되는 상황(mp3몇곡 담기는지)
  • 공간을 낭비할정도로 큰 공간이 필요 없을 경우
  • 속도가 중요하지 않은 경우 씀

자료형 실수를 double을 많이 쓰는 이유는?

->연산이 늦더라도 정밀도가 double(소수점 이하 12자리 정밀도)이 더 좋음

문자 자료형 char

  • 문자 하나를 2바이트로 표현하는 유니코드 기반으로 표현
  • 유니코드는 전 세계의 문자를 표현할 수 있는 코드 집합
  • 문자는 작은따옴표(' ')로 표현
  • 문자는 char형 변수에 저장한다. 저장 시 실제로는 유니코드 값 저장

참과 거짓을 표현하기 위한 자료형 boolean

  • true는 참
  • false 거짓

3. 상수와 형 변환

자료형을 기반으로 표현이 되는 상수

  • 자바는 메모리에 직접적으로 주소값의 접근을 허용하지 않는다.
    그래서
    변수를 선언해 줘야함.
    int result;
    1 + 2 를 result에 담아내기;

대입연산자 " = "

A = B
B를 → A에 대입

표현되는 데이터는 상수 아니면 변수

  • 변수와 마찬가지로 상수도 메모리 공간에 저장이 된다.
  • 다만 이름이 존재하지 않으니 값의 변경이 불가능
  • 상수는 존재 의미가 없어지면 바로 소멸됨

접미사F, L

<접미사F>
int num1 = 10000000000; 안됨(범위초과)
int num2 = 10000000000;안됨(접미사 불포함)
int num2 = 10000000000l; 됨
int num2 = 10000000000L; 됨
WHY?
-> long타입은 뒤에 L을 붙여줘야 자바가 int로 인식하지 않음
오른쪽 먼저보고 왼쪽으로 집어넣는데 오른쪽이 int로 인식하니까 안들어가짐
<접미사L>
float num3 = 12.45;
이러면 무조건 double 잡음
그래서
float num3 = 12.45f;
이렇게 해야 float

자료형의 변환

  • 효율적으로 메모리를 관리하기위해
  • 자료형이 다른 자료들의 연산을 위해
    1.0+1 은 연산 불가
    1.0+1.0으로 변환해야 연산 가능

자동 형 변환(Implict Conversion)

  • 문자는 실제로 유니코드 값이 저장되는거여서 숫자로 변환 가능
    (A를 저장하면 65저장됨)
  • double num2 = 3.5f + 12;(12가 12f로 자동 형 변환)

명시 형 변환

❔ 명시형 변환을 하는 이유

  • 자동 형 변환 발생지점의 표시를 위해서 case2
  • 자동 형 변환의 규칙에 위배되지만 변환이 필요한 상황 case1

case1
long num1 = 2147483648L;
int num2 = (int)num1;

case2
int num3 = 100;
long num4 = (long) num3;

4. 연산자(Operator)

연산자

연산자연산자의 기능결합방향
=연산자 오른쪽에 있는 값을 연사자 왼쪽에 있는 변수에 대입
예) val = 20;
+두 피연산자의 값을 더한다.
예) val = 4+3;
-왼쪽의 피연산자 값에서 오른쪽의 피연산자 값을 뺀다.
예) val = 4-3;
*두 피연산자의 값을 곱한다.
예) val = 4*3;
/왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눈다.(몫만)
예) val = 7/3;
%왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게 되는 나머지를 반환한다.
예) val = 7%3;

복합 대입 연산자

a+=3; == a=a+3; //a를 3만큼 증가시켜라!

관계연산자

  • 연산결과가 true 아니면 false를 반환
연산자연산자의 기능결한방향
<예) n1 < n2
n1이 n2보다 작은가?
>예) n1 > n2
n1이 n2보다 큰가?
<=예) n1 <= n2
n1이 n2보다 작거나 같은가?
>=예) n1 >= n2
n1이 n2보다 크거나 같은가?
==예) n1 == n2
n1이 n2보다 같은가?
!=예) n1 != n2
n1이 n2보다 작다른가?

논리연산자

&&(논리and), ||(논리or), !(논리부정(not))

증감연산자

++ --
++n(prefix) 선대입
n++(postfix) 후대입

증가 감소 연산의 예

class PrefixOp
{
	public static void main(String[] args)
    {
    	int num1 = 7;
        int num2, num3;
        
        num2 = ++num1;
        num3 = --num1;
        
        System.out.println(num1);
        System.out.println(num2);
        System.out.println(num3);
    }
}
prefix 결과값👀
num1 = 8
num2 = 8
num3 = 7
class PostfixOp
{
	public static void main(String[] args)
    {
  		int num1 = 7;
        int num2, num3;
        
        num2 = num1++;
        num3 = num1--;
        
        System.out.println(num1);
        System.out.println(num2);
        System.out.println(num3);
    }
}
postfix 결과값👀
num1 = 7
num2 = 7
num3 =8

비트와 관련이 있는 연산자들

  • 비트는 빠름
연산자연산자의 기능결합방향
&비트단위로 AND 연산을 한다.
예) n1 & n2;
l비트단위로 OR 연산을 한다.
예) n1
n2;
^비트단위로 XOR 연산을 한다.
예) n1 ^ n2;
~피연산자의 모든 비트를 반전시켜서 얻은 결과를 반환
예) ~n;
  • & -> 둘다 1이면 1
  • | -> 하나만 1이어도 1
  • ^(익스클러시브오아) -> 같으면 0 서로 다를때만 1
  • ~(틸드) -> 반전

비트 쉬프트(Shift) 연산자

  • 가장 빠른속도
연산자연산자의 기능결한방향
<<-피연산자의 비트 열을 왼쪽으로 이동
-이동에 따른 빈공간을 0으로 채움
예)n<<2;
->n의 비트열을 투칸 왼쪽으로 이동 시킨 결과 반환
>>-피연산자의 비트 열을 오른쪽으로 이동
-이동에 따른 공간은 음수의 경우1, 양수의 경우 0으로 채움
예)n>>2;
->n의 비트열을 투칸 오른쪽으로 이동 시킨 결과 반환
>>>-피연산자의 비트 열을 오른쪽으로 이동
-이동에 따른 빈공간을 0으로 채움
예)n>>>2;
->n의 비트열을 투칸 오른쪽으로 이동 시킨 결과 반환
  • 1번이랑 짝꿍은 3번임, 이동하고 비어있는거 0으로 채움
  • 3<<2하면
    00000011 -> 00001100 -> 12
  • 3을 12로 만드는것이 * 4하는 것보다 시프트 2하는게 빠르다
  • 12>>>2
    00001100 -> 00000011 -> 3
  • 2번은 이동하고 비어있는거 1로 채움(음수일 경우)
    11100000 -> 11111000
  • 왼쪽으로의 비트 열 이동은 2의 배수의 곳
  • 오른쪽으로의 비트 열 이동은 배수의 나눗셈

Editplus 코딩

public class Test003
{
	public static void main(String[] args)
	{
		//변수 선언
		int a;
		//변수 초기화(변수 a에 10 대입)
		a = 10;
		//변소 선언 및 초기화(선언과 대입을 한 번에 처리)
		int b = 20;
		//변수 선언
		int c;
		//출력문을 통해 확인(테스트)

		System.out.println(c);
	}
}

결과👀

초기화 미선언 에러

  • 에러 발생(컴파일 에러)
  • 20은 20번째줄에서 에러가 생겼다인데 믿을게 못됨
  • c 초기화 값이 없어서 에러!
  • 변수를 활용하려면 선언 후에 꼭 초기화를 해줘야 함!
profile
개발새발

0개의 댓글