2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

20240723_TIL_캠프 2주차 2일_변수의 종류, 형변환, 강의 과제

2024. 7. 23. 17:56ㆍ내배캠_Java 6기/Java 문법 종합반

💖 변수 타입 

📌 기본형

 

논리형 변수 : boolean

 

True 1 / false 0 값만 저장한다

⁉️ boolean 타입이니까 ‘boolean a = 1’ 이라고 하고싶은데 오류가?
➡️ 1이라는 값은 자바가 이해하기에 boolean 타입이 아니라 정수형 타입

 

 

문자형 변수 : char 

 

‘A’, ‘1’ 과 같이 문자 하나만 저장하고 따옴표 1개로 표시한다. 문자 1개이고 문자열이 아니다.

 

 

정수형 변수 : byte. short, int, long 

  • byte : -128 ~ 127 범위의 숫자만 저장 가능
  • short (2byte)는 -32,768~32,767 범위의 숫자만 저장 가능
  • int (4byte)는 -21억~21억 범위의 숫자만 저장 가능
  • long (8byte)은 9백경 정도의 매우 큰 수를 저장 가능
byte byteNumber = 127; // byte 는 -128 ~ 127 범위의 숫자만 저장 가능합니다.

short shortNumber = 32767; // short 는 -32,768~32,767 범위의 숫자만 저장 가능합니다.

int intNumber = 2147483647; // int 는 -21억~21억 범위의 숫자만 저장 가능합니다.

long longNumber = 2147483647L; // long 은 숫자뒤에 알파벳 L 을 붙여서 표기하며 매우 큰수를 저장 가능합니다.

 

 

실수형 변수 : .float, double 

 

소수점이 있는 실수값을 저장.

 

실수도 각 변수 표현 범위를 넘는 숫자를 넣으면 오버플로우가 발생하고 출력해보면 입력값과 다른 값으로 표현된다. 특히 실수는 표현 범위가 매우 넒어서 정수형 변수에서 담지 못할 수 있다.

  • float (4byte) : 3.4 * -10^38 ~ 3.4 * 10^38(long 보다 큼) 범위의 숫자 저장이 가능
  • double (8byte) : 1.7 * -10^308 ~ 1.7 * 10^308(long 보다 큼) 범위의 숫자 저장이 가능

 

 

 

📌 참조형(reference) 변수 : 어느 공간에 있는 주소값을 바라보고 있는 변수

 

문자열 변수 String : "Apple” 와 같은 문장을 저장함   

 

 

Object, List, Array  :  객체, 배열, 리스트 등 단일 저장공간에 담을 수 없는 값을 저장

 

 

래퍼 클래스 변수

 

✅ 기본형 변수를 클래스로 감싸는(랩핑) 변수

 

✅ 기본형 변수 타입에서 첫 글자를 대문자로 변경해 정의할 수 있다

 

 

박싱 vs 언박싱

  • 기본 타입에서 래퍼 클래스 변수로 감싸는 것을 박싱이라고 부름. 큰 상자에 작은 것들을 넣기 
  • 래퍼 클래스 변수를 기본 타입 변수로 가져오는 것을 언박싱이라고 부름. 택배 언박싱

박싱 VS 언박싱

박싱
Integer 래퍼 클래스 num 에 21 의 값을 저장

int number = 21;
Integer num = new Integer(number);

=> deprecated 지원 종료

Integer num = number => 이렇게만 해도 됨

언박싱
int n = num.intValue(); => 래퍼 클래스들은 inValue() 같은 언박싱 메서드들을 제공

 

 

✅ 실습한 int, Integer 외에도 모든 기본 타입에는 래퍼 클래스가 있다.  

기본 타입  래퍼 클래스
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

 

⁉️  왜, 굳이 래퍼 클래스를 사용하는 건지?
➡️클래스는 객체지향 언어인 Java의 핵심 기능이어서 클래스로 변수를 관리하면 객체지향의 많은 기능을 사용할 수 있게 된다

 

 

 

📌 숫자와 문자

저장공간에 저장하는 값은 0,1 을 통한 숫자값을 저장

⁉️ 그러면 문자는 어떻게 숫자로 저장할까?

➡️ 슷자를 문자로 매핑해서 표현하는데 자바에서는 아스키 코드라는 규칙으로 문자를 저장

 

 

👇 아스키 코드 표 

 

 

 

• 아스키 코드 숫자를 문자로 출력 

// 숫자 -> 문자
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int asciiNumber = sc.nextInt();
		char ch = (char)asciiNumber; // 문자로 형변환을 해주면 숫자에 맞는 문자로 표현됩니다.

		System.out.println(ch);
	}

}

// 입력
97

// 출력
a

 

 

• 아스키 코드 문자를 숫자로 출력 

// 문자 -> 숫자

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		// 프로그래밍 세계에서는 모든 순서는 0부터 시작
		char letter = sc.nextLine().charAt(0); // 첫번째 글자만 받아오기위해 charAt(0) 메서드를 사용합니다.
		int asciiNumber = (int)letter; // 숫자로 형변환을 해주면 저장되어있던 아스키 숫자값으로 표현됩니다.

		System.out.println(asciiNumber);
	}

}

// 입력
a

// 출력
97

 

 

 

📌 문자와 문자열의 차이점 

문자 : 기본형

문자열 : 참조형

 

char : 문자 한 개만 저장하며 홑따옴표를 사용해 지정

String : 문자 여러 개를 문장 형태로 저장하며 쌍따옴표를 사용해 지정

 

- 저장 관점

문자 : 1 byte 만 사용해서 데이터 끝이 어딘지 알아서 \0(널문자)가 없고 데이터만 저장하면 됨

문자열 : 몇개의 byte를 사용할 지 모르기 때문\0(널문자) 가 함께 저장이 되며 끝을 표시해야 함

 

 

 

📌 비트&바이트

1 byte = 8 bit

1byte 내에서 숫자 변수는 bit 2진수를 10진수로 저장(표현) => 이게 무슨 말이지?

 

➡️ 컴퓨터가 숫자를 저장할 때, 내부적으로는 2진수(0과 1)로 저장하지만, 이를 인간이 이해하기 쉽게 10진수로 표현한다는 뜻이다.

  1. 2진수(바이너리): 컴퓨터는 숫자를 저장할 때 0과 1로 구성된 2진수를 사용. 1 Byte는 8개의 Bit로 이루어져 있으므로, 8자리의 2진수를 저장할 수 있다.
    예: 11001010 (2진수) ⇒ 2 + 8 + 64 + 128 =202

  2. 10진수(디지털): 우리가 일반적으로 사용하는 10진수로 변환하면, 컴퓨터가 내부적으로 저장한 2진수를 우리가 이해할 수 있는 10진수로 나타낸다.
    예: 11001010 (2진수) -> 202 (10진수)

 

⭐ 즉, 컴퓨터는 숫자 데이터를 2진수 형태로 저장하지만, 이를 표현할 때는 우리가 쉽게 이해할 수 있는 10진수로 변환하여 보여준다는 의미이다 

 

 

다시 정리하면

  • 1 Byte는 8개의 Bit로 구성되어 있고, 이 8개의 Bit로 0부터 255까지의 숫자를 표현할 수 있다.
  • 컴퓨터 내부에서는 숫자를 2진수로 저장하지만, 이를 10진수로 변환하여 우리에게 보여준다.

 

1 바이트 내에서 문자 변수의 경우만 bit 2진수를 16진수로 표현 ⇒ 아스키 코드

 

 

 

📌 형변환 ( Type Casting )

 

형변환 :  변수의 타입을 변환. 문자열 → 숫자, 정수 → 실수, 실수 → 정수

 

public class TypeCasting {
    public static void main(String[] args) {
        형 변환
        문자열 -> 슷자
        정수 -> 실수
        실수 -> 정수

        double or float형 -> int
        실수 -> 정수(0.xxxx ->0)
        
        double doubleNumber=10.101010;
        float floatNumber=10.1010f;

        변환(int)
        
        int intNumber;
        intNumber=(int)floatNumber;

        System.out.println("Float Type = "+ floatNumber);  10.101
        System.out.println("Int Type = "+ intNumber); 10으로 형변환이 됬다 

        intNumber=(int)doubleNumber; // double -> int

        System.out.println("Double Type = "+ doubleNumber); 10.10101
        System.out.println("Int Type = "+ intNumber); 10으로 형변환이 됬다
    }
}

 


 

📌 자바 문법 종합반 1주차 과제

 

 

import java.util.Scanner;

public class RecipeBook {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        String cook=sc.nextLine();

        float rate=sc.nextFloat();

        sc.nextLine();

        String recipe1=sc.nextLine();
        String recipe2=sc.nextLine();
        String recipe3=sc.nextLine();
        String recipe4=sc.nextLine();
        String recipe5=sc.nextLine();
        String recipe6=sc.nextLine();
        String recipe7=sc.nextLine();
        String recipe8=sc.nextLine();
        String recipe9=sc.nextLine();
        String recipe10=sc.nextLine();



        System.out.println("[ "+cook+" ]");


        int ratenum=(int)rate;

        // 퍼센트계산
        double percent=((double)ratenum*100)/5;

        System.out.println("별점 : "+ratenum+" ( "+percent+"%"+ " ) ");

        System.out.println("1."+recipe1);
        System.out.println("2."+recipe2);
        System.out.println("3."+recipe3);
        System.out.println("4."+recipe4);
        System.out.println("5."+recipe5);
        System.out.println("6."+recipe6);
        System.out.println("7."+recipe7);
        System.out.println("8."+recipe8);
        System.out.println("9."+recipe9);
        System.out.println("10."+recipe10);
    }
}

 

오류  Exception in thread "main" java.util.InputMismatchException 

실수 입력 받기 전후의 nextLine() 처리
nextFloat()를 호출한 후에 nextLine()을 한 번 더 호출하여 버퍼에 남아 있는 개행 문자를 처리해야 한다 . 그렇지 않으면, nextLine()이 기대하지 않는 빈 문자열을 읽어오게 되어 입력 흐름이 깨질 수 있다.

정수형 별점 계산 오류
별점의 퍼센트 계산식에서 소수점 계산이 필요하기 때문에 ratenum을 double로 캐스팅해야 한다.

 

 

최종 결과

 

728x90