▼ 부스트 코스의 [쉽게 배우는 자바1], [JAVA의 정석], 국비지원과정을 들은 후 정리한 내용입니다.
------------------------------------------------------------------------------------------------------------
1. 프로그램 실행구조
2. 변수(Variable)
(1) 변수란?
: 변수란, 단 하나의 값을 저장할 수 있는 메모리 공간을 의미한다.
: 변수는 상수(constant)와 다르게 변화할 수 있는 수이다.
[※ 참조하기 : 메모리의 논리적 구조, 정수형과 실수형 데이터] |
(2) 변수의 선언과 초기화
가. 변수를 선언 : int(변수타입)에 age(변수이름)을 적고 ;로 마침표를 찍는다.
나. 변수의 초기화 : 변수 선언 후 처음으로 값을 넣어주는 것
- 변수를 선언한 이후에 변수 안에 값을 넣어주어야 한다. 그렇지 않을 경우, 다른 프로그램에서 작성한 '알 수 없는 값(쓰레기 값)'과 충돌할 수 있다.
> int age = 25;
다. 서로 다른 두 변수의 값을 교환하는 방법 :
public class Variable
{
public static void main(String [] args)
{ int x = 25;
int y = 30;
int tmp; tmp = x;
x = y;
y = tmp;
}
}
라. 변수의 명명규칙
- 변수를 포함하여 프로그램에 사용하는 모든 이름은, '식별자(identifier)'라고 한다.
- 프로그램을 작성할 때는 항상 식별자 명명 규칙을 따라야 한다.
▶ 식별자(사용자 정의 명칭) 명명 규칙
1. 대소문자가 구분되며 길이에 제한이 없다. - true와 True는 서로 다름 2. 예약어를 사용해서는 안된다. - true는 예약어, True는 예약어가 아님 3. 숫자로 시작해서는 안된다. - name1은 가능함, 1name은 불가능 4. 특수문자는 '_'와 '$'만 허용한다. |
* 예약어란? 키워드 또는 리저브드 워드라고 함. 프로그래밍언어의 구문에 사용되는 단어를 의미
* 사용자 정의 명칭이란? 클래스명/메소드명/변수명/상수명 등...
* 추가적으로, 변수명 중간에 공백을 띄우면 안 됨.. (ex. myName (o), my Name(x))
▶ (선택사항) 그 외 자바 프로그램어들에게 권장되는 규칙
1. 클래스의 첫 글자는 항상 대문자로 한다. - 반면, 변수와 메서드 이름의 첫글자는 항상 소문자로 한다. 2. 여러 단어로 이루어진 이름은 결합되는 단어의 첫 글자를 대문자로 한다. - 클래스명 : 1) Pascal 표기법 : ex. StringBuffer 2) Pascal+snake 표기법 : ex. String_Buffer - 메소드명/변수명 : 1) Camel 표기법 : ex. myMoney 2) Snake 표기법 : ex. my_money 3. 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '-'를 사용 ex. PI.MAX_NUMBER //snake표기법 |
* 자바에서는 모든 이름에 유니코드에 포함된 문자를 사용할 수 있으나, 가능한 클래스이름은 영문자로 하는 것이 좋다.
* 패키지명은 대체로 소문자로 작성한다.
[※ 참고 : 기타 변수 표기법] - 헝가리언 표기법 : 변수 앞에 접두어를 붙여 변수 성격을 표현 boolean bOk = "파리"=="새"; int nMoney = 100; char *pName = "홍길동"; //c언어 |
(3) 변수 타입
※ 참조 : https://forsee.tistory.com/1
가. 데이터 타입
- 데이터 타입 :
값(data) | 문자 | 'A', "ABC" | |
숫자 | 정수 | -1, -2, 0, 1, 2 | |
실수 | 1.23456, 5 X 10^2 |
- 변수를 선언할 때는, 저장하려는 값의 데이터 타입에 따라 변수 타입을 지정한다.
1) 기본형 변수(primitive type)
- 실제 값을 저장하며 연산이 가능하다.
크기 | 종류 | 자료형 | Wrapper | byte | 표현 범위 | 연산/변환 | 출력서식 | 초기값 |
작다 ↓ 크다 |
논리형 | boolean | Boolean | 1 | false, true | X | %b or %B | flase |
문자형 | char | Charater | 2 | 0~65535 | O | %c | '\u0000' | |
정수형 | byte | Byte | 1 | -128 ~ 127 | O | %d (Decimal) %o (Octal) %x (Hexa) |
0 | |
short | Short | 2 | -32768 ~ 32767 | O | ||||
int | Integar | 4 | 약 -21억 ~ 21억 | O | ||||
long | Long | 8 | 20자리 | O | 0L | |||
실수형 | float | Float | 4 | 10^-38~10^38 *정밀도 6-7 | O | %f | 0.0f | |
double | Double | 8 | 10^-308~10^308 *정밀도 9 | O | 0.0d 또는 0.0 |
* 문자는 ascii코드에 따르면 1byte나, 자바는 유니코드를 따르므로 위에서 UTF-16 유니코드 기준 2byte로 쓰인 것
* JDK가 UTF-16에 따라 문자 인코딩(문자ㅡ숫자임, 0과 1로 인코딩) , 이것을 각 운영체제에 따라 화면에 디코딩할 때는 JVM이 동작하는 시스템에 따름.
* char은, 유니코드에 의해 정수형으로 컴퓨터에 저장되기 때문에 연산/변환 가능하나, string은 배열이기에 불가
* 정밀도가 높을 수록 오차범위가 낮음. 정밀도 = 7은, 10진수로 7자리 수를 오차 범위 없이 저장할 수 있다는 뜻
[※ 참고 : Scanner의 입력메서드 - next(), nextInt(), nextDouble(), nextBoolean(), nextLine() - java.util.Scanner : java > util > Scanner클래스 - Scanner의 next()와 nextLine()의 차이 : https://why-dev.tistory.com/21 [※ 참고 : System.out의 출력메서드 - print(), println(), printf() 설명] - link : https://www.geeksforgeeks.org/difference-between-print-and-println-in-java/ - print(), println(), printf()로 콘솔창에서 받은 텍스트를 출력 가능 - 3가지 모두 여러 자료형(char,char[],boolean,int,double...)을 받을 수 있도록 오버로딩되어 있음 1. print()와 println()의 차이 1) print(); : 텍스트 출력 후 콘솔창 끝에 커서가 남음(줄바꿈x) //다음 printinf은 여기서 시작 2) println(); : 텍스트 출력 후 다음줄로 이동 2. printf()의 출력서식 1) 정수형 %d : decimal, 10진수로 출력. %20d : 전체자릿수 20개 중에서 우측정렬로 10진수 출력 %020d : 전체자릿수 20개 중에서 우측정렬로 10진수 출력하되, 공백은 0으로 채우기 %-20d : 전체자릿수 20개 중에서 좌측정렬로 10진수 출력 2) 실수형 %f : 실수형으로 출력. %n.f : 전체자릿수 n만큼 출력, 우측정렬 %n.mf : 전체 자릿수 n중에서 소수점은 m만큼 출력, 우측정렬 //n보다 m이 크면 n 무시 3) 문자열 %20.5s : 전체 20개의 문자 중에 5개만 출력 |
package mymain;
import java.util.Scanner;
public class PrintTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String input = scan.nextLine();
// int num = Integer.parseInt(input);
double num = Double.parseDouble(input);
scan.close(); //이걸 안하면, resource leak : scan is never closed 나타남
// System.out.printf("[%d]\n",num);
// System.out.printf("[%20d]\n",num);
// System.out.printf("[%020d]\n",num);
// System.out.printf("[%-20d]\n",num);
System.out.printf("[%-10.3f]\n",num);
System.out.printf("[%-3.4f]",num); //전체자릿수 무시
}
}
>> 결과
3.56549884846546564
[3.565 ][3.5655]
>> 위에서 //부분을 활성화하고 아래는 주석처리하면 결과는
[20]
[ 20]
[00000000000000000020]
[20 ]
package mymain;
import java.util.Scanner;
public class PrintTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String input = scan.nextLine();
scan.close();
System.out.printf("[%20.3s]\n",input);
}
}
>> 결과
// 입력 : 가나다라마바사아자차카타파하
[ 가나다]
2) 참조형 변수(reference type)
- 변수의 타입으로 클래스를 가지며, NULL을 포함한 객체의 주소(4byte, 0x0~0xffffffff)를 가짐
*단, JVM이 32bit가 아니라, 64bit일 경우, 객체의 주소 곧, 참조형 변수의 크기는 8byte임
- 참조형 변수는 컴퓨터공학에서 보았던 포인터 같다. 자바에서는 이 포인터가 (일종의 설계도인) 클래스의 객체들이 있는 주소를 담는다(=가리킨다)는 점에서 약간의 차이가 있어 보인다.
- 예시
Date today = new Date();
- 컴퓨터 공학에서 C언어를 통해 포인터로 메모리를 할당했던 것과 비교
//기본형 변수 : 변수는 기본형 값을 갖음
int number = 2;
int p = &number; //p는 number의 주소를 담고 있음.
//참조형 변수 : 변수는 할당받은 공간을 가리키는 주소값을 갖음
int *p = malloc(sizeof(int));
//주소는 운영체제의 크기에 따라서 32bit, 64bit가 될 수 있음
3) 오버 플로우
- 데이터 타입에 따라 변수가 가질 수 있는 저장공간이 지정되는데, 그 이상으로 값을 넣는 경우 오버플로우 발생
나. 상수와 리터럴(Constant & Literal)
(1) 상수 : 값을 한 번 저장하면 변경할 수 없는 저장 공간
- 변수 타입 앞에 final를 붙여 선언
- 상수는 모두 대문자로 작성하는 것이 관례이며, 길어질 경우 _로 구분
final int MAX_SPEED = 200;
(2) 리터럴 : 실질적인 값
- 수학에서 말하는 상수
- 위 박스 안의 200도 리터럴이고, 변수 안에 넣는 숫자도 리터럴
- final int FIRST_NAME = 'c'; 이면, 여기서의 'c'도 리터럴
▶ 리터럴의 타입과 접미사
종류 | 리터럴 | 접미사 |
논리형 | false, true | 없음 |
정수형 | 123, 0b0100, 077, 0xFF, 100L | L |
실수형 | 3.14, 3.0e8, 1.4f, 0x1.0p-1 | f(float), d(생략가능) |
문자형 | 'A', '1', '\n' | 없음 |
문자열 | "ABC", "1234", "A" | 없음 |
* 실수형의 경우, 소수점만 적어도 되며, e를 통해서 10의 제곱을 표현할 수 있다.
int small = 12345;
long big = 85_000_000_000L;
float less = 0.345f;
double more = 0.3456788999;
more = 34.56788999e-2;
▶ 타입이 불일치 해도 사용이 가능한 경우 : 타입이 달라도 저장범위가 넓은 타입에 좁은 타입을 저장하는 경우
int firstIndex = 'A'; //A는 유니코드로 65를 의미함
double Serial = 23456; //float을 double에 넣는 경우
[※ 참고하기 : ASCII코드] ASCII코드(통신문자코드) : 0~126 0~31 : 통신 및 제어문자 '\r' : carriage return(Home) = '\r\n' : 맨 앞으로 가라, 그리고 엔터해라 '\n' : new line(Enter) '\t' : tab key '\b' : caret(커서)의 위치를 이전으로 이동 '\a' : alert경고음 '\f' : 다음장으로 이동해라. 32~126 : 키보드상 문자코드 ' ' : 32 'A' : 65 'a' : 97 //소->대문자 간격 : 32 '0' : 48 '1' : 49 문자 출력시에 System.out.printf("%c\n",65); 가능하지만, System.out.printf("%d\n",'한'); 은 불가능. |
다. 문자 리터럴과 문자열 리터럴
(1) JAVA언어에서 String은 클래스를 의미한다.
- 컴퓨터 공학에서 string은 사실상 배열이었다. 그리고 string을 C언어로 표현하기 위해서는 char *name = " "; 처럼 표현을 했다. 만약 string을 쓰고 싶다면 #include 를 통해 string을 선언한 라이브러리를 가져와야 했다.
- 마찬가지로 JAVA언어에서도 string은 문자데이터들이 모인 공간, 곧 배열을 의미한다.
- 따라서 원칙적으로 String은 아래처럼 표현해야 하는 것이 맞다.
- 다만 java에서는 기본적으로 내장되어 있는 클래스가 있어서, String name = " "; 도 허용한다.
String name = new String("JAVA");
(2) 문자열의 결합
- + 연산자는 왼쪽에서부터 오른쪽으로 연산을 수행한다.
- JAVA에서는 +연산자를 활용해 [문자열 + 문자열]을 할 수 있으며, 문자열이 아닌 다른 타입과 결합할 경우 순차적인 연산을 이어가며 최종적으로는 문자열로 변환한다.
public class Variable
{
public static void main(String[] args)
{
String name = "홍길동";
System.out.println(1+name);
System.out.println(name+1);
System.out.println(1+1+name);
System.out.println(name+1+1);
}
}
>> 결과
1홍길동
홍길동1
2홍길동
홍길동11
(3) 특수문자를 표현하는 방법
특수문자 | 문자 리터럴 |
줄바꿈 | \n |
역슬래쉬(\) | \\ |
작은따움표 | \" |
큰따움표 | \' |
라. 형변환(Casting) : 변수 또는 상수의 타입을 다른 타입으로 변환시키는 것
- 형변환 규칙
1. boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다. 2. 기본형과 참조형은 서로 형변환할 수 없다. 3. 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다. |
- 아래와 같이 x의 값을 가져다가 y로 형변환을 해서 가져갈 경우, x값은 그대로 남고 y에 값을 복사해서 준다.
public class Variable
{
public static void main(String[] args)
{
double x = 2.23356;
int y = (int)x;
System.out.println(x);
System.out.println(y);
}
}
>> 결과
2.23356
2
**정수형 int를 실수형으로 바꿀 때, float으로 바꿀 경우, int는 정밀도가 10인데 float은 8이라 오차가 발생할 수 있다. 따라서, int를 실수로 바꿀 때는 double을 쓰는 것이 좋다.
3. 연산자(Operator)
(1) 연산자의 종류
- 연산자 : 연산을 수행하는 기호
- 피연산자 : 연산자의 작업 대상(변수, 상수, 리터럴, 수식)
종류 | 연산자 | 설명 |
산술 연산자 | +, -, *, /, %, <<, >> | 사칙연산 및 나머지(%) |
비교 연산자 | >, <, >=, <=, ==, != | 크기 |
논리 연산자 | &&, \\, !, &, \, ^, ~ | AND, OR |
대입 연산자 | = | 우변의 값을 좌변에 저장 |
(2) 연산자의 결합 규칙(우선순위)
1. 산술 > 비교 > 논리 > 대입 순의 연산 우선순위 2. 단항 > 이항 > 삼항. **단항은 -3과 같이 피연산자가 하나인 것 3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽 *단항과 대입은 반대 |
(3) 산술 변환
- 두 피연산자의 타입이 같아야 산술 연산이 가능함 (형변환 연산자로 타입 일치 필요)
- 단, 작은 타입에서 큰 타입으로 형변환을 할 경우, 자동적으로 형변환이 이루어지므로 형변환 연산자 생략 가능
▶ 자동 산출 변환 규칙
1. 두 피연산자의 타입이 다를 경우, 보다 큰 타입으로 일치시킨다. 2. 피연사자의 타입이 int보다 작은 타입이면 int로 변환된다. ex. short + byte = int + int = int char + byte = int + int = int |
- (주의) 연산결과의 타입이 피연산자와 다른 경우를 유의해야 한다.
ex. (int) 5 / (int) 2 = 2.5 의 경우, 둘 중에 하나를 (float)으로 형변환하여야만 함
>>산술 변환 외에 비교/논리/대입은 차후에 다시...
(4) 메서드를 사용한 연산 :
- Math.를 사용하여 사칙연산 외에 계산이 가능하다. (반올림이나 단순 비교 등)
public class Datatype
{
public static void main(String[] args)
{ //둘 중에 큰 수 출력
System.out.println(Math.max(9, 5));
//올림
System.out.println(Math.floor(2.85786));
//앞 수를 뒤 수로 나눈 값의 반올림
System.out.println(Math.floorDiv(18, 7));
}
}
'Language > Java' 카테고리의 다른 글
[자바의 정석_복습] 객체지향 프로그래밍1 - 클래스(변수,메서드) (0) | 2022.02.24 |
---|---|
[자바의 정석_복습] Chapter5. 배열 -- String 문자열을 모스부호로 바꾸기 (0) | 2022.02.17 |
[쉽게 배우는 자바1_복습] 명령프롬프트에서 자바 실행하기 (0) | 2022.02.09 |
[자바_복습] 명령프롬프트에서 자바 실행하기, 이클립스 실행하기 (0) | 2022.02.02 |
[자바_복습] 자바 프로그램 설치 (0) | 2022.02.01 |