# JAVA ] Ch 02. 변수

uuuu.jini·2022년 1월 18일
0

JAVA -자바의 정석

목록 보기
1/18
post-thumbnail

깃허브 링크

목차

  1. 변수와 상수
  2. 변수의 타입
  3. 진법
  4. 기본형
  5. 형변환

자바의 처음부터 차근차근 공부해보고자 한다. 스프링을 공부함에 있어서 너무 부족한 부분이 많다고 느껴서 '자바의 정석' 으로 개념을 확인하면서 아는것은 빠르게 모르는 부분은 상세하게 공부할 것이다. [화이팅 !]

1. 변수 [ Variable ]

1.1 변수란?

하나의 값을 저장할 수 있는 메모리 공간 이라고 정읳나다. 즉, 하나의 값만 저장할 수 있고 , 새로운 값 저장시 기존의 값은 사라진다.

1.2 변수의 선언과 초기화

변수 사용을 위해서는 선언이 필요하다.

	int age; //age라는 이름의 변수를 선언

앞의 int는 변수 타입 뒤의 age는 변수의 이름이다.

변수를 선언하면 변수에는 쓰레기값이 남는다. 이를 피하기 위해 선언시에 값을 할당하는 초기화가 필요하다. 즉, 초기화는 변수를 사용하기 전에 처음으로 값을 지정하는 것이다.

	int age = 25;

여러 변수를 한줄에 선언[초기화]하는 것 또한 가능하다.

	int a,b;
    	int x=0,y=0;

두 변수의 값 교환하기

	int x = 10;
    int y = 20;
    int tmp;
    
    tmp =x;
    x = y;
    y = tmp;

1.3 변수의 명명 규칙

프로그래밍에서 사용되는 모든 이름을 식별자 라고 하며 식별자를 만들 때는 다음과 같은 규칙을 지켜야 한다.

  • 대소문자가 구분되며 길이에 제한이 없다.
  • 예약어를 사용해서는 안된다.
  • 숫자로 시작해서느 안 된다.
  • 특수문자는 '_'와 '$'만 허용한다.

예약어 는 프로그래밍 언어의 구문에 사용되는 단어를 뜻하므로 클래스나 변수 , 메서드의 이름으로 사용할 수 없다. 그 외에 권장하는 규칙들로는 클래스 이름의 첫글자는 항상 대문자, 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자, 상수의 이름은 모두 대문자(여러문자연결은 )_로 한다.


2. 변수의 타입

자료형(data type)은 값의 종류에 따라 값이 저장될 공간의 크기와 저장형식을 정의한 것이다. 자료형에는 문자형(char),정수형(byte,short,int,long),실수형(float,double) 등이 있다.

기본형과 참조형

기본형 변수는 실제 값을 저장하며, 참조형 변수 는 주소를 갖는다. 참조형 변수에는 변수의 타입으로 클래스의 이름을 사용한다. 클래스의 이름이 참조변수의 타입이 되는 것이다. 즉 변수의 타입이 기본형이 아닌 것들은 모두 참조변수로 볼수 있다. 예로 클래스이름 변수이름; 처럼 작성하는 것들이다.

참조변수의 초기화는 Date date = new Date() 형식으로 하며, 이때 new의 결과는 생성된 객체의 주소를 반환한다.

2.1 기본형 [Primitive Type ]

논리형 [boolean]

true와 false가 있으며, 조건식과 논리적 계산에 사용된다. 1byte

문자형 [char]

문자를 저자하는데 사용되며, 변수에 하나의 문자만 저장이 가능하다. 문자형은 내부에서 정수로 저장하기 떄문에 정수형과 별반 다루지 않고, 실수형 정수형 연산이 가능하다. 2byte

정수형 [byte,short,int,long]

정수를 저장하는데 사용되며 , 주로 int가 사용된다. (byte는 이진데이터 shor는 c언어와 호환을 위해 추가되었다.) 순서대로 1,2,4,8byte

실수형 [float,double]

실수를 저장하는데 사용되며, 주로 double이 사용된다. 실수형은 저장형식이 달라서 같은 크기라도 훨씬 큰 값을 저장할 수 있지만, 오차가 발생할 수 있다는 단점이 있다. 그래서 정밀도가 중요하다. 순서대로 4,8byte

2.2 상수와 리터럴 [constant & literal ]

상수는 값을 저장하면 다른 값으로 변경할 수 없다. 상수를 선언하는 방법은 기존 선언 방식에 앞에 키워드 final을 붙여주는 것이다. 상수는 반드시 선언과 동시에 초기화 해야하며, 그 이후 변경하는 것은 허용되지 않는다. 이름은 보통 대문자로 하며 여러단어는 _로 연결한다.

	final int MAX_SPEED = 10; 

리터럴 은 기존에 우리가 알고 있던 상수의 다른 이름이라고 생각하면 쉽다. 즉, 12,123, 3.14과 같은 값을 우리는 '상수'라고 하였다. 위의 상수(constant)는 값을 한번만 저장할 수 있는 공간이고 리터럴은 그 자체로 값을 의미하는 것이다.

이때 상수를 굳이 리터럴 대신 사용하는 이유는 상수에 의미있는 이름을 붙임으로써 코드의 이해와 수정을 쉽게 하기 때문이다.

리터럴의 타입과 접미사

리터럴에도 타입이 있다. 먼저 boolean일 경우 접미사는 없다.

  • 정수형
    : long타입은 리터럴에 접미사 l 또는 L을 붙인다.
    : int 타입은 접미사를 생략한다.
    : byte와 short는 별도로 존재하지 않으며 int타입과 동일하게 사용한다.
  • 실수형
    : float타입은 접미사 f또는 F를 붙인다.
    : Double 타입은 D또는 d를 붙이며 생략 가능하다.

타입의 불일치

리터럴의 타입은 저장될 변수의 타입과 일치하거나 더 큰 타입에 값을 담아야 한다. 값의 크기에 상관없이 double형은 float형에 저장할 수 없다.

문자 리터럴과 문자열 리터럴

'A'와 같이 문자 하나를 감싼 것을 문자 리터럴 , 두 문자 이상은 문자열 리터럴 이라고 한다. 여러 문자열을 저장하기 위해서는 String타입을 사용해야 한다.

	String name = new String("yoojin");
    	String name=  "yoojin";

덧셈 연산자(+)를 사용하여 문자열 결합을 할 수 있다.

2.3 형식화된 출력 - printf()

printf()지시자(specifier)을 통해 변수의 값을 여러가지 형식으로 변환하여 출력하여 주는 기능을 가진다. 지시자는 값을 어떻게 출력할 것인지를 지정해준다 . 줄바꿈을 하지 않으므로 줄바꿈을 위해 \n이 필요하다.

  • 지시자: %b [불리언], %d [10진수 정수], %o [8진수 정수] , %x,%X [ 16진수 정수], %f [부동 소수점 형식 ] , %e,%E [지수], %c [ 문자], %s [ 문자열 ]

2.4 화면에서 입력받기 - Scanner

Scanner를 사용하기 위해서는 import java.util.*;가 필요하다.
그 다음엔 Scanner클래스의 객체를 생성하고 , nextLine()이라는 메서드를 호출하면, 입력한 내용이 문자열로 반환되다.

Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
int num = Integer.parseInt(input);

3. 진법

3.1 10진법과 2진법

eclipse 폰트 사이즈 변경:
windwos->preference->font and colors -> basic-> text font -> edit 사이즈 변경

컴퓨터와 같은 전기회로에는 2진법이 적합하다. 컴퓨터는 2진수(0과 1) 밖에 알지 못하므로, 10진수를 2진수로 바꾸어 주어야 한다.
2진법은 0과 1로만 데이터를 표현하기 때문에 많은 자리수를 필요로 한다. 2와 같이 작은 숫자도 2진수로 표현하려면 2자리가 필요하다. 2진수의 한 자리로는 1보다 큰 값을 표현할 수 없기 때문이다. 덧셈과 뺄셈과 같은 연산은 10진수와 동일하다.

3.2 비트(bit)와 바이트(byte)

한 자리의 2진수를 비트(bit)라고 하며, 최소 단위이다. 1 비트를 8개를 묶어서 바이트(byte)라고 한다. 바이트는 데이터의 기본 단위로 사용한다. 워드(word)는 cpu가 한번에 처리할 수 있는 데이터의 크기 를 의미한다. 워든 cpu의 성능에 따라 달라진다.

n개의 비트로는 2^n개의 값을 표현할 수 있다. 10진수로 표현을 한다면 0에서 2^n-1개의 값을 표현할 수 있다.

3.3 8진법과 16진법

자리수가 상당히 길어지는 2진법의 단점을 보완하기 위해 8진법이나 16진법을 사용한다. 자리수가 짧아져서 알아보기 쉽고 서로 간의 변환 방법이 매우 간단하다.

2진수를 8진수, 16진수로의 변환

8진수로 변환을 위해서는 2진수를 뒤에서부터 3자리씩 끊어서 8진수로 변경하면 된다. 16진수도 동일하게 뒤에서부터 4자리씩 끊어서 16진수로 변경하면 된다.

3.4 정수의 진법 변환

10진수를 n진수로 변환

해당 진수로 나누고 나머지 값을 옆에 적는 것을 더 이상 나누어지지 않을 때까지 반복한 다음 몫과 나머지를 아래에서 위까지 순서대로 적으면 된다. 즉,n으로 반복해서 나누기만 하면 된다

n진수를 10진수로 변환

각 자리에 해당 단위의 값을 모두 곱하여 더하면 된다.

3.5 실수의 진법변환

10진 소수점수를 2진 소수점수로 변환

10진수 소수점수에 2를 계속 곱하여서 소수부가 0이 될때까지 반복한다. 정수부만을 위에서 아래로 순서대로 적고 0.을 앞에 붙인다.

2진 소수점수를 10진 소수점수로 변환

각 자리에 해당 단위의 값을 모두 곱하여 더하면 된다.

3.6 음수의 2진 표현 - 2의 보수법

가장 왼쪽 비트(MSB)를 0이면 양수, 1이면 음수로 표현한다. 이러면 첫번째 비트만으로 값의 부호를 알 수 있다. 그러나 , 두수를 더했을 때 2진수로 0이 되지 않으며 0이 두개가 존재한다는 단점이 있으며 2진수가 증가할때 10진 음수는 감소한다.
2의 보수법에 의해 음수를 배치하면, 절대값이 같은 양수 음수를 더했을때 2진수로도 0을 결과로 얻고 2진수가 증가시 10진 음수가 감소한다는 모순도 없어진다.

2의 보수법

n의 보수법이란 더했을 때 n이 되는 수를 말한다. 그러므로 2의 보수 관계에 있는 두 2진수를 더하면 0이 된다. 이렇게 2의 보수 관계에 있는 2진수로 음수를 표현하는 것을 2의 보수법이라고 한다.

음수를 2진수로 표현하기

10진수 -> 2진수 -> 2의 보수 : 10진수의 절대값 -> 1의 보수 + 1

2의 보수 구하기

2의 보수 = 1의 보수 + 1 이다. 1의 보수는 0을 1로 1을 0으로 변경한 것이며 이 수에 1만 더하면 2의 보수가 된다.


4. 기본형(primitive type)

4.1 논리형 - boolean

true 와 false 중 하나를 저장할 수 있으며 기본값은 false이다. 1byte이다. 대소문자가 구분되기 때문에 TRUE,FALSE는 틀리다.

4.2 문자형 - char

문자를 저장하기 위한 변수를 선언할때 사용되며 단 하나의 문자만을 저장할수 있다. char ch = 'A'; 문자가 저장되는 거 같이 보이지만 사실은 문자의 유니코드가 저장된 것이다. [컴퓨터는 숫자밖에 모른다] 문자 리터럴 대신 문자의 유니코드를 직접 입력할수 도 있다. 어떤 문자의 유니코드를 알고 싶으면 char형 변수에 저장된 값을 정수형(int)로 변환하면 된다. int code = (int)ch;

특수문자 다루기

tab - \t , backspace - \b , form feed - \f, new line - \n, carriage return - \r, 역슬래시 - \\
작은따옴표 - \', 큰따옴표 - \", 유니코드 문자-\u유니코드

char타입의 크기는 2byte이므로, 65536개의 코드를 사용할 수 있다. 정수형과 다르게 음수를 나타날 필요가 없으므로 표현할 수 있는 값 범위가 0부터 2^16 -1 까지이다.

인코딩과 디코딩

4.3 정수형 - byte,short,int,long

byte(1) < short(2) < int(4) < long(8) 이 중에서 기본 자료형은 int이다.

4.4 실수형 - float , double

float(4) < double(8) 연산속도의 향상이나 메모리를 절약하려면 float을 선택하고 더큰 값의 범위라던가 더 높은 정밀도를 필요로 하는 경우는 double을 선택해야 한다.


5. 형변환

5.1 형변환(캐스팅, casting)이란?

서로 다른 타입간의 연산의 수행이 필요한 경우 변수나 리터럴의 타입을 다른 타입으로 변환하는 것이다.

5.2 형변환 방법

(타입)피연산자 , ()는 캐스트 연산자 형변환 연산자 라고 한다. 형변환을 캐스팅이라고 한다. 형변환 연산자는 피연산자를 읽어 원하는 타입으로 변경된 값을 반환해줄 뿐 피연산자 변수의 값은 아무런 변화가 없다. 기본형에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하며, 기본형과 참조형간의 형변환은 불가능하다.

5.6 자동 형변환

경우에 따라 편의상의 이유로 형변환을 생략할 수 있다. 서로 다른 두 타입간의 덧셈에서는 두 타입 중 표현범위가 더 넓은 타입으로 형변환되어 타입을 일치시킨 다음에 연산을 수행한다.

자동 현변환의 규칙은 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다.

  1. boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.
  2. 기본형과 참조형은 서로 형변환할수 없다.
  3. 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.
profile
멋쟁이 토마토

1개의 댓글

comment-user-thumbnail
2022년 1월 19일

[화이팅 !]

답글 달기