Back-end/Java

자바 기초 정리

메델 2023. 1. 30. 19:51

식별자(identifier) 

:  클래스, 상수, 메소드 등에 붙이는 이름

 

식별자 규칙 

  • 특수문자와 공백은 식별자로 사용 X( _ , $ 는 예외적으로 사용 가능)
  • 한글도 식별자 사용 가능
  • if, while, class 등 자바 언어의 키워드는 식별자로 사용 불가능
  • '_', '$' 는 식별자의 첫 번째 문자로 사용할 수 있으나 일반적으로 사용 X
  • 대소문자 구별 
  • 길이 제한 X

 

리터럴(literal)

: 프로그램에 직접 표현한 값으로 정수, 실수, 문자, 논리, 문자열 타입 모두 리터럴이 있음

 

정수 리터럴 

: 정수 인터럴은 int 타입으로 자동 컴파일 → long 타입으로 지정하려면 숫자 뒤에 L을 붙임

 

유형 설명  사례
10진수 0으로 시작하지 않는 수  15 -> 10진수 15
8진수 0으로 시작하는 수 015 -> 10진수 13
16진수 0x로 시작하는 수 0x15 -> 10진수 21
2진수 0b로 시작하는 수  0b0101  -> 십진수 5

 

실수 리터럴 

:  소수점 형태나 지수 형태로 실수를 표현한 값, double 타입으로 자동 처리

 

double d = 0.1234;
double e = 1234E-4; // 0.1234

 

숫자 뒤에 f/F를 붙이면 float, d/D를 붙이면 double 타입으로 강제 변환

 

float f  = 0.1234f; // f = 0.1234로 하면 컴파일 오류
double w = .1234D; //.1234D와 .1234 동일

 

문자 리터럴 

:  단일 인용부호(' ')로 문자를 표현하거나 \U 다음에 문자의 유니코드 값 사용

 

char a ='A';
char b = '글';
char c = \u0041; // 문자 'A'의 유니코드 값 사용

 

 특수 문자 리터럴

 

종류 의미 종류 의미
'\b' backspace '\r' 캐리지리턴
'\t' tab '\"' 이중 인용부호 
'\n' 라인피드 '\'' 단일 이중부호
'\f' 폼피드  '\\' 백슬래시

 

논리 리터럴과 boolean 타입

:  논리 리터럴은 true, false 두개만 있다. boolean 타입의 변수에 직접 치환하거나 조건문에 사용 

boolean a = true;
boolean b = 10> 0; // 10>0이므로 true
boolean c = 1; // 타입 불일치 오류, c/c++와 달리 자바에서 숫자를 참, 거짓으로 사용 불가
while(true){ // 자바에서 무한루프 
...
}

 

 

타입 변환

:  변수나 상수 혹은 리터럴의 타입을 다른 타읍으로 바꾸는 것 

 

작은 타입 변환

: 치환문이나 수식 내에서 타입이 일치 하지 않을 때, 컴파일러는 오류 대신 작은 타입을 큰 타입으로 자동 변환

long m = 25; // 리터럴 25은 int 타입, 25가 long 타입으로 자동 변환
double d = 3.14 * 10; // 실수 연산을 하기 위해 10이 10.0으로 자동 변환

 

강제 타입 변환(캐스팅)

: 개발자가 강제로 타입 변환을 지시하는 것

int n = 300;
byte b = n; // 컴파일 오류 , int 타입은 byte 타입으로 자동 변환 안됨​

변수  n에 저장된 값 300은 byte 타입 (0 ~ 255 범위)의 범위보다 크기 떄문에 컴팡일러가 자동 변환하게 되면 b에 300이 저장되지 않고 256을 뺀 나머지(300%256 =44) 44만 저장

 

 큰 타입의 값을 작은 타입의 값으로 변환해야 할 때, 컴파일러는 자동 변환 대신 컴파일 오류를 발생 

→ 개발자가 그래도 타입 변환을 원한다면 명시적으로 강제 타입 변환 지시

byte b = (byte) n;

하지만 강제 변환은 컴파일 오류가 발생하지 않을 뿐  여전히 데이터 손실 발생 

(ex. 실수를 정수로 강제 변환하면 소수점 이하의 손실 발생)

 

 

System.in

:  키보드 장치에서 직접 제어하고 키 입력을 받는 표준 입력 스트림 객체

→ 하지만 System.in읍 입력된 키를 단순한 바이트 정보로 응용 프로그램에게 제공하므로 응용 프로그램은 받은 바이트 정보를 문자나 숫자로 변환해야하는 번거로움이 존재

  사용자가 원하는 타입으로 변환해주는 Scanner 클래스 사용

 

Scanner

  • 응용 프로그램이 키 입력을 쉽게 받을 수 있도로 자바 패키지에서 제공하는 클래스 
  • 사용자가 입력하는 키 값을 공백문자(' ', '\t', '\n') 기준으로 분리하여 토큰 단위로 읽음

 

Scanner를 사용하기 위해서는 import문 필요

Scanner 클래스는 자바에서 제공되는 java.util 패키지에 있음을 나타낸다.

 

import java.util.Scanner;

 

Scanner 클래스의 주요 메소드

메소드 설명
String next() 다음 토큰으로 문자열 리턴
byte nextByte() 다음 토큰을 byte 타입으로 리턴
short nextShort() 다음 토큰을 short 타입으로 리턴
int nextInt() 다음 토큰을 int 타입으로 리턴
long nextLong() 다음 토큰을 long 타입으로 리턴
float nextFloat() 다음 토큰을 float 타입으로 리턴
double nextDouble() 다음 토큰을 double 타입으로 리턴
boolean nextBoolean() 다음 토큰을 boolean 타입으로 리턴
String nextLine() '\n'을 포함한 한라일을 읽고 '\n'을 버린 나머지 문자열 리턴
void close() Scanner의 사용 종료
boolean  hasNext() 현재 입력된 토큰이 있으면 true, 아니면 입력 때까지 무한정대기, 새로운 입력이 들어올 때 true 리턴, ctrl-z 키가 입력되면 입력 끝이므로 false 리턴

 

next()와 nextLine()

: next는 공백이 낀 문자열을 읽을 수 없기 때문에 공백이 낀 문자열을 입력 받기 위해서는 nextLine()을 사용한다. nextLine()은 <Enter>키의 입력을 기다리는 용도로 사용한다.

 

Scanner를 이용한 키 입력 예제

: Scanner 클래스로 이름, 도시, 나이, 체중, 독신 여부를 입력받고 다시 출력하는 프로그램 작성

import java.util.Scanner;

public class ScannerEx {
	
	public static void main(String[] args) {
		System.out.println("이름, 도시, 나이, 체중, 독신 여부를 빈칸으로 분리하여 입력");
		Scanner scanner = new Scanner(System.in);
		
		String name = scanner.next();
		System.out.print("이름은 "+ name + ", ");
		
		String city = scanner.next();
		System.out.print("도시는 "+ city +", ");
		
		int age = scanner.nextInt();
		System.out.print("나이는 "+ age +", ");
		
		float weight = scanner.nextFloat();
		System.out.print("체중은 " + weight + ", ");
		
		boolean isSingle = scanner.nextBoolean();
		System.out.print("독신 여부는 " +isSingle +"입니다");
		scanner.close();
		
	}

}

 

비교 연산과 논리 연산

 

비교 연산 

연산자 내용
a < b a가 b보다 작으면 true
a > b a가 b보다 크면 true
a <= b a가 b보다 작거나 같으면 true
a >= b a가 b보다 크거나 같으면 true
a == b a와  b가 같으면 true
a != b a와 b가 같지 않으면 true

 

논리 연산

연산자 내용
!a a가 true이면 flase, false이면 true
a || b a와 b의 OR 연산, a와 b 모두 false인 경우에만 false
a && b a와 b의 AND 연산, a와 b모두 true인 경우에만 true
a ^ b a와 b의 XOR 연산,  a와 b가 서로 다를 때 true

 

비교 연산자와 논리 연산자를 복합해서 사용하는 경우

(age>=20) && (age <30) //나이가 20대인 경우 
(c >= 'A') && (c <='Z') // 문자가 대문자인 경우
(x>=0) && (y>=0) && (x <=50) && (y<=50) // (x,y)가 (0,0)과 (50, 50)의 사각형 내에 있음

 

조건 연산 = 삼항 연산자

조건문이 true이면 결과 값 op2, false이면 op3

condition ? opr2 : opr3
public class TernaryOperator {
	
	public static void main(String[] args) {
		int a = 3, b=5;
		System.out.println("두 수의 차는"+ ((a>b)?(a-b):(b-a)));
		
	}

}

 

비트 논리 연산자

연산자 별칭 내용
a&b AND 연산 두 비트 모두 1이면 1, 그렇지 않으면 0
a|b OR 연산 두 비트 모두 0이면 0, 그렇지 않으면 1
a^b XOR 연산  두 비트가 다르면 1, 같으면 0
~a NOT 연산 1을 0으로 0을 1로 변

 

비트 시프트 연산자

새로운 비트를 오른쪽이나 왼쪽 끝에 삽입하면서 비트의 자리를 이동시키는 연산

저장 공간의 크기가 정해져 있으므로 시프트 되는 방향에 따라 끝에 있는 비트는 사라짐 

시프트 연산의 피연산자는 byte, short, int, long, char 타입만 가능하고 float, double, boolean은 사용 불가능 

시프트 연산자 내용
 a >> b 산술적 오른쪽 비트
a의 각 비트를 오른쪽으로 b번 시프트한다.
최상위 비트의 빈자리는 시프트 전의 최상위 비트로 다시 채운다.
a >>> b  논리적 오른쪽 비트 
a의 각 비트를 오른쪽으로 b번 시프트한다.
최상위 비트의 빈자리는 항상 0으로 채운다.

a << b 산술적 왼쪽 비트
a의 각 비트를 왼쪽으로 b번 시프트
최하위 비트의 빈자리는 항상 0으로 채운다.

 

>> 연산자는  >>> 연산자와 달리 왼쪽 끝의 MSB(최상위비트)에는 시프트 이저의 최상위 비트 그대로 삽입 

 

조건문

 

if 문

if 문의 조건식은 비교 연산이나 논리 연산이 혼합된 식으로 구성

조건식의 결과 값은 boolean 값

 

swtich 문

값에 따라 여러 방향으로 분기하는 경우, if 문보다 switch 문을 사용하면 가독성 높은 코드 작성 가능

switch 문은 먼저 식을 계산하고 그 결과 값과 일치하는 case 문으로 분기한다. 

case 문의 '실행 문장'을 실행한 후 break를 만다면 switch 문을 벗어난다.

case 문으로도 분기하지 못하는 경우 default 문으로 분기한다.

 

import java.util.Scanner;
public class GradingSwitch {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		char grade;
		System.out.print("점수를 입력하세요(0~100): ");
		int score = scanner.nextInt();
		
		
		switch(score/10) {
			case 10:
			case 9:
				grade = 'a';
				break;
			case 8:
				grade = 'b';
				break;
			case 7:
				grade = 'c';
				break;
			case 6:
				grade = 'd';
				break;
				
			default: 
				grade = 'f';
		}
		System.out.println("학점은 "+ grade );
		scanner.close();
		
	}

}

 

(참고: 명품  Java Programming - 생능 출판사)

 

 

 

 

 

 

 

'Back-end > Java' 카테고리의 다른 글

static 변수  (0) 2022.09.26
접근 제어 지시자 & this  (0) 2022.09.12
생성자  (0) 2022.09.09
인스턴스 & 동적 메모리  (1) 2022.09.08