초기화 블럭
·
자바/기본적인 개념
1. 클래스 초기화 블럭 - 클래스 변수의 복잡한 초기화에 사용된다. - 보통 "static { ... }" 형식으로 사용된다. - 클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번만 수행된다. - 앞서 배운 내용이지만, 클래스 초기화이므로 인스턴스 변수를 초기화하지 못한다. 2. 인스턴스 초기화 블럭 - 인스턴스 변수의 복잡한 초기화에 사용된다. - 보통 "{ ... }" 형식으로 사용된다. - 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때 마다 수행된다. - 인스턴스 변수의 초기화는 주로 생성자를 사용하고, 인스턴스 초기화 블럭은 모든 생성자에서 공통으로 수행돼야 하는 코드를 넣는데 사용한다. - 아래의 예제를 통해 이해하자. ( 위 예제에서 두 생성자는 "this.x++"을 ..
생성자
·
자바/기본적인 개념
1. 하나의 클래스의 인스턴스가 생성되는 코드의 단계 (1) 연산자 new에 의해서 메모리(heap)에 클래스의 인스턴스가 생성된다. (2) 생성자가 호출되어 수행된다. (3) 연산자 new의 결과로, 생성된 클래스의 인스턴스의 주소가 반환되어 참조변수에 저장된다. ( 주의할 점은 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다. ) 2. 생성자에서 다른 생성자 호출하기 - this(), this - this는 참조변수로 인스턴스 자신을 가리킨다. - 사실 생성자를 포함한 모든 인스턴스 메서드에는 자신이 관련된 인스턴스를 가리키는 참조변수 'this'가 지역변수로 숨겨진 채로 존재한다. - 같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출..
가변 인자(varargs)
·
자바/기본적인 개념
1. 가변 인자 (1) 아래와 같은 "타입... 변수명"과 같은 형식으로 선언하며, PrintStream 클래스의 printf()가 대표적인 예이다. public PrintStream printf(String format, Object... args) { ... } (2) 가변 인자 외에도 더 추가할 매개변수가 있다고 한다면, 맨 뒤에 가변 인자를 두어야 한다. (3) 아래의 함수와 같이 앞에 가변인자를 두게 되면 컴파일 에러가 발생한다. public PrintStream printf(Object... args, String format) { ... } 2. 예제 - 가변 인자를 활용하여 오버로딩 구현 ( 위 예제는 오버로딩을 구현했는데, 계속 해서 매개변수를 String으로 늘린다면, 차라리 Strin..
오버 로딩
·
자바/기본적인 개념
1. 오버 로딩 - 한 클래스 내에서 같은 이름을 가진 2개 이상의 메서드를 아래의 조건이 만족한다면, 정의할 수 있다. (1) 메서드 이름이 같아야 한다. ( 단, 반환 타입은 달라도 괜찮다. ) (2) 매개변수의 개수 또는 매개변수의 타입이 달라야 한다. ( 또는 이라는 말은 둘 중 하나의 조건만 맞다면, 오버로딩을 적용할 수 있다는 것이다. ) 2. 잘못된 예제(1) ( 매개변수의 이름이 다르더라도 갯수가 똑같기 때문에 에러가 발생한다. ) 3. 잘못된 예제(2) ( 위의 반환 타입 int와 long은 오버 로딩에 아무런 영향을 주지 않기 때문에, 오버 로딩을 할 때 오직 매개변수에만 고려해야 한다. ) 4. 올바른 예제(1) ( 이렇게 매개변수에 개수를 다르게 함으로써 오버로딩을 가능케 한다. )..
클래스 맴버와 인스턴스 맴버간의 참조와 호출
·
자바/기본적인 개념
# 같은 클래스에 속한 맴버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출이 가능하다. # 단, 클래스 맴버가 인스턴스 맴버를 참조 또는 호출하고자 하는 경우에는 인스턴스를 생성해야 한다. -> 그 이유는 인스턴스 맴버가 존재하는 시점에는 클래스 맴버는 항상 존재하지만, 클래스 맴버가 존재하는 시점에 인스턴스 맴버가 존재하지 않을 수 있기 때문에 컴파일러가 에러를 발생하게 한다. 1. 예제 - 클래스 변수가 인스턴스 변수를 참조할 때 에러발생 int a; static int b = a; 에러 발생 // 에러발생 static int b = new Exercise001().a; // 컴파일 가능 2. 예제 - 참조변수를 사용하지 않고 인스턴스 메서드 참조하기.
클래스 메서드(static 메서드)와 인스턴스 메서드
·
자바/기본적인 개념
1. 클래스 메서드(static 메서드) (1) 인스턴스와 관계없는 메서드를 클래스 메서드이다. ( 인스턴스 멤버는 객체 생성시 메모리에 올라가지만 클래스 멤버는 클래스와 동시에 로딩된다. ) (2) 인스턴스를 사용하지 않는다고 해서 반드시 클래스 메서드를 정의하는 것은 아니지만, 특별한 이유가 없는 한 그렇게 하는 것이 일반적이다. 2. 인스턴스 메서드 - 인스턴스 변수와 관련된 작업을 하며, 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드 이다. 3. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려해본다. - 그 이유는 메서드 호출 시간이 짧아지므로 성능이 향상된다. 4. 이름이 동일한 클래스 메서드와 인스턴스 메서드를 동시에 사용하면? ( 에러가 발생..
기본형 매개변수와 참조형 매개변수
·
자바/기본적인 개념
1. 기본형 매개변수 - 변수의 값만 읽기만 할 수 있다. 그 이유는 단순히 값만 전달 받기 때문이다. 2. 참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다. 그 이유는 저장되는 곳의 주소를 전달 받기 때문이다. 3. 배열을 이용한 참조형 매개변수 4. 참조형 반환타입 ( 인스턴스화를 하지 않아서 클래스 변수를 사용할 수 없다. ) ( 그래서 new를 해주는데 메소드를 통해서 받아보자. )
JVM의 메모리 구조
·
자바/기본적인 개념
# 응용 프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. 그 중 3가지 영역에 대해서 알아보자. 1. 메서드 영역 - 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스 파일을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. - 이 때, 그 클래스의 클래스 변수(CV)도 이 영역에 함께 생성된다. 2. Call Stack - 호출 스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. - 메서드가 호출되면 호출 스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역 변수(매개변수 포함)들과 연산의 중간결과 등을 ..
메서드
·
자바/기본적인 개념
1. 메서드의 호출 - 같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않고도 서로 호출이 가능하지만, static 메서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없다. ( 그 대신 static 메서드끼리는 호출이 가능하다. ) 2. return문 - 반환 타입이 void인 경우, 컴파일러가 마지막 부분에 "return ;"을 자동으로 넣어준다.
객체 배열
·
자바/기본적인 개념
# 객체 배열은 일반 배열과 같이 선언하는 것은 동일하다. 그러나 아주 중요한 차이점이 있다. 그것은 바로 선언한 후, 바로 객체가 생성되지 않는다는 점이다. 즉, 객체를 다루기 위한 참조 변수들이 만들어진 것일 뿐, 아직 객체가 저장되지 않았다. 그래서 무조건 배열을 만들었다고 객체가 저장된 것이 아니라는 점을 주의하자. 1. 객체 배열 선언 for문을 통해서 선언해보기. 2. 비객체지향적 코드 vs 객체지향적 코드 - 비객체지향적 코드는 보통 아래와 같은 코드들이다. - 객체지향적 코드는 아래와 같은 코드들이다.
가변 배열
·
자바/기본적인 개념
# 2차원 이상의 다차원 배열을 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고, 추후에 각기 다른 길이의 배열을 생성함으로써 고정된 형태가 아닌 유동적인 가변 배열을 구성할 수 있다. # 가변 배열 역시 중괄호를 이용해서 아래의 그림처럼 구현할 수 있다.
다차원 배열
·
자바/기본적인 개념
1. 2차원 배열의 초기화 2. 2차원 배열에서의 length? - 2차원 배열 변수가 참조하고 있는 곳이 행이기에, 행의 갯수가 나오게 된다. (ex: arr.length) - 열의 갯수는 해당 행의 길이를 가지고 쓰면 된다. (ex: arr[0].length) 3. 2차원 배열의 길이를 이용하여 초기화하는 방법 4. 2차원 배열들을 향상된 for문을 통해서 합계 구하기. 5. 예제(1) - 좌표에 X 표하기. import java.util.Scanner; public class Exercise001 { public static void main(String[] args) { final int SIZE = 10; int x = 0, y = 0; char[][] board = new char[SIZE][..
커맨드 라인을 통해 입력받기
·
자바/기본적인 개념
# Scanner 클래스의 nextLine()외에도 화면을 통해 사용자로부터 값을 입력받을 수 있는 간단한 방법이 있다. 바로 커맨드라인을 이용하는 방법인데, 프로그램을 실행할 때 클래스 이름 뒤에 공백 문자로 구분하여 여러 개의 문자열을 프로그램에 전달할 수 있다. # 사용 방법은 일단 java 파일의 경로를 알아야 한다. 예를 들어, 경로는 jdk.18\work\ch5 라고 해보자. 그러면 커멘드 라인을 켜서, 해당하는 폴더로 이동해보자. 그런 다음, "java [클래스 이름] [String[] args 입력 받는 곳]" 형식에 맞게 입력하면 된다. 만약 배열의 요소가 3개라고 한다면, "10 + 3" 식으로 args 변수에게 입력한다.
String 배열
·
자바/기본적인 개념
1. String 배열은 객체의 주소가 있는 참조형 배열이다? - String 배열은 아래의 그림처럼 저장이 됩니다. 그 이유는 String은 클래스이기 때문에, 객체로 인식하게 됩니다. (이처럼 기본형 배열이 아닌 참조형 배열이 됩니다.) 2. 예제(1) - 16진수에서 2진수로 변환해보기. 3. char 배열 vs String 클래스 - 자바에서는 문자열을 처리할 때, String 배열을 쓴다. 그 이유는 String 클래스가 char 배열에 여러 가지 기능을 추가 하여 확장한 것이기 때문이다. - c언어에서는 char 배열을 다룰지라도, 자바에서는 char 배열과 그에 관련된 기능들을 함께 묶어서 String 클래스를 정의한다. - 그러나 char 배열과 String 클래스의 한 가지 중요한 차이가..
배열
·
자바/기본적인 개념
1. 배열의 길이 - (배열 이름).length - 생성될 때 배열의 길이는 length라는 상수에 저장이 된다. 그래서 값은 변하지 않는다. 2. 배열 선언을 더욱 간단하게 정의하기. - int[] score = new int[]{1,2,3,4,5} - int[] score = {1,2,3,4,5}; 3. 배열 요소들을 더욱 간단하게 출력하기. - Arrays.toString() 함수를 이용한다. - 사용방법은 배열 이름을 함수 () 안에 넣어준다. 4. 배열 이름을 출력해보면? - 일반적으로 배열의 주소가 나올 것인데, "타입@주소"의 형식으로 나오게 될 것이다. - 예를 들면 int 배열이 있다고 한다면, "I@16진수주소"의 형식으로 나온다. 5. Char 배열을 간단하게 출력해보기. - 굳이 A..
반복문
·
자바/기본적인 개념
1. 초기화와 증감식 - 조건식을 제외하고 초기화와 증감식은 둘 이상의 식을 쓸 수 있다. 2. 빈 문장 - for 문에는 세 가지 요소를 생략하고 빈칸을 만들어 낼 수 있다. - 이때, '참'으로 간주되어 무한 반복문이 되어버린다 3. 향상된 for 문 - JDK 1.5부터 배열과 컬렉션에 저장된 요소에 접근할 때 기존보다 편리한 방법으로 처리할 수 있도록 for문에 새로운 문법을 추가하였다. 4. 이름 붙은 반복문 - break 문을 사용하여 반복문을 나가지만, 중첩된 반복문이라면 break 문 하나로 나가기 힘들 것이다. - 그래서 등장한 것이 반복문 앞에 이름 붙이는 문법이다. - 사용 방법은 for 또는 while 앞에 이름을 붙여주고 : 로 구분한다. 5. 예제(1) - for 문 앞 세미클론..
Math.random
·
자바/기본적인 개념
Math 클래스의 메소드 random은 난수(임의의 수)를 얻기 위해서 사용되어진다. 이 메소드는 0.0과 1.0 사이의 범위에 속하는 하나의 double 값을 반환한다. (*0.0은 포함하고, 1.0은 포함되지 않는다.) 만약 1~3 사이의 값을 얻고 싶다면, 아래처럼 코드를 짜면 될 것이다.
Switch
·
자바/기본적인 개념
1. 제약 조건 - switch 문의 제약 조건은 항상 정수이거나 문자 또는 문자열이여야 한다. - 또한 case문 또한 조건식과 항상 똑같은 타입이여야 된다. 2. 문법 - case 문을 여러 개 붙여서 쓰고 싶다면, "case 4: case 5: " 식으로 사용한다. 3. if vs switch - 성능 속도 부분에서 switch를 써야하지만, 만약 복잡한 조건식이 나온다면, 가독성 부분에서도 고민해보아야 한다. 4. 예시 - 만약 0~100점의 성적 점수가 있는데, 90~100까지 A, 80~89까지 B라고 하고 case문으로 받아주는 것보다 if를 쓰는 것이 간결하다. 그러나 성능을 생각한다면 case문이 나을 수 있다. Q) 그렇다면 어떻게 하는 것이 case문을 더 간결하게 사용할 수 있을까?..
쉬프트 연산자
·
자바/기본적인 개념
1. 양수 - 2진수의 자리를 원하는 만큼 옮기고 빈 자리를 0으로 채운다. 2. 음수 - 2진수의 자리를 원하는 만큼 옮기고 빈 자리를 1로 채운다. - 예제(1) 8>>2 (10진수인 8의 2진수를 오른쪽으로 2자리 이동시킨다.) (x > n은 x/2^n의 결과와 같다.) 3. 쉬프트 연산자가 쓰이는 이유 - 위 예제(1)에서 말한 연산 규칙은 가독성을 떨어뜨린다. 그러나 실행속도는 곱셈과 나눗셈보다 더 빠르게 될 것이다. - 그러므로 상황마다 필요한 곳에 잘 활용해야 한다.
등가 비교 연산
·
자바/기본적인 개념
- 예제(1): 실수형 비교 ( 10.0 == 10.0f는 true가 되고 0.1 == 0.1f false가 되는 것일까? ) ( 그 이유는 0.1은 double로 인식하기 때문이다. ) (왜냐하면 실수형은 근사값이 저장되기 때문에 오차가 발생하게 된다.) ( 단, 정수형 부분은 근사값이 저장되지 않으므로, 오차가 발생하지 않는다. ) - 예제(2): 문자형 비교 ( a 변수와 "abc" 비교는 true이지만, b와 "abc" 비교는 false이다. ) ( 그 이유는 b와 "abc"는 서로 다른 객체이기 때문이다. ) ( 그렇다면 true 되도록 할려면 어떻게 해야 할까? ) -> equals()를 사용한다. - 예제(3): 하나의 문자를 입력을 받는데 스트링으로 받아서 하나의 char로 가져오기.
산술 연산자(2)
·
자바/기본적인 개념
- 예제(1) (이 예제를 보면, 당연히 제대로 된 값이 나와야 된다.) (그러나 마이너스 값이 나오게 되었다. 그러한 이유는 int * int = int가 나오기 때문이다.) (즉, int는 2x10^9까지만 저장이 되지만, 위의 결과 값은 오버플로우가 되어버린다.) (그래서 우리는 a나 b 앞에 L이나 (long)을 명시적으로 적어줘야 한다.) - 예제(2) (이 예제는 연산 순서에 의미가 있다.) (즉, 먼저 연산하는 곱하기 또는 나누기에 따라 int 범위에 넘어가는지 안 넘어가는지 체크를 해야한다.) - 예제(3) (이 예제에서는 char도 연산을 수행할 때, 정수형 값이 나오게 된다.) (대신 b-a를 통해 char를 얻을려면 형변환을 명시적으로 해주어야 한다.) (또한 아래의 예제(4)의 변수..
산술 연산자(1)
·
자바/기본적인 개념
1. 사칙 연산자 - 예제(1) (2.5(float)에서 int 타입으로 변환할 때, 반올림하지 않는 것에 유의하자.) - 예제(2) (오류가 나는 이유는 byte + byte = int + int = int 이기 때문에, 값의 범위를 넘었기 때문이다.) (그래서 a+b를 (byte)(a+b)로 고쳐줘야 된다.) (그러면 결과는 40이 나오게 된다.) - 예제(3) (c의 값이 44가 나오는 이유는 큰 타입에서 작은 타입으로 이동하게 되면 오차가 생긴다는 것을 기억할 것이다.) (해설하자면 위의 그림처럼 int 값에서 32비트 만큼 300의 자리가 나오게 될 것인데, byte로 고치면 8비트 밖에 없기 때문에 int의 32비트에서 맨 뒤 8비트를 두고 자른다. 그러면 값은 44가 나오게 된다.) (위의 ..
연산자의 우선순위와 결합 규칙
·
자바/기본적인 개념
대부분 잘 알지만, 헷갈리는 부분을 정리해보았다. 1. AND 그리고 OR 연산 순위 - AND 즉, '&' 또는 '&&'가 '||'보다 연산 순위가 높다. 2. 시프트 연산자 - 만약 "x
자동 형변환
·
자바/기본적인 개념
자동 형변환이란, 컴파일러가 자동적으로 형변환을 해주는 것이다. - 자동 형변환 예제(1) (이 예제에서만 봐도 차이를 알 수 있다.) (f는 자동적으로 컴파일러가 (float)를 넣어주지만, f1은 리터럴 값이 기본 double로 되기 때문에 자동 형변환이 어렵다.) - 자동 형변환 예제(2) (큰 타입(int)에서 작은 타입(char)로 가면, c 변수처럼 명시적으로 프로그래머가 적어야 한다.) ※ char과 short의 경우 byte의 크기는 같지만 값의 범위가 다르므로, 반드시 형변환을 명시적으로 해주어야 한다.) - 자동 형변환 예제(3) byte + short -> int + int -> int char + short -> int + int -> int
형변환
·
자바/기본적인 개념
1. 실수 float와 double - 위의 예제에서 보면 다 똑같이 답이 나와야 될 것 같지만, 사실 1번과 3번만 같고 2번만 다르다. 이것이 다른 이유는 float와 double의 정밀도 차이에 있다. - 즉, float는 7자리까지, double은 15자리까지 차지할 수 있기 때문에, 그 이상의 자리는 오차가 발생할 수 있다. - 그런데 "2번과 3번은 같아야 되는거 아닌가?" 라고 생각할 수 있다. 하지만 같지 않은 이유는 이미 f 변수는 float 형식으로 저장되어 있기 때문에 double로 형변환하여도 이미 결과가 float로 나온다. - float 예제 (위에서 말했듯이 float는 7자리까지만 정밀도가 가능하기에 7을 반올림 하여 6의 자리에 7이 된다.) - 변환 예제(1) (여기서는 ..
실수형의 저장 형식과 부동 소수점의 오차
·
자바/기본적인 개념
1. 실수형의 저장 형식 - S는 부호 비트이며, 0이면 양수 1이면 음수를 나타낸다. 또한 양의 실수에서 음의 실수로 변환할 때, 정수형과 달리 '2의 보수법'을 사용하지 않고 그저 부호비트만 바꿔주면 된다. - E는 지수이며, float는 -127 ~ 128, double은 -1023 ~ 1024의 범위를 가진다. (그러나, 실제로는 숫자 아님(NAN)과 양의 무한대와 음의 무한대를 표현하기 위해 예약되어 있으므로 float는 -126 ~ 127까지의 값을 표현할 수 있다.) - M은 가수이며, 실제 값을 저장하는 부분이다. 또한 float와 double은 각각 정밀도가 다르므로 유의한다. * S와 E, M을 합쳐서 부동소수점의 형태로 저장한다. 그러므로, 값의 범위는 (+-)Mx2^E로 저장이 된다..
비트(bit)와 바이트(byte) 그리고 워드(word)
·
자바/기본적인 개념
1. 비트 - 한 자리의 2진수를 비트라고 하며, 1 비트는 컴퓨터가 값을 저장할 수 있는 최소 단위이다. - N 비트로 표현할 수 있는 10진수 (값의 개수: 2^N) (값의 범위: 0~(2^N)-1) 2. 바이트 - 비트는 작은 단위이게에 1비트를 8개씩 묶어서 바이트라 단위로 정의해서 데이터의 기본 단위로 사용한다. 3. 워드 - CPU가 한 번에 처리할 수 있는 데이터의 크기를 의미한다. - CPU의 성능에 따라 워드의 크기가 달라진다. (32비트 -> 1워드 = 4바이트) (64비트 -> 1워드 = 8바이트)
형식화된 출력 - prinf()
·
자바/기본적인 개념
원래는 println을 써 왔다. 그러나 만약 소수점 둘째짜리까지만 출력하거나, 16진수 또는 8진수를 출력할 때는 printf를 사용한다. 방식은 c언어와 비슷하며, \n이 %n만 다르다. ※ 참고 - %b: boolean - %o: 8진수 - %x 또는 %X: 16진수 - %e 또는 %E: 지수 표현식 - %g: 값을 간략하게 표현할 때 사용 - %f: 기본적으로 소수점 6자리까지만 출력 (소수점 7자리에서 반올림) (+ 만약 자신이 원하는 자릿수까지 나타내고 싶다면, f 앞에 숫자를 붙인다.) (+ 예를 들어, %14.10f는 총 14자리에 소수점은 10자리로 하겠다는 의미이다.) (+ 이때, 소수점 위에 있는 숫자는 3자리를 차지하게 되는데, 만약 2자리라면, 공백을 채운다.) (+ 만약 공백 말..
타입의 불일치와 문자와 문자열의 리터럴
·
자바/기본적인 개념
1. 타입의 불일치 - 만약 저장하는 값이 타입과 달라도 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용한다. - ex-1) int i = 'A' (A가 유니코드 65이므로 65가 저장된다.) - ex-2) long l = 123 - ex-3) double d= 3.14f 2. 문자 리터럴 - 문자열은 내용이 없는 빈 것이 되지만, 문자는 공백이 안 된다. 즉, 문자 타입의 변수에는 하나의 값이 들어가야 한다. - ex-1) String a = ""; // 가능 - ex-2) Char a = '' // 불가능 - ex-3) Char a = ' ' // 가능 ※ 이때, String은 클래스이다. 즉, 클래스의 객체 생성이 가능하다는 뜻이다. 3. 문자열 리터럴 규칙 - 문자열 + any typ..
리터럴의 타입과 접미사
·
자바/기본적인 개념
1. 만약 정수형의 경우, long 타입의 리터럴에 접미사 'l' 또는 'L'을 붙이고, 접미사가 없으면 int 타입의 리터럴이다. - 이때, byte나 short 타입의 리터럴은 별도로 존재하지 않으며, 변수에 값을 저장할 때는 int 타입의 리터럴을 사용한다. - 또한 16진수는 리터럴 앞에 '0X' 또는 '0x'을 붙이고 8진수의 경우에는 '0'만 붙인다. 2. 만약 실수형의 경우, float 타입은 'f' 또는 'F'를, double 타입에는 'd' 또는 'D'를 붙인다. - 만약 실수 값이 변수에 저장할 때 아무런 접미사가 없으면, 그것은 기본 타입인 double이므로 'd' 또는 'D'를 생략할 수 있다. - 그래서 만약 float 타입 변수에 접미사 'f' 또는 'F'가 없으면, double..