8일차 08/30/2022

SangYu Lee·2022년 8월 30일
0

codestates backend

목록 보기
9/30

1. 타입

실수

double형 리터럴에는 접미사 d를 붙여도, 붙이지 않아도 되지만, float형 리터럴에는 반드시 접미사 f를 붙여주어야 한다.

double db = 2435;
float fl = 2.4302f;

컴퓨터의 실수 저장 방식
컴퓨터는 2진수로 수를 표현하는데,

263.3 => 100000111.01001100110011......(0011) 처럼 실수를 표현할 때에는 무한반복인 상황이 발생한다. 표현 방법으로는 2가지가 있다.

부동소수점 방식 (IEEE 표현법)

위에 나왔던 263.3 = 1/0000/0111.01001100110011...(0011)의 경우를 예로 들면

  1. 소수점 앞에는 1자리로 고정시킨다.
    => 1.00000111.01001100... * 2^8의 형식으로 나타낸다.
  2. 부호비트에 양수인 0을 저장하고, 2^8에서 지수부분인 8을 지수비트에 저장한다.
  3. 소수점 이하의 숫자를 가수라고 하고 가수비트에 저장한다.

그렇게 하면

  • 부호 비트(1 bit) : 0 (양수)
    지수 비트(8 bit) : 10000111 (127 + 8 = 135)
    *IEEE방식에서는 지수 + 127을 저장하는 방법을 사용한다.
    가수 비트(23 bit) : 00000111010011001100110

이렇게 나타낼 수 있게 된다. 물론 이 방법으로 정확히 나타낼 수 없다. 실제로 값은 10진수로 0.29998779296875을 나타낸다.

고정소수점 방식

그래서 나온 해결책으로 나온 것이 바로 이 고정소수점 방식은 아니다. 고정소수점은
정수를 표현하는 비트 수와 소수를 표현하는 비트 수를 미리 정해 놓고 해당 비트 만큼만 사용해서 숫자를 표현하는 방식이다.
예) 실수 표현에 4byte(32bit)를 사용하고 그 중 부호(아래에서 괄호로 표시) 1bit, 정수 16bit, 소수 15bit를 사용하도록 약속해 놓은 시스템에 있다고 가정했을 때 이렇게 약속 된 시스템에서 263.3을 표현하면 (0)0000000100000111.010011001100110 이렇게 표현되는데
정수를 표현하는 bit를 늘리면 큰 숫자를 표현할 수 있지만 정밀한 숫자를 표현하긴 힘들다. 그래서 소수를 표현하는 bit를 늘릴 경우 정밀한 숫자를 표현할 수 있지만 큰 숫자를 표현하지 못한다.

출처 : https://steemit.com/kr/@modolee/floating-point


2. String(문자열)

character (문자1개)를 작은 따옴표(' ')로 나타내는 것과 다르게 String은 큰 따옴표(" ")로 표현한다.

선언한 변수에 문자열을 할당하는 방법은 두 가지가 있다.

  1. 문자열 리터럴을 할당하는 방법 : 변수 = “문자열”;

  2. String 클래스의 인스턴스를 생성하여 할당하는 방법 : 변수 = new String(”문자열”);

공통점으로는

System.out.println(str);

처럼 String 타입의 변수를 참조하면 String 클래스의 메서드인 toString()이 자동으로 호출되면서 String 타입의 변수가 저장하고 있는 주소값에 위치한 String 인스턴스의 내용을 문자열로 변환시켜서 반환해준다는 것이다.
차이점은 리터럴 방식으로 생성한 문자열은 메모리에 하나만 생성되고 주소를 같은 문자열을 가지는 변수들끼리 공유하고 있으나 String 클래스의 인스턴스로 생성된 변수들은 각자 문자열은 같을지라도 변수가 담고있는 참조값이 각각 다르다.

String name1 = "SangYu";
String name2 = "SangYu;

String name3 = new String("SangYu");
String name4 = new String("SangYu");

boolean comparison1 = name1 == "SangYu";          // true
boolean comparison2 = name1 == name2;             // true
boolean comparison3 = name1 == name3;             // false
boolean comparison4 = name3 == name4;             // false
boolean comparison5 = name1.equals("SangYu");     // true
boolean comparison6 = name1.equals(name3);        // true
boolean comparison7 = name3.equals(name4);        // true

String 클래스의 메서드

charAt ()
compareTo ()
concat ()
indexOf ()
trim ()
toLowerCase, toUpperCase ()

Stringtokenizer

int countTokens {}
boolean hasMoreElement
hasMoreTokens()
Object nextElement, String nextToken()

StringBuilder StringBuffer

append ()
capacity ()
delete ()
deleteCharAt ()

...등등 여러가지가 있다.


3. 연산자의 우선순위


4. 콘솔 입출력

콘솔 입력

import java.util.Scanner;                 // Scanner 클래스를 가져옵니다.

Scanner scanner = new Scanner(System.in); // Scanner 클래스의 인스턴스를 생성합니다.
String inputValue = scanner.nextLine();   // 입력한 내용이 inputValue에 저장됩니다.

System.out.println(inputValue);           // 입력한 문자열이 출력됩니다.

사용법을 익히면 될 것 같다. Scanner 클래스의 인수로 System.in을 받는다는게 중요 포인트로 보인다.

import java.util.Scanner;	// Scanner 클래스 호출
 
public class Main {
	public static void main(String[] args) {
 
		Scanner in = new Scanner(System.in);	// Scanner 객체 생성
 
		byte a = in.nextByte(); 		// byte 형 입력 및 리턴
		short b = in.nextShort(); 		// short 형 입력 및 리턴
		int c = in.nextInt(); 			// int 형 입력 및 리턴
		long d = in.nextLong(); 		// long 형 입력 및 리턴
 
		float e = in.nextFloat(); 		// float 형 입력 및 리턴
		double f = in.nextDouble(); 	// double 형 입력 및 리턴
 
		boolean g = in.nextBoolean(); 	// boolean 형 입력 및 리턴
 
		String h = in.next(); 			// String 형 입력 및 리턴 (공백을 기준으로 한 단어를 읽음)
		String i = in.nextLine(); 		// String 형 입력 및 리턴 (개행을 기준으로 한 줄을 읽음)
	}
 
}

출처 = https://st-lab.tistory.com/92
깊이있는 이해를 위해 참고할 문서 https://st-lab.tistory.com/41

profile
아이스커피

0개의 댓글