[ CH02. 변수, 연산자, 조건문 ]
1. 자바 프로그램의 기본 구조
- 클래스
- class 키워드로 클래스 선언- 클래스 코드는 {} 내에 모두 작성 - 주석문
- // 한 라인 주석
- /* 여러 행 주석 */ - main() 메서드
- main()에서 실행 시작
- public static void로 선언
- String[] args로 실행 인자를 전달 받음 - 변수 선언
- 변수 타입과 변수 이름 선언
- 메서드 내에서 선언된 변수는 지역 변수 -> 메소드 실행 끝나면 자동 소멸 - 문장
- ;로 한 문장의 끝을 인식 - 화면 출력
- 표준 출력 스트림 System.out의 println() 메소드 호출
- println()
- 여러 타입의 데이터 출력
- 출력 후 다음 행으로 커서 이동
2. 식별자(identifier)
- 정의
- 클래스, 변수, 상수, 메소드 등에 붙이는 이름 - 원칙
- 사용 가능 O
- '_', '$'
- 유니코드 문자, 한글
- 숫자
- 사용 불가능 X
- 특수문자, 공백, 탭
- 자바 언어 키워드(예약어)
- 식별자의 첫 번째 문자에 숫자
- 불린 리터럴(true, false)
- 널 리터럴(null)
- 길이 제한 없음
- 대소문자 구별 - 언어 관습
- 가독성 높은 이름(목적의 분명성)
- 클래스 이름
- 첫 번째 문자는 대문자로 시작
- 각 단어의 첫 번째 문자만 대문자
- 변수, 메서드 이름
- 첫 단어 이후 각 단어의 첫 번째 문자는 대문자로 시작
- 상수 이름
- 모든 문자를 대문자로 표시
- 여러 단어로 이루어진 경우 => '_'로 구분
// 클래스 이름
public class HelloWorld{}
class AutoVendingMachine{}
// 변수, 메소드 이름
int myAge;
boolean IsSingle;
public int getAge() {}
// 상수 이름
final static double PI = 3.141592;
3. 데이터 타입
3.1 기본형(Primitive type)
- boolean, char, byte, short, int, long, float, double (8개)
- 실제 값을 저장
- 타입의 크기가 정해져 있음
- cpu나 운영체제에 따라 변하지 않음
3.2 레퍼런스 타입(Reference type)
- 기본형을 제외한 나머지 (ex. String, System 등)
- 배열(array)에 대한 레퍼런스
- 클래스(class)에 대한 레퍼런스
- 인터페이스(interface)에 대한 레퍼런스 - 객체의 주소를 저장(4 byte)
4. 변수
- 정의
- 프로그램 실행 중에 값을 임시 저장하기 위한 공간
- 프로그램 수행 중 변경 가능
- 데이터 타입에서 정한 크기의 메모리 할당 - 변수 선언
- 변수의 타입 옆에 변수 이름을 적어 변수 선언
// 변수 선언
int radius;
char c1, c2, c3; // 3 개의 변수를 한 번에 선언한다.
- 변수 초기화
- 변수에 처음으로 값 저장
- 지역변수는 사용되기 전에 반드시 초기화해야 함
- 지역변수가 아닌 변수는 보통 각 타입의 기본값으로 자동 초기화됨
// 변수 초기화
int radius = 10;
char c1 = 'a', c2 = 'b', c3 = 'c';
double weight = 75.56;
- 변수 읽기와 저장
- 대입 연산자 = 다음에 식
radius = 10 * 5;
c1 = 'r';
weight = weight + 5.0;
5. 리터럴
- 정의
- 프로그램에서 직접 표현한 값
- 정수, 실수, 문자, 논리, 문자열 리터럴
5.1 기본형의 리터럴
- 정수 리터럴
- 10진수, 8진수, 16진수, 2진수 리터럴
- int형으로 컴파일
- long 타입 리터럴은 숫자 뒤에 L 또는 l을 붙여 표시
ex) long g = 24L;
- 실수 리터럴
- 소수점 형태나 지수 형태로 표현한 실수
ex) 12. 12.0 .1234 0.1234 1234E-4
- 실수 타입 리터럴은 double 타입으로 컴파일
- 숫자 뒤에 f(float)나 d(double)을 명시적으로 붙이기도 함
// 실수 타입 리터럴 -> double 타입으로 컴파일
double d = 0.1234;
double e = 1234E-4; // 1234E-4 = 1234x10-4이므로 0.1234와 동일
// 숫자 뒤 f, d
float f = 0.1234f;
double w = .1234D; // .1234D와 .1234는 동일
- 문자 리터럴
- 단 하나의 문자
- 단일 인용부호('')로 문자 표현
- 반드시 하나의 문자가 있어야 함
- \u다음 4자리 15진수(2바이트의 유니코드)로 표현
- 특수문자 리터럴은 백 슬래시(\)를 이용해 표현
char a = 'A';
char b = '글';
char c = ''; // ERROR: 빈 문자 X
char d = ' '; // OK: 공백문자로 변수 초기화 가능
char e = \u0041; // 문자 'A'의 유니코드 값(0041) 사용
char f = \uae00; // 문자 '글'의 유니코드 값(ae00) 사용
- 논리 리터럴
- true, false
boolean a = true;
boolean b = 10 > 0; // 10>0가 참이므로 b 값은 true
boolean c = 1; // 타입 불일치 오류. C/C++와 달리 자바에서 1,0을 참, 거짓으로 사용 불가
while(true) { // 무한 루프. while(1)로 사용하면 안 됨
...
}
5.2 기본형 이외의 리터럴
- null 리터럴
- 레퍼런스에 대입 사용
int n = null; // ERROR: 기본 타입에 사용 불가
String str = null; // OK
- 문자열 리터럴(스트링 리터럴)
- 이중 인용부호("")로 묶어 표현
ex) "good", "3.19", "a"
- String 객체로 자동 처리
- new를 사용하여 String 객체를 직접 생성해도 됨
- 빈 문자열 저장 가능
- 피연산자 중 어느 한쪽이 문자열 -> 나머지 한쪽도 문자열로 변환한 다음 두 문자열 결합
- 문자열이 섞인 + 연산 => 문자열 연결
String name = new String("Java") // new 연산자를 이용한 String 객체 생성
String toolName = "JDK"; // 문자열 리터럴
// 문자열이 섞인 + 연산
toolName + 1.8 // "JDK1.8"
"(" + 3 + "," + 5 + ")" // "(3,5)"
true + "" // "true"
String str2 = ""; // 빈 문자열 가능
더보기
※ '_' 허용
- 가독성을 위해 사용
- 숫자 리털럴의 아무 위치에나 언더스코어('_') 허용
- 컴파일러는 리터럴에서 '_'를 빼고 처리
- 가독성을 위해 사용
- 숫자 리털럴의 아무 위치에나 언더스코어('_') 허용
- 컴파일러는 리터럴에서 '_'를 빼고 처리
// 허용O
int price = 20_100; // 20100과 동일
long cardNumber = 1234_5678_1357_9998L; // 1234567813579998L와 같음
long controlBits = 0b10110100_01011011_10110011_111110000;
long maxLong = 0x7fff_ffff_ffff_ffffL;
int age = 2______5; // 25와 동일
// 허용X
int x = 15_; // 오류. 리터럴 끝에 사용할 수 없다.
double pi = 3_.14; // 오류. 소수점(.) 앞뒤에 사용할 수 없다.
long idNum = 981231_1234567_L; // 오류. _L(_F) 앞에 사용할 수 없다.
int y = 0_x15; // 오류. 0x 중간이나 끝에 사용할 수 없다. 0x_15(오류)
더보기
※ var
- Java 10 부터 도입
- 지역 변수의 선언에서만 사용 가능
- 변수 타입 선언 생략(컴파일러가 변수 타입 추론)
- 변수 선언문에 반드시 초깃값 지정해야 함
- Java 10 부터 도입
- 지역 변수의 선언에서만 사용 가능
- 변수 타입 선언 생략(컴파일러가 변수 타입 추론)
- 변수 선언문에 반드시 초깃값 지정해야 함
var price = 200; // price는 int 타입으로 결정
var name = "kitae"; // name은 String 타입으로 결정
var pi = 3.14; // pi는 double 타입으로 결정
var point = new Point(); // point는 Point 타입으로 결정(4장 참조)
var v = new Vector<Integer>(); // v는 Vector<integer> 타입으로 결정(7장 참조)
6. 상수
- final 키워드 사용
- 한 번만 값을 저장할 수 있는 공간
- 선언 시 초기값 지정
- 실행 중 변경 불가
7. 타입 변환
- boolean을 제외한 나머지 7개의 기본형은 서로 형 변환 가능
- 기본형과 참조형 서로 형변환 X
7.1 자동 타입 변환
- 작은 타입은 큰 타입으로 자동 변환 by 컴파일러
- 치환문(=)이나 수식 내에서 타입이 일치하지 않을 때 변환 발생
7.2 강제 타입 변환
- 큰 타입이 작은 타입으로 변환할 때 자동으로 타입 변환이 안되므로 강제로 타입 변환 지시
- () 안에 변환할 타입 지정 - 값 손실 우려
8. 형식화된 출력 : printf()
- 지시자를 통해 변수의 값을 여러 가지 형식으로 변환하여 출력
- 출력 후 줄바꿈 X -> 줄바꿈 하려면, 지시자 '%n' 또는 '\n'을 사용
지시자 | 설명 |
%b | 불리언(boolean) 형식으로 출력 |
%d | 10진(decimal) 정수 형식으로 출력 |
%o | 8진(octal) 정수 형식으로 출력 |
%x, %X | 16진(hexa-decimal) 정수 형식으로 출력 |
%f | 부동 소수점(floating-point)의 형식으로 출력 |
%e, %E | 지수(exponent) 표현식의 형식으로 출력 |
%c | 문자(character)로 출력 |
%s | 문자열(string)로 출력 |
class PrintfEx1 {
public static void main(String[] args) {
byte b = 1;
short s = 2;
char c = 'A';
int finger = 10;
long big = 100_000_000_000L;
long hex = 0xFFFF_FFFF_FFFF_FFFFL ; // long hex = 0xFFFFFFFFFFFFFFFFL;
int octNum = 010; // 8진수 10, 10진수로는 8
int hexNum = 0x10; // 16진수 10, 10진수로는 16
int binNum = 0b10; // 2진수 10, 10진수로는 2
System.out.printf("b=%d%n", b); // b=1
System.out.printf("s=%d%n", s); // s=2
System.out.printf("c=%c, %d %n", c, (int)c); // c=A, 65
System.out.printf("finger=[%5d]%n", finger); // finger=[ 10]
System.out.printf("finger=[%-5d]%n", finger); // finger=[10 ]
System.out.printf("finger=[%05d]%n", finger); // finger=[00010]
System.out.printf("big=%d%n", big); // big=100000000000
System.out.printf("hex=%#x%n", hex); // '#'은 접두사(16진수 0x, 8진수 0)
// hex=0xffffffffffffffff
System.out.printf("octNum=%o, %d%n", octNum, octNum); // octNum=10, 8
System.out.printf("hexNum=%x, %d%n", hexNum, hexNum); // hexNum=10, 16
System.out.printf("binNum=%s, %d%n", Integer.toBinaryString(binNum), binNum);
// binNum=10, 2
}
}
class PrintfEx2 {
public static void main(String[] args) {
String url = "www.codechobo.com";
float f1 = .10f; // 0.10, 1.0e-1
float f2 = 1e1f; // 10.0, 1.0e1, 1.0e+1
float f3 = 3.14e3f;
double d = 1.23456789;
// f1=0.100000, 1.000000e-01, 0.100000
System.out.printf("f1=%f, %e, %g%n", f1, f1, f1);
// f2=10.000000, 1.000000e+01, 10.0000
System.out.printf("f2=%f, %e, %g%n", f2, f2, f2);
// f3=3140.000000, 3.140000e+03, 3140.00
System.out.printf("f3=%f, %e, %g%n", f3, f3, f3);
System.out.printf("d=%f%n", d); // d=1.234568
System.out.printf("d=%14.10f%n", d); // 전체 14자리 중 소수점 10자리
// d= 1.2345678900
System.out.printf("[12345678901234567890]%n"); // [12345678901234567890]
System.out.printf("[%s]%n", url); // [www.codechobo.com]
System.out.printf("[%20s]%n", url); // [ www.codechobo.com]
System.out.printf("[%-20s]%n", url); // 오른쪽 정렬 // [www.codechobo.com ]
System.out.printf("[%.8s]%n", url); // 왼쪽에서 8글자만 출력 // [www.code]
}
}
9. 키 입력
- System.in
- 키보드로부터 읽는 자바의 표준 입력 스트림
- 키 값을 바이트(문자 X)로 리턴
- 바이트 데이터로 리턴되므로 응용프로그램을 통해 문자로 변환해야 함 - Scanner 클래스
- System.in에게 키를 읽게 하고, 읽은 바이트를 문자, 정수, 실수, 불린, 문자열 등 다양한 타입으로 변환하여 리턴
- 입력되는 키 값을 공백('\t', '\f', '\n', ' ', '\r')으로 구분되는 아이템 단위로 읽음
import java.util.Scanner; // import 문 필요
Scanner scanner = new Scanner(System.in); // Scanner 객체 생성
String name = scanner.next(); // "Kim"
String city = scanner.next(); // "Seoul"
int age = scanner.nextInt(); // 20
double weight = scanner.nextDouble(); // 65.1
boolean single = scanner.nextBoolean(); // true
10. 연산자
- 산술 연산
- 더하기(+), 빼기(-), 곱하기(*), 나누기(/), 나머지(%) - 증감 연산
- 1 증가(++) 혹은 감소(--) 시키는 연산
- 대입 연산
- 연산의 오른쪽 결과는 왼쪽 변수에 대입
- 비교 연산
- 두 피연산자를 비교하여 true 또는 false의 논리 값을 내는 연산
- 논리 연산
- NOT(~), OR(||), AND(&&), XOR(^)으로 논리 값을 내는 연산
- 조건 연산자
- condition? opr2 : opr3
- 3개의 피연산자로 구성된 삼항 연산자
- condition이 true이면, 연산식의 결과는 opr2, false이면 opr3
- if-else을 간결하게 표현 가능
- 비트 논리 연산
- 비트끼리 AND, OR, XOR, NOT 연산
- 비트 시프트 연산
- 비트를 오른쪽이나 왼쪽으로 이동
- x << n은 x * 2^n의 결과와 같음
- x >> n은 x / 2^n의 결과와 같음
- 이항 연산자의 특징
- 이항 연산자는 연산 수행 전에 피연산자의 타입 일치시킴
- int보다 크기가 작은 타입은 int로 변환 (byte, char, short → int)
- 피연산자 중 표현 범위가 큰 타입으로 형 변환
- 연산자 우선순위
- 괄호의 우선순위가 제일 높음
- 산술 > 비교 > 논리 > 대입
- 단항 > 이항 > 삼항
- 연산자의 연산 진행 방향 : →
단항, 대임 연산자 진행 방향 : ←
11. 조건문
11.1 if문
- 단순 if문
- if의 조건식이 true일 경우 실행 문장을 실행
- if의 괄호 안에 조건식은 논리형 변수나 논리 연산, 비교 연산자
- 실행 문장이 단일 문장인 경우 둘러싸는 {} 생략 가능
- 다중 if-else문
- if문의 조건식을 만족하지 못할 때, 아래 else if문 또는 else문으로 가서 조건을 만족하는지 확인
- if-else가 연속되는 형태
package day02;
import java.util.Scanner;
public class NestedIf {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("점수를 입력하세요(0~100): ");
int score = scanner.nextInt();
System.out.print("학년을 입력하세요(1~4): ");
int year = scanner.nextInt();
if(score >= 60) {
if(year != 4)
System.out.println("합격!");
else if(score >= 70)
System.out.println("합격!");
else
System.out.println("불합격!");
}
else
System.out.println("불합격!");
scanner.close();
}
}
- 중첩 if문
- if문 안에 또 다른 if문 중첩
- 중첩 횟수 제한 X
11.2 switch문
- 개념
- 식과 case문의 값과 비교
- break를 만나면 switch문에서 벗어남
- case의 비교 값과 일치하는 것이 없으면, default문 실행
- case문에 break문이 없다면, 다음 case문으로 실행하며, break문 만날 때까지 계속 내려가면서 실행
- default문 생략 가능
- case 문의 값
- 문자, 정수, 문자열 리터럴만 허용
- 실수 리터럴, 변수는 허용 X
[ 참조 ]
1. Java의 정석 3판 (지은이 : 남궁성)
2. 명품 JAVA Programming 개정 3판 (지은이 : 황기태, 김효수)
'JAVA' 카테고리의 다른 글
CH06. java.lang 패키지와 유용한 클래스 (0) | 2021.05.10 |
---|---|
[Tip] static 메서드의 오버라이딩 불가 (0) | 2021.05.07 |
CH05. 상속, 오버라이딩, package, 제어자, 다형성, 추상클래스, 인터페이스 (0) | 2021.05.03 |
CH04. 객체지향, 클래스와 객체, 변수와 메서드, 오버로딩, 생성자, this레퍼런스, 변수 초기화 (0) | 2021.04.29 |
CH03. 반복문과 배열 그리고 예외 처리 (0) | 2021.04.28 |
댓글