본문 바로가기
JAVA/이것이 자바다

[Chapter 02] 변수와 타입

by Dream Jin 2022. 12. 3.

Chapter 02 변수와 타입

2.1 변수선언

변수 = 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름

자바의 변수는 다양한 타입의 값을 저장할 수 없다. -> int형인데 float을 저장할 수 없다. ⇒ 정적 Type 이다.

변수의 이름은 그값을 표현할수 있도록 ⇒ 캐멀 (camel)스타일로 (변수의 시작은 무조건 문자여야 한다) 특수문자는 $ 랑 _ 만가능

캐멀 스타일 = 코드를 작성할때, 여러 단어를 혼합하여 명명하는 경우, 낙타의 등처럼 대소문자가 섞여있도록 작성하는 스타일, 자바 소스 파일명과 변수명을 작성할 때 관례적으로 사용

  1. 자바 소스 파일명(클래스명)은 대문자로 시작하는것이 관례
    Week.java
    MemberGrade.java
    ProductKind.java
  2. 변수명은 소문자로 시작하는것이 관례
    score
    mathScore
    sportsCar
    → 변수명의 길이랑 프로그램 실행속도는 무관

변수에 값을 대입할땐

int score;

score = 90 오른쪽의 값을 왼쪽의 변수에 대입! 오른쪽은 값 왼쪽은 변수

변수 선언은 저장되는 값의 타입과 이름만 결정, 실질적으로 메모리에 할당 되는 것은 아님.
-> 최초로 값이 대입될때 = 변수 초기화 = 메모리에 값이 할당 된다.

<두 변수 값 교환>

public static void main(String[] args) {
        int x =3;
        int y =5;
        System.out.println("x: " + x +",y: "+y);

        int temp = x;
        x = y;
        y = temp;
        System.out.println("x: " + x +",y: "+y);

    }

2.2 정수타입

  • byte char short int long
    타입 메모리크기 저장되는 값의 허용범위  
    byte 1byte (8bit) -128~ 127  
    short 2byte (16bit) -32,768~32,767  
    char 2byte (16bit) 0~65,535(유니코드)  
    int 4byte (32bit) -2.147,483,648~2,147,483,647 (-+ 21억)  
    long 8byte (64bit) -9~ long타입은 마지막에 L,l을 붙여야한다.

→ 각 메모리 할당 크기 정도는 외우기

종류 byte short int long
메모리 사용크기 8 16 32 64
→ 2의 8승 16승 32승 64승        

최상위 비트는 부호를 나타낸다 (0은 양수, 1은 음수) 나머지 2의 n-1승 -1
ex) 최상위 비트는 부호비트로 사용하고 나머지 7bit로 값의 범위를 결정한다
(1의 보수를 정해서 +1을해서 정한다 최상위 비트가 음수일때)

→ 프로그래머가 직접 입력한 값 리터럴(literal)

//2진수: 0b, 0B로 시작하고 0과1로작성
int x =0b1011;

//8진수: 0으로 시작 0~7로 작성
int x = 013;

//10진수: 소수점이 없는 0~9로 작성
int x = 12;

//16진수: 0x, 0X로 시작하고0~9랑 A,B,C,D,E,F or a,b,c,d,e,f로 작성
int x = 0x2A0F;

2.3 문자타입

문자를 숫자로 바꿔서 저장을하기 때문에 char가 정수타입에 있다. (아스키코드, 유니코드)

문자타입은 작은따음표(’’)로 감싼것을 문자 리터럴 → 문자 타입은 문자 1개만 2개이상은 → 문자열이 된다.

char var1 = 'A';
char var2 = '가';
char c = 65 -> 매핑 되는 문자는 A
char c = 0x0041 -> 16진수와 매핑되는건 A

//빈 문자를 초기화 하기위해서는 공백을 넣어준다
char c = '';//컴파일 에러
char c = ' '; //공백 하나를 넣어서 초기화

2.4 실수타입

타입 메모리크기 유효 소수 이하 자리    
float 4byte - 32bit 7자리 부호(1bit)+지수(8bit)+가수(23bit) =32bit = 4byte 동일하게 float으로 저장하기 위해선 f,F붙여준다
double 8byte - 64bit 15자리 부호(1bit)+지수(11bit)+가수(52bit)=64bit = 8byte  

java에서 정수타입의 기본은int 실수타입의 기본은 double로 인식한다.

정수형이랑, 실수형 32bit 64bit 메모리 크기는 동일한데 왜 저장되는 숫자의 크기가 다른가? → 저장방식이 다르다

정수형은 비트를 나열해서 최상위비트는 부호비트 나머지로 2진수로 계산해서 수를 계산

실수형은 부호 + m* 10n승 에서 (m은 가수, n은 지수) (m과 n만 저장하게 된다)

2.5 논리 타입

True, False를 의미함. 논리 리터럴은 boolean타입 변수에 다음과 같이 대입

boolean stop = true;
boolean stop = false;

→ 보통 조건문과 제어문의 실행흐름을 제어하는데 사용된다. 보통 오른쪽엔 연산식이 온다.

2.6 문자열 타입

문자열은 큰따옴표(””)로 감싸야 한다.

char var1 ="A"; //컴파일 에러
char var2 = '홍길동'//컴파일 에러

String var1 = "홍길동";

→ 이스케이프 문자 역슬래쉬()

\n → 출력 시 줄바꿈(라인피드)

\r → 출력 시 캐리지 리턴 (앞으로 땡기는거)

즉 window에서 enter → \r \n이다.

JAVA 13부터는 텍스트 블록 문법을 제공한다

string str = """
여기는 전체 문자열로 인식한다
"""

2.7 자동 타입 변환

큰 허용 범위 타입 = 작은 허용 범위 타입 이면

작은 허용 범위 타입 → 큰 허용 범위 타입으로 변환된다.

byte < short, char< int < long < float < double

byte byteValue = 10;
int intValute = byteValue; //자동 타입 변환

정수 타입이 실수 타입으로 대입 될때는 무조건 자동 타입 변환 된다.

(메모리 크기로 보았을땐 성립하지 않지만, 실제 허용 범위는 실수타입이 훨씬 크기때문이다 → 실수타입의 저장 방법이 다르므로)

But Char의 경우 예외가 존재

char charValue = 'A' 
int intValue = charValue //의 경우 intValue에 65저장 but

byte byteValue = 65;
char charValue = byteValue; //의 경우 char는 음수를 지원하지 않으므로 컴파일 에러 발생

2.8 강제 타입 변환

작은 허용 범위 타입 = (작은 허용 범위 타입) 큰 허용 범위 타입

의 경우 강제 타입 변환이 필요하다.(괄호를 캐스팅 기호라고 한다)

int intValue = 10;
byte byteValue = (byte)intValute; //강제 타입 변환

/* int는 4byte인데 거기서 제일마지막 꺼만 byte로 넣고 나머지는 버린다 */

2.9 연산식에서 자동 타입 변환

자바는 실행 성능을 향상시키기 위해 컴파일 단계에서 연산을 한다.

정수 리터럴 10, 20을 더할때는 30이연산된다 result에 저장되어 컴파일 된다. 즉 byte 타입

byte result = 10 + 20; 리터럴 일때만! but 변수는 다르다

byte type 변수가 피연산자로 사용된 경우
byte x = 10;
byte y = 20;
byte result = x + y; //컴파일 에러 x,y는 변수이므로 기본인 int로 받기때문에 에러가 발생
int result = x + y; //정상실행

int 타입 변수가 피연산자로 사용된 경우
int x = 10;
int y = 20;
int result = x + y;

피연산자중 하나가 long type이면 long type

→ 간단하게 더 큰 형으로 변환된다.

자바에서 + 는 2개

피연산자가 상수이면 그냥 산술연산

피연산자중 문자열이 있다면 자동으로 문자열로 변환되어서 계산

int valte = 1+2+3; => int value =6
String str = 1+2+"3" => String str = "33";
String str = 1+"2"+3 => String str = "123";
String str = "1"+2+3 => String str = "123";

2.10 문자열을 기본 타입으로 변환

자바에서 입력을 받을때 문자열로 입력을 받는 경우가 많다(네트워크나, 사용자의 키보드를 통해), 이때 문자열을 기본타입으로 변환하는 방법

변환 타입 사용 예
→ byte String str = “10”;
byte value = Byte.parseByte(str); #parse → 해석한다  
→ short String str = “200”;
short value = Short.parseShort(str);  
→ int String str = “300000000”;
int value = Integer.parseInt(str);  
→ long String str = “4000000000000”;
long value = Long,parseLong(str);  
→ float String str = “12.345”;
float value = Float.parseFloat(str);  
→ double String str = “12.345”;
double value = Double.parseDouble(str);  
→boolean String str = “ture”;
boolean value = Boolean.parseBoolean(str);  
여기는 문자열을 기본타입으로 변환할때
기본 type → 문자열 Stirng str = String.valueOf(기본타입값);

String → int, double 코테에 자주사용

2.11 변수 사용 범위

public static void main(String[] args){
int var1;

if(---){
    int var2;
//var1, var2 사용가능
}

for(---){
    int var3;
//var1, var3 사용가능
}

//var1 만 사용가능
//var2,3 사용불가
}

→ 자기가 선언된 블록 내부에서만 사용가능하다. (자바는 블럭 단위의 변수 선언! , 함수단위 아님)

2.12 콘솔로 변수값 출력

System.out.println(리터럴 또는 변수);
시스템으로 / 출력해라 / 괄호 안의 내용을 출력하고 행을 바꿔라

메서드 호출 
println(); 여기서 println 메서드이름 괄호가 들어가면 이메소드를 실행해라 
메소드 의미
println(내용); 괄호안의 내용을 출력하고 행을 바꿔라
print(내용); 괄호안의 내용을 출력하고 행을 바꾸지마라
printf(”형식 문자열”, 값1, 값2); 형식 무자열에 맞추어 뒤의 값을 출력해라.

→ pirntf 에서

printf에 형식 문자열의 경우 %conversion(변환문자) 이다. 
사이에 여러 옵션도 가능하다.
conversion에 제공되는 값은 타입에 따라 d(정수), f(실수), s(문자열)등이 있다.
ex)

System.out.printf("이름: %s", "김자바") -> 이름: 김자바
System.out.printf("나이: %d". 25); -> 나이: 25

System.out.printf("이름: %1$s, 나이: %2$d", "김자바", 25) -> 이름: 김자바, 나이: 25
-> 형식 묹자열에 포함된 값이 두개 이상일경우 
순번을 포함시킨다. 1$ 첫번째, 2$ 두번째 

2.13 키보드 입력 데이터를 변수에 저장 코테에 자주이용

→ 가장 쉬운 방법은 Scanner

Scanner scanner = new Scanner(System.in);
//scanner변수 선언 = Scanner 객체 생성
//생성된 Scanner를 변수에 대입

 //Scanner 타입의 변수를 선언하게 되면 -> 대입 연산자 = 를 사용해서
// new연산자를 통해 Scanner객체를 변수에 대입.

String inputData = scanner.nextLine();
//Stinrg 변수선언, 엔터키를 누르면 입력된 문자열을 읽고 -> 해당 문자열을 String변수 inputData에
//저장
//Scanner 사용법
import java.util.Scanner;

public class ScannerExample {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); //변수 선언
        /*타입 -> 처음에는 에러발생(기본타입이 아니므로) ->
         따라서 Scanner를 import해준다
         -> 현재 컴퓨터의 입력장치(키보드)로부터 데이터를 읽어와라
        */
//        System.out.print("x값 입력: ");
//        String strx = scanner.nextLine();
//        int x = Integer.parseInt(strx);
//        //숫자가 아닌게 입력되면 에러가뜸
//        System.out.println(strx);
//        
//        System.out.print("y값 입력: ");
//        String stry = scanner.nextLine();
//        int y = Integer.parseInt(stry);
//        
//        int result = x + y;
//        System.out.println("x + y: "+ result);

        while(true) {
            System.out.print("입력 문자열: ");
            String data = scanner.nextLine();
            if(data.equals("q")) {
                break;
            }
            System.out.println("출력 문자열: "+data);
            System.out.println();
        }
        System.out.println("종료");

    }

}

'JAVA > 이것이 자바다' 카테고리의 다른 글

[Chapter 06] 클래스  (0) 2022.12.31
[Chapter 05] 참조 타입  (0) 2022.12.31
[Chapter 04] 조건문과 반복문  (0) 2022.12.03
[Chapter 03] 연산자  (0) 2022.12.03
[Chapter01] 자바 시작하기  (0) 2022.11.29

댓글