본문 바로가기
혼자 공부하는 자바

혼자 공부하는 자바 (7강 ~ 12강)

by moca7 2024. 5. 23.

7강. 자바의변수

8강. 변수 기본 타입(1) 정수 타입

9강. 변수 기본 타입(2) 실수 타입, 논리 타입

10강. 변수 타입 변환(1) 타입 변환

11강. 변수 타입 변환(2) 정수/실수 연산에서의 자동 타입 변환

12강. 변수 타입 변환(3) +연산에서의 문자열 자동 타입 변환, 문자열을 기본 타입으로 강제 타입 변환

 

 

 

 

 

7강. 자바의변수

 

 

ㅁ 컴퓨터 메모리(RAM)값을 저장할 수 있는 수많은 번지(주소)들로 구성되어 있다.

- 메모리의 어디에 어떤 방식으로 저장할지 정해놓지 않으면 프로그램 개발이 무척 어렵게 된다.

- 프로그래밍 언어는 이 문제를 해결하기 위해 변수라는 개념을 사용한다.

 

 

변수(Variable)

- 값을 저장할 수 있는 메모리의 특정 번지에 붙여진 이름을 말함.

- 영어 대소문자를 구분함.

- 변수명의 첫글자는 숫자로 시작 불가. 문자와 $, _ 가능.

 

- 초기화는 변수에 최초로 값이 저장되는 것. 그러한 값을 초기값이라고 함. 

 

 

ㅁ 

(1) 먼저 상단 file - new - java project에서 chap0n으로 프로젝트 만듦.

(2) src 우클릭 - new - package에서 sec01.exam0n으로 패키지 만듦.

(3) exam0n 우클릭 - new - class에서 예제명으로 클래스 만듦. 

 

 

ㅁ 들여쓰기 스페이스 바 보다는 탭으로.

ㅁ 보기 좋게 연산자 앞 뒤로 공백 하나 주기. 

 

 

ㅁ 메소드 블록 내에서 선언되면 Local Variable, 

클래스 블록 내에서 선언되면 Global Variable.

- 지역변수는 메소드 블록 내에서만 사용할 수 있고 메소드 실행이 끝나면 자동 삭제됨.

 

 

 

 

8강. 변수 기본 타입(1) 정수 타입

 

 

ㅁ 자바에서 리터럴(literal)은 소스 코드에 고정된 값을 직접적으로 표현한 것입니다. 

리터럴은 특정 데이터 타입의 값을 나타내며, 변수에 값을 할당하거나 표현식에서 직접 사용할 수 있습니다. 

자바에서 사용되는 리터럴의 종류에는 정수 리터럴, 실수 리터럴, 문자 리터럴, 문자열 리터럴, 불리언 리터럴 등이 있습니다.

- 소스코드에서 프로그래머에 의해 직접 입력된 값.

 

 

기본 타입 Primitive Type

- 자바 언어는 정수, 실수, 논리값을 저장하는 총 8개의 기본 타입을 제공.

- 논리 타입(boolean), 실수 타입(float, double), 정수 타입(char + byte, short, int, long)

 

 

ㅁ '자바에서 정수로 인식되는 리터럴'은 총 4가지가 있다.

- 2진수는 0b 또는 0B로 시작하고 0과 1로 구성됨.

- 8진수는 0으로 시작하고 0~7까지의 숫자로 구성됨.

- 10진수는 소수점이 없는 0~9까지의 숫자로 구성됨.

- 16진수는 0x 또는 0X로 시작하고 0~9까지의 숫자와 A~F 또는 a~f로 구성됨. 

 

 

ㅁ 0xB3을 10진수로 변환.

- B는 11, 3은 3.

- 1011 0011은 십진수로 3+48+128 = 179.

 

 

ㅁ 보통은 십진수로 변수에 대입을 하지만 하드웨어 제어에 사용되는 프로그램은 2진수를 써서 변수에 대입할 수도 있다.

ㅁ 그리고 색깔(rgb)를 표현할 때 16진수 사용할 수도 있음.

 

ㅁ 저장하고 실행하지 않고 그냥 실행하면, 저장하고 컴파일하고 실행할거냐고 물어봄.

 

 

ㅁ long var2 = 20000000000; 

- long에 20000000000이 저장이 가능함에도 불구하고 에러가 발생.

이유는 자바 컴파일러는 정수를 기본적으로 int라고 간주함. 정수 리터럴이 int 범위를 넘으면 에러 발생.

- long var2 = 20000000000l; 혹은 long var2 = 20000000000L; 이렇게 뒤에 L, l을 붙여 long 타입이라고 알려줘야 함

long var2 = (long) 20000000000; 이렇게 명시적 형변환도 가능.

- long var2 = 20L;도 가능. 그냥 20을 long타입으로 간주할 뿐.

int 범위를 초과할때는 L, l을 반드시 붙여야 하지만 초과하지 않으면 안 붙여도 됨.

 

 

ㅁ char 타입

- 하나의 문자를 저장할 수 있는 타입.

- 문자인데도 기본 타입에서 정수 타입인 이유는 작은 따옴표로 감싼 문자 리터럴은 유니코드로 변환되어 저장 되기 때문.

유니코드는 각 나라의 문자를 숫자로 매겨놓음.

- char는 정수 타입이므로 10진수 또는 16진수 형태의 유니코드 저장 가능.

 

 

ㅁ 작은 따옴표가 아닌 큰 따옴표를 붙이면 문자가 아닌 문자열이 됨. 

 

 

ㅁ char c3 = '\u0041';

- \는 이스케이프 문자. 뒤에 u가 있으니 유니코드. 그 뒤엔 4자리의 16진수가 옴. 이 16진수(유니코드 번호)를 저장해라.

- 유니코드의 또 다른 표현 방식. 출력결과는 A.   (65를 16진수로 표현하면 0x41)

 

 

 

 

9강. 변수 기본 타입(2) 실수 타입, 논리 타입

 

자바는 다른 프로그래밍 언어와 다르게 문자와 문자열을 다른 것으로 인식함.

- 문자열은 큰따옴표로 감싼 문자를 말함. 

- 문자열은 char 타입에 저장할 수 없음.

- char var1 = "A";는 에러 남. 

char var2 = "홍길동";도 에러 남.

 

String var1 = "A";

String var2 = "홍길동";

위 둘은 에러 안 남.

 

자바에서 문자열을 나타내는 자료형 String임. string은 에러.

 

 

이스케이프 문자

- 문자열 내부에 \는 이스케이프 문자를 뜻함.

- 이스케이프 문자를 사용하면 특정 문자를 포함시키거나, 문자열의 출력을 제어할 수 있음. 

 

- 예) 문자열 내부에 " 문자 포함

  String str = "나는 \"자바\"를 좋아합니다.";

  

- 예) 문자열 출력 제어

  String str = "번호\t이름\t나이";           <- tab 공간만큼 띄어쓰기

 

  String str = "홍길동\n감자바";            <- 홍길동

                                                                 감자바

 

 

- 캐리지 리턴은 현재 위치를 나타내는 커서 를 맨 앞으로 이동시킨다는 뜻.

메모장에서는 커서를 맨 앞으로 이동시키고 덮어씌우는데

이클립스에서는 그냥 개행만 함.

 

 

ㅁ float은 소수점 이하 자리 정밀도가 7자리, double은 15자리.

- 자바에서 실수는 부동소수점 방식으로 표현하기 때문에 둘 다 정확한 값이 아님.

 

 

ㅁ 코드에서 실수를 표현하는 방법은 2가지가 있음

- 직접 소수점을 작성(10진수 실수)

0.25

- 알파벳 e 또는 E를 포함한 숫자 리터럴은 지수 및 가수로 표현된, 소수점 있는 10진수 실수로인식

5e2 => 5.0 x 10^2 = 500.0                <- 10의 승수는 실수 리터럴에 해당됨.

0.12E-2 => 0.12 x 10^-2 = 0.0012

 

 

자바는 실수 리터럴을 기본적으로 double 타입으로 간주함.

 

 

ㅁ float var = 3.14;

- 컴파일 에러 발생.

- 자바는 3.14를 일단 double타입으로 간주 함. double 타입의 수를 float에 저장할 수는 없어서 에러.

- double 타입으로 저장해야 하거나 float var = 3.14f;, float var = 3.14F; 이렇게 해야 함.

 

 

ㅁ 논리 타입

- 참과 거짓에 해당되는 true와 false 리터럴을 저장하는 타입

  boolean stop = true; 

 

- boolean vs Boolean

boolean 기본형 ( primitive type ): 메모리에 직접 값을 저장. null을 담을 수 없으며 true,false만 담을 수 있다.

Boolean 참조형 ( reference type ): 참조값 ( 주소 ) 을 가진다. null을 담을 수 있다.

 

 

 

 

10강. 변수 타입 변환(1) 타입 변환

 

 

ㅁ 타입 변환

 

(1) 자동 타입 변환 promotion

 

- 값의 허용범위가 작은 타입이 큰 타입으로 저장될 경우

 

- byte < short < int < long < float < double

실수 타입은 모든 정수 타입보다 더 큰 허용범위를 가짐. 

 

- long longValue = 50000000000L;

float floatValue = longValue;                   // 5.0E9F로 저장됨.

double doubleValue = longValue;           // 5.0E9로 저장됨.

(정수 타입은 실수 타입으로 자동 형변환)

 

- char 타입의 경우 int 타입으로 자동 변환 될 수 있음.

이때 유니코드 값이 int 타입으로 저장됨.

 

- 문자 리터럴 'A'는 내재적으로 char 타입. 문자열 리터럴은 String 타입.

char charValue = 'A';            // 형변환 x. 

int intValue = charValue;      // 65가 저장됨.

 

- char 타입을 변환할 때 주의할 점. 

byte byteValue = 65;

char charValue = byteValue;        // 컴파일 에러. 

 

byte 타입을 char 타입으로 변환시키면 에러 발생함. (char) 붙이거나 int는 가능.

byte는 -128 ~ 127인데 유니코드는 음수가 없음. 

 

 

(2) 강제 타입 변환 casting

- 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 쪼개어( =나누어 한 조각만) 저장

- 캐스팅 연산자 괄호 () 사용: 괄호 안이 나누는 단위

int a = 10;

byte b = (byte) a;             //           강제 타입 변환

 

 

 

 

11강. 변수 타입 변환(2) 정수/실수 연산에서의 자동 타입 변환

 

 

정수 타입 변수가 산술 연산식에서 피연산자로 사용되는 경우

- byte, short, char 타입 변수는 int 타입으로 자동 변환                 //         char도 정수 타입이어서 int로 자동 형변환.

 

- 피연산자 중 하나가 long 타입이면, 다른 피연산자는 long 타입으로 자동 변환

 

byte r=5, t=5;
byte a = r + t;

 

컴파일 에러 발생.  연산시 int가 되기 때문. int가 값의 허용범위가 더 커서 자동 형변환 안 됨. 

 

-

byte a = 5 + 5;

는 가능한 이유.

 

자바는 컴파일할 때도 연산을 수행 함. 

10 + 20은 리터럴이기 때문에 자바 컴파일러가 연산을 수행하는데 아직까진 타입이 정해지지 않아서 왼쪽의 타입을 보고 맞춰서 연산을 함. 

 

그러나 리터럴이 변수에 저장되고 변수끼리 연산을 하면

자바 컴파일러가 연산하지 않고 JVM이 연산을 수행함. (int 보다 아래면 int로 변환해서 연산)

 

(?) float var = 3.14;는 컴파일 에러 남. 

 

 

 

ㅁ 실수 연산에서의 자동 타입 변환

- 피연산자 중 하나가 double 타입일 경우, 다른 피연산자도 double 타입으로 자동변환

int a = 10;

double b = 5.5;

double r = a + b;       // a가 double로 형변환됨. 10.0이 됨.

 

- 다른 타입 연산이 필요할 경우 먼저 강제 변환한 뒤 연산 수행

int a = 10;

double b = 5.5;

int r = a + (int) b;     // 15

 

double r = 1.5 + 2.3;      // 에러 x.

float r = 1.5 + 2.3;         // 에러 남. 1.5f + 2.3f로 되야 함. 

 

 

ㅁ 

- 자바에서 정수 나누기 정수는 정수값이 나온다. 이 과정에서 소수점 이하는 버린다.

- float이나 double에서 정수로 형변환할 때, 소수점 이하는 버린다. 

 

 

 

 

12강. 변수 타입 변환(3) +연산에서의 문자열 자동 타입 변환, 문자열을 기본 타입으로 강제 타입 변환

 

ㅁ +연산

- 피연산자가 모두 숫자일 경우 덧셈 연산.

- 피연산자 중 하나가 문자열일 경우 나머지 피연산자도 문자열로 자동 변환되고 문자열 결합 연산.

 

- +연산은 앞에서부터 순차적으로 수행.

- 먼저 수행된 연산이 결합 연산인 경우 이후 모든 연산이 결합 연산이 됨.

 

 

ㅁ 문자열을 기본 타입으로 강제 변환

 

- 캐스팅 연산자 ( )를 사용하는게 아니라 자바가 제공하는 api 클래스를 이용해서 변환함.

- Byte.parseByte(str);

Byte는 클래스 이름, parseByte는 메소드 이름, str은 매개변수로 들어감. 

 

 

ㅁ 문자열이 숫자 외 요소를 포함할 경우 숫자 타입 변환 시도시 숫자 형식 예외 발생

- String str = "1a";

int value = Integar.parseInt(str);          //       NumberFormatException 발생 (컴파일 에러)

 

 

ㅁ String.valueOf() 메소드 사용하여 기본 타입을 문자열로 변환

- 이건 반대로 int나 double이라는 기본 타입의 값을 문자열로 변환.

 

String str = String.valueOf(3);         //       "3" 저장

 

String z = String.valueOf(true);        //       boolean 타입값 true를 문자열로 변환
System.out.println(z);

 

 

- (2) 문자열 결합 연산자를 쓰는 방법도 있음.

String str = "" + 3;       // "3" 저장