본문 바로가기
Programming Language/Java

[국비] Java 내용정리 Day02

by tpleehan 2021. 10. 26.

Identifier - 식별자(데이터의 항목을 식별하고 데이터의 성질을 표시하기 위해 사용하는 문자의 집합)

식별자란? 클래스 또는 변수에 이름을 짓고 구분할 수 있으며 식별할 수 있다. (어디든 붙인 이름이라고 보면 된다.)
  • 개발자가 직접 이름을 지어주는 것을 말한다.
  • 프로그래밍을 하면서 이미 언어에서 이름이 정해져 있는 것을 예약어(키워드)라고 한다. 이런 예약어들은 직접 바꿀 수는 없다.
  • 변수, 함수, 메서드, 클래스, 인터페이스 등의 이름을 식별자라고 부른다.
  • 식별자들의 이름을 지어줄 때는 몇 가지 규칙이 필요하다.

자바에서 식별자를 사용할 때 꼭 지켜야 할 규칙이 있다. (지키지 않을 경우 에러 발생)

    1. 식별자의 이름은 중복을 허용하지 않는다. 또한, 대/소문자를 철저하게 구분한다.
    2. 식별자 이름은 숫자로 지정하거나 숫자로 시작하면 안된다.
    3. 식별자 이름에 공백을 포함할 수 없다.
    4. 식별자 이름에 쓸 수 있는 특수문자는 밑줄(_), 달러기호($)뿐이다. 
      하지만 사용을 권장하지 않는다.
      특수문자의 경우 사용하기로 약속한 곳이 지정되어 있다.
    5. 키워드(예약어)는 식별자 이름으로 사용이 불가능하다.
      키워드는 이미 어떠한 기능을 내포하고 있는 지정 문자이다.
    6. 한글이나 한자 같은 식별자 이름도 지정이 가능하다. 
      그러나 사용을 권하지 않는다.
public class Identifier {

	public static void main(String[] args) {
    
		//1. 식별자의 이름은 중복을 허용하지 않는다.
		//	 또한, 대/소문자를 철저하게 구분한다.
		int age = 35;
//		int age = 40; (x)
		int Age = 40;
		System.out.println(age);
		System.out.println(Age);
		
		//2. 식별자 이름은 숫자로 지정하거나 숫자로 시작하면 안된다.
//		int 700 = 365; (x)
//		int 7number = 7; (x)
		int number7111 = 7;
		int num7ber = 7;
		
		//3. 식별자 이름에 공백을 포함할 수 없다.
//		int my birth day = 20211020; (x)
		int mybirthday = 20211020;
		int myBirthDay = 20211020; //camel case
		
		//4. 식별자 이름에 쓸 수 있는 특수문자는 밑줄(_), 달러기호($)뿐이다.
		//   하지만 사용을 권장하지 않는다.
		//	 특수문자의 경우 사용하기로 약속한 곳이 지정되어 있다.
//		int customer_age = 10; //snake case (under bar 사용)
		
		//5. 키워드(예약어)는 식별자 이름으로 사용이 불가능하다.
		//   키워드는 이미 어떠한 기능을 내포하고 있는 지정 문자이다.
//		String class = "클래스"; (x)
		String Class = "클래스"; //(별로 권장하지 않음.)
		String className = "클래스";
		
		//6. 한글이나 한자 같은 식별자 이름도 지정이 가능하다.
		//	 그러나 사용을 권하지 않는다.
		int 숫자 = 10;
		String 名 = "홍길동";
		System.out.println(숫자);
		System.out.println(名);
	}
}

자바 개발자들의 약속, 관례로 식별할 때 camel case를 사용한다.
여러 단어를 연결해서 하나의 이름을 만들 때는 연결 단어의 첫 글자를 대문자로 작성해주는 것을 원칙으로 약속을 했다.

  • camerl case: phoneNumber (Java, JavaScript 등)
  • snake case: phone_number (Python, SQL, C 등)
  1. 클래스/인터페이스 이름
    • 첫 글자를 대문자로 Pascal case 적용
      ex) MyCalculatorForHim
  2. 변수/메서드(함수) 이름
    • 첫 글자를 소문자로 Camel case 적용
      ex) String userName;
      ex) void insertBoardArticle();

 

잘 못된 식별자의 예로서 컴파일 시 오류가 발생한다.

잘못된 예 설 명
3test 식별자는 숫자로 시작하면 안 된다.
@test 식별자의 첫 문자에 올 수 있는 특수문자는 "_"와 "$"뿐 이다.
this this는 키워드이며, 키워드는 식별자로 사용할 수 없다.
num data 공백을 포함할 수 없다.

올바른 사용 예

바른 예 설 명
test3 숫자는 식별자의 첫 문자만 아니면 어느 곳이나 올 수 있다.
_test "_"는 식별자의 첫 문자로 사용할 수 있다.
This This는 자바에서 사용되는 this와는 다르다.(대/소문자를 구분한다.)
numData 대/소문자를 같이 사용할 수 있다.

자바의 예약어(키워드)

abstract continue for new switch
assert default goto package synchronized
boolean do if private this
break double implements protected throw
byte else import public throws
case enum instanseof return transient
catch extends int short try
char final interfase static void
class finally long strictfp volatile
const float native super while
  • goto, const 키워드로 정의되어 있지만 사용하지 않는다.
  • strictfp는 Java 1.2 버전에 추가된 키워드이다.
  • assert는 Java 1.4 버전에 추가된 키워드이다.
  • enum은 Java 1.5 버전에 추가된 키워드이다.

자바 기본 데이터 타입의 종류

  유형 크기 범위 초기 값
정수형
Integral
byte 1 byte -127 ~ 127 -27 ~ 27 - 1 0
short 2 byte -32,768 ~ 32,767 -215 ~ (215 - 1) 0
int 4 byte -2,147,483,648 ~ 2,147,483,647 -231 ~ (231 - 1) 0
long 8 byte -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 -263 ~ (263 - 1) 0L
실수형
Floating-Point
float 4 byte (7자리의 소수) (3.4 * 10-38) ~ (3.4 * 1038) 0.0F
double 8 byte (15자리의 소수) (1.7 * 10-308) ~ (1.7 * 10308) 0.0D
논리형
Logical
boolean 1 byte(bit) 0 또는 1 true 또는 false false
문자형
Textual
char 2 byte ₩u0000 ~ ₩uFFFF 0 ~ 216 '₩u0000'
String 가변적 각 위치에서 ₩u0000 ~ ₩uFFFF   null
참조 타입       null
boolean은 true와 false 두 가지의 값만 표현되기 때문에 1bit로 충분하지만
자바에서는 데이터를 다루는 최소 단위가 byte이기 때문에 1 byte 크기이다.
public class IntegerExample {

	public static void main(String[] args) {		
		/*
		 # 리터럴
		 변수에 저장되기 전의 상수값.
		 자바의 정수 리터럴의 타입은 int이다.
		 int보다 더 큰 범위의 수를 표현하기 위해서는 뒤에 
		 L을 붙여 long타입으로 인식 시켜야 한다.
		 */
		byte a = 127;
		short b = 32767;
		int c = 2147483647;
		long d = 2147483648L;	
	}
}

long 타입에 L을 붙이지 않을 경우 "The literal 2147483648 of type int is out of range" 라는 문구가 뜬다.
변수에 대입하기 전에 리터럴의 범위가 벗어났기 때문에 해당 문구가 뜨는 것을 볼 수 있다.
자바의 정수형 기본 타입은 int이기 때문에 L을 표기해서 long type인걸 명시해줘야 한다.

public class FloatExample {
	
	public static void main(String[] args) {
		
		//실수 리터럴의 기본 데이터 타입은 double 이다.
		float f1 = 7.12345F;
		double d1 = 7.12345;
		
		float f2 = 1.234567891234F;
		double d2 = 1.234567891234;
		
		System.out.println(f2);
		System.out.println(d2);	
	}
}

float 타입에 F를 붙이지 않을 경우 "Type mismatch: cannot convert from double to float" 라는 문구가 뜬다.
double을 float로 변환할 수 없다는 문구가 뜨는 것을 볼 수 있다.
실수 literal의 기본 타입은 double이기 때문에 F를 표기해서 float tytpe인걸 명시해줘야 한다.

 

public class BooleanExample {

	public static void main(String[] args) {
		
		boolean b1 = true;
		boolean b2 = false;
		
//		boolean b3 = True; (x)
//		boolean b4 = False; (x)
//		boolean b5 = 0; (x)
//		boolean b6 = "논리형 타입"; (x)	
	}
}

boolean은 0 또는 1이라고 하는데 메모리 내부에서 식별하는 것이고,
자바에서 boolean 타입을 변수에 지정하려면 true와 false라는 keyword로 명시해야 한다.
해당 키워드가 아닌 대문자로 된 True와 False 그리고 숫자, 문자열을 넣으면 컴파일 에러가 발생한다.

 

public class TextualExample {

	public static void main(String[] args) {
		
		/*
		 # 단일 문자를 저장하는 데이터 타입 char
		  - 저장하고 싶은 문자를 홑따옴표('')에 담아서 대입한다.
		 */
		char c1 = 'A';
		System.out.println(c1);
		
		char c2 = 44201;
		System.out.println(c2);
		
		/*
		 # 문자열을 저장할 수 있는 데이터 타입 String
		  - 저장하고 싶은 문자열을 겹따옴표("")에 담아 대입한다.
		  - String은 기본 데이터 타입은 아니지만 자주 쓰이기 때문에
			기본 데이터 타입처럼 사용한다. (객체 타입이다.)
		 */
		
		String s1 = "my dream ";
		String s2 = "is a programmer";
		System.out.println(s1);
		System.out.println(s2);
		
		//자바에선 문자열의 덧셈 연삽을 지원한다.
		//연산 결과로는 문자열을 연결해서 결합한 결과가 도출된다.
		System.out.println(s1 + s2);
		
		//문자열과 다른 데이터 타입간의 연산
		//결과는 무조건 문자열의 덧셈 연산과 같다.
		System.out.println("------------------------------");
		
		System.out.println(100 + 100);
		System.out.println("100" + "100");
		System.out.println("100" + 100);
		System.out.println(3.14 + "hi");
		
		int month = 10;
		int day = 13;
		
		//내 생일은 10월 13일 입니다.
		System.out.println("내 생일은 " + month + "월 " + day + "일 입니다.");
	}
}

char에 홑따옴표(')가 아닌 큰따옴표(")를 감쌀 경우 "Type mismatch: cannot convert from String to char" 라는 문구가 뜬다.
단일 문자를 저장하기 위해서는 항상 홑따옴표('')로 감싸서 대입해야 한다.


형 변환이란?

형 변환(type casting)이란 데이터들이 서로 형태를 바꾸는 것을 의미한다. 형 변환은 묵시적 형변환과 명시적 형 변환 2가지 경우로 나뉜다.

byte < short = char < int < long < float < double
작은 크기의 데이터 타입을 큰 데이터 타입으로 변환할 때는 자동으로 형 변환이 일어난다.
public class CastingExample1 {

	public static void main(String[] args) {
		
		byte b = 10;
		int i = b;
		System.out.println(i);
		
		char c = 'A';
		int j = c;
		System.out.println("A의 문자 번호 : " + j);
		
		int k = 500;
		double d = k;
		System.out.println(d);	
	}
}

묵시적 변환, 자동 형변환(promotion, UpCasting)

  • 크기가 작은 데이터 타입의 자료를 큰 데이터 타입으로 변환할 때는 자바 가상 머신(JVM)이 자동으로 타입을 올려서 변환해 준다.
public class CastingExample2 {

	public static void main(String[] args) {
		
		int i = 72;
		char c = (char) i;
		System.out.println("72의 문자값 : " + c);
		
		double d = 4.98765;
		int j = (int) d;
		System.out.println(j);
		
		int k = 1000;
		byte b = (byte) k;
		System.out.println(b);
	}
}
  • 크기가 큰 데이터타입의 값을 작은 데이터 타입으로 변환하려면 반드시 형 변환 연산자 : (type)를 사용하여 명시적으로 형 변환을 진행해야 한다. (DownCasting)
  • 명시적으로 형 변현을 해야 하는 이유는, DownCasting의 경우 저장공간이 줄어들어 데이터 손실의 가능성이 항상 존재하기 때문이다. (overflow, underflow)
public class CastingExample3 {

	public static void main(String[] args) {
		
		char c = 'B';
		int i = 2;
		
		//서로 타입이 다른 기본 데이터의 연산 시에는 데이터 타입이 
		//큰 쪽에서 작은 쪽이 맞춰져서 자동으로 형 변환이 진행된 뒤에 연산이 진행된다.
		
		int intResult = i + c;
		char charResult = (char) (c + i);
		System.out.println(intResult);
		System.out.println(charResult);
		
		int k = 10;
		double d = (double) k /4;
		System.out.println(d);
		System.out.println(k);
		
		//int보다 작은 크기의 데이터 연산은 자동으로 값이
		//int로 변환되어 처리된다. (데이터 손실의 방지)
		byte b1 = 100;
		byte b2 = 70;
		System.out.println(b1 + b2);	
	}
}

자바 연산자 종류

우선 순위 연산자 연산자 설명
높음 ↑










낮음 ↓
( ) [ ]
.
괄호
소수점/참조 연산자
++, --
+, -
!
~
(type)
증/감 연산자(증가, 감소)
부호
논리 연산자(반전)
비트 연산자(반전)
형변환
*, /, % 산술 연산자(곱셈, 나눗셈, 나머지)
+, - 산술 연산자(덧셈, 뺄셈)
<<, >>, >>> 비트 이동 연산자(좌, 우, 우(부호포함))
<, <=, >, >=
==, !=
instanceof
비교 연산자(대/소 비교)
비교 연산자(동/이 비교)
type 연산자(객체 형 비교)
&, |, ^ 비트 연산자(AND, OR, XOR)
논리 연산자(AND, OR, XOR)
&&, || 논리 연산자(Short Circuit)
?  : 논리 연산자(3항 연산자)
=
+=, -=, *=, /=, %=
<<=, >>=, >>>=
&=, ^=, |=
대입 연산자
연산 후 대입 연산자
연산 후 대입 연산자
연산 후 대입 연산자
public class PlusMinusOperator {

	public static void main(String[] args) {
		
		//증감 연산자(++, --)
		//변수의 값을 단순히 하나씩 올리거나 내릴 때 사용한다.
		
		int i = 1;
		int j = i++; //후위 연산 (선연산 후 증감)
		int k = i--;
		
		System.out.println("i의 값: " + i);
		System.out.println("j의 값: " + j);
		System.out.println("k의 값: " + k);
		
		System.out.println("-------------------------");
		
		int x = 1;
		int y = ++x; //전위 연산 (선증감 후 연산)
		int z = --x;
		System.out.println("x의 값: " + x);
		System.out.println("y의 값: " + y);
		System.out.println("z의 값: " + z);
		
		int a = 3;
		int b = ++a + 5 * 3;
		System.out.println(b);		
	}
}
public class AssignmentOperator {

	public static void main(String[] args) {
		
		/*
		 # 대입 연산자 (=)
		  - 변수의 값을 대입할 때 사용하는 연산자이다.
		 # 복합 대입 연산자 (+=, -=, *=, /=, %=)
		  - 대입연산자에 산술연산자가 결합되어 있는 형태이다.
		 */
		
		int a = 5;
		int b = 5;
		
		b =+ 3; // b = +3
		System.out.println(b);
		
		a += 3; // a = a + 3
		System.out.println(a);
		
		System.out.println("--------------------------");
		
		a -= 4;	// 4
		System.out.println(a);
		a *= 6; // 24
		System.out.println(a);
		a /= 5; // 4
		System.out.println(a);
		a %= 3; // 1
		System.out.println(a);	
	}
}
public class LogicalOperator {

	public static void main(String[] args) {
		
		//비교(관계) 연산자 (<, <=, >, >=, ==, !=)
		//좌항과 우항의 크기를 비교하여 결과값으로
		//항상 논리형 타입의 값을 도출한다.
		
		int x = 10, y = 20;
		
		System.out.println(x != y);		
		System.out.println(x > 10 && (y / 0 == 10));
		System.out.println(x > 10 || y < 30);
		
		//논리 반전 연산자 (!: 단항)
		//단순히 논리값을 반전시킬 때 사용한다.
		//true -> false, false -> true
		
		int z = 10;
		System.out.println(!(z == 10));	
	}
}

논리 연산자 (&, &&, |, ||)

  • 좌항과 우항의 논리값을 연산하여 하나의 논리값을 도출한다.
    • &, && : 양쪽 항의 논리값이 모두 true일 경우 true가 도출한다.
    • |, || : 양쪽 항의 논리값 중 한 쪽만 true여도 true를 도출한다.

&&, || -> 단축 평가 연산 (short circuit operation)

  • 좌항의 연산 결과가 전체 연산 결과에 영향을 미칠 경우 우항의 연산을 진행하지 않는다.

자바 표준 출력함수 System.out.print()

  • 표준 입출력이란 데이터 입출력을 위한 주변 장치를 별도로 설정하지 않았을 경우 사용되는 입출력을 말한다.
  • 일반적으로 표준 입력은 키보드 입력을 사용하며 표준 출력은 단말기 화면 출력을 말한다.
  • 자바는 표준 출력함수로 System.out.print()를 지원하여 프로그램의 데이터를 화면에 출력할 수 있다.
  • 함수의 인자값으로 출력하고 싶은 변수나 상수를 넣으면 화면에 출력된다.
public class PrintExample {

	public static void main(String[] args) {

		System.out.print("안녕하세요.");
		System.out.println("hello.");
		System.out.print("안녕히 가세요.");
		System.out.println("bye. bye.");
		
		int month = 12;
		int day = 25;
		String anni = "크리스마스";
		
		//12월 25일은 크리스마스 입니다.
		System.out.println(month + "월 " + day + "일은 " + anni + " 입니다.");
		System.out.printf("%d월 %d일은 %s 입니다.", month, day, anni);
		System.out.printf("지금 시간은 %d시 %d분 입니다. \t\t\t%s요일입니다.\n\n", 9, 46, "목");
        
		double rate = 63.456;
		System.out.printf("시험 합격율: %f\n", rate);
		System.out.printf("시험 합격율: %.2f%%\n", rate);
		System.out.printf("시험 합격율: %.1f\n", rate);
		System.out.printf("시험 합격율: %.0f%%", rate);        
	}
}
자바의 표준 출력 형식은 크게 3가지로 나뉜다.
  1. 개행을 포함하지 않는 print()
  2. 자동으로 개행을 포함해 주는 println()
  3. 형식 지정 표준 출력 함수 printf()
    서식 문자를 이용해서 문자열을 완성 시킨 후, 서식 문자에 들어갈 값을 지정해서 출력하는 방식.
    printf 함수는 print와 마찬가지로 줄 개행 기능이 없다.
포맷팅 서식 문자 종류
%d : 부호가 있는 정수 데이터 (decimal)
%f : 실수 데이터 (floation point)
%s : 문자열 (String)
탈출 코드 (escape code)
- 문자열 내에서 특정 명령을 내리고 싶을 때 사용하는 특수 기호이다.
- 어떤 출력 함수에서도 사용이 가능하다.
- 반드시 따옴표 내에 위치시켜야 한다.

 \n: 줄 바꿈 명령 (enter)
 \t: 탭 정령 (4칸 들여쓰기)
  •  %f는 기본적으로 소수점 6자리까지 표현하도로 설계되어 있다.
  • 만약 자리수를 조정하려면 %.[자리수에 해당하는 숫자]f를 사용한다.
  • "%" 특수문자를 표현하려면 %%로 사용하면 된다.

댓글