Skip to content

Latest commit

 

History

History
373 lines (312 loc) · 11.3 KB

220302.md

File metadata and controls

373 lines (312 loc) · 11.3 KB

자바의 정석 - 남궁성

링크

java 컴파일

cmd에서 javac <파일명.java>를 입력하면 .class 파일이 생성된다.
그 후에 java <.class 파일>을 입력하면 실행되는 것을 확인할 수 있다.

javac.exe

자바 컴파일러로 사람이 작성한 문장을 기계어로 번역한다.
소스 파일(.java)을 클래스 파일(.class)로 변환한다.

java.exe

자바 인터프리터로 자바 프로그램(클래스 파일)을 실행한다.

클래스

자바 프로그램의 단위이며 자바 프로그램은 클래스들로 구성된다.
자바에서는 모든 문장은 클래스 안에 있어야 한다.

main 메소드

자바 프로그램의 시작점으로 이 메소드가 없으면 실행 할 수 없다.

이클립스에서 자바 프로그램 작성 순서

  1. 프로젝트 생성
  2. 클래스 생성
  3. 소스파일 작성 후 저장(자동 컴파일)
  4. 실행

Build

소스 파일(.java)로부터 프로그램을 만들어 내는 전 과정이다.
Build 관려 메뉴

  • Build All : workspace의 모든 프로젝트를 빌드
  • Build Project : 현재 프로젝트를 빌드(변경된 소스 파일만 새로 컴파일)
  • Clean : 이전 빌드의 정보를 모두 삭제(모든 소스 파일을 새로 컴파일)
  • Build Automatically : 소스 파일을 변경 후, 저장할 때마다 자동 컴파일

단축키

단축키 기능
ctrl + shitf + L 단축키 전체 목록 보기
ctrl + +,- 폰트 크기 증가, 감소
ctrl + D 한 줄 삭제
ctrl + alt + down 행 단위 복사
alt + shift + A 멀티 컬럼 편집
alt + up,down 행 단위 이동
ctrl + i 자동 들여쓰기
ctrl + / 주석(토글)
ctrl + space 자동 완성

출력

public class Ex2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.print("Hello, Word");
		System.out.println("Hello, Word");
		System.out.println("Hello, Word");
	}

}

Hello, WordHello, Word
Hello, Word

print는 줄 바꿈을 하지 않고, println은 줄 바꿈을 한다.

public class Ex2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(3 + 5);  // 덧셈
		System.out.println(3 - 5);  // 뺄셈
		System.out.println(3 * 5);  // 곱셈
		System.out.println(30 / 5); // 나눗셈
	}

}

변수

변수 선언은 다음과 같이 한다.

변수타입 변수이름;

지역 변수는 읽기 전에 반드시 초기화해야 한다.

변수 타입

  • 문자 : char
  • 숫자
    • 정수 : byte, short, int, long
    • 실수 : float, double
  • 논리 : boolean

상수, 리터럴

상수(constant)란 한 번만 값을 저장 가능한 변수이다.

final int MAX = 100;
MAX = 200 // 에러 발생

리터럴(literal)은 그 자체로 값을 의미하는 것이다. 위에서 100을 리터럴이라고 한다.

리터럴의 접두사, 접미사

종류 리터럴 접미사
논리형 false, true 없음
정수형 12, 0xFF, 100L L
실수형 3.14, 1.4f f, d
문자형 'A', '1' 없음
문자열 "ABC", "123" 없음

d는 생략 가능하다.
접미사는 대소문자를 구별하지 않는다.

boolean power = true;
char ch = 'A';
String str = "ABC";
byte b = 127;
int i = 100;
long l = 10_000_000_000L;
float f = 3.14f;

long에서 숫자 사이에 있는 '_'는 보기 쉬우라고 쓰는 것으로 없어도 의미는 같다.

변수와 리터럴의 타입 불일치

범위가 '변수 > 리터럴' 인 경우 불일치할 수 있다.

int i = 'A'; // int > char

범위가 '변수 < 리터럴' 인 경우 에러가 발생한다.

float f = 3.14; // float < double

byte, short 변수에 int 리터럴을 저장할 수 있지만 변수의 타입의 범위 밖이면 에러가 발생한다.

byte b = 100; // byte의 범위(-128~127)에 속하므로 가능하다.
byte b = 128; // 범위를 벗어나 에러가 발생한다.

문자와 문자열

C의 문자열 저장과 같이 주소를 넣는 것이다.
String은 자바의 클래스이다.

String s1 = "AB";

숫자를 문자열로 변환하는 법
빈 문자열("")과 숫자를 더하면 "" + "7"이 되어 "7"이 결과로 나온다.
문자의 결합은 왼쪽에서 오른쪽으로 진행된다.

"" + 7 + 7 = "7" + 7 = "7" + "7" = "77"
7 + 7 + "" = 14 + "" = "14" + "" = "14"

문자열에 어느 타입을 더하면 결과는 문자열이다.

  • 문자열 + any type = 문자열
  • any type + 문자열 = 문자열

기본형과 참조형

기본형(Primitive type)

  • 오직 8개 (boolean, char, byte, short, int, long, float, double)
  • 실제 값을 저장

참조형(Reference type)

  • 기본형을 제외한 나머지(String, System 등)
  • 메모리 주소를 저장(4 byte 또는 8 byte)
  • 참조 변수는 객체의 주소를 저장하기 위한 것

기본형의 종류와 크기

boolean, byte : 1 byte
char, short : 2 byte
int, float : 4 byte
long, double : 8 byte

기본형의 표현 범위

n비트로 표현할 수 있는 값의 개수는 2^n개
n비트로 표현할 수 있는 부호없는 정수의 범위는 0~(2^n) - 1
n비트로 표현할 수 있는 부호있는 정수의 범위는 -(2^n-1) ~ (2^n-1) -1

float의 정밀도는 7자리, double은 15자리이다.

형식화된 출력

println()은 출력 형식을 지정할 수 없다.

  • 실수의 자리수 조절을 할 수가 없다.
  • 10진수로만 출력된다.

printf()는 출력 형식을 지정할 수 있다.

System.out.printf("%d %d", 10, 2022);

printf()의 지시자

지시자 설명
%b boolean
%d 10진 정수
%d 8진 정수
%x, %X 16진 정수
%f 부동 소수점
%e, %E 지수 표현식
%c 문자
%s 문자열

printf()는 줄 바꿈을 하지 않는다. %n과 \n은 같으나 %n은 OS를 가리지 않는다.

2진수 출력은 메소드를 써야 한다.

System.out.printf("%s", Integer.toBinaryString(15));

8진수와 16진수에 접두사를 붙이려면 #을 붙여주면 된다.

System.out.printf("%#o", 15); // 017
System.out.printf("%#x", 15); // 0xf

실수를 출력할 때 %g 지시자를 쓰면 %f와 %e 중 더 간략한 것을 선택해 출력한다.

System.out.printf("%g", 123.456789); // 123.457

지시자 앞에 숫자를 붙이면 자릿수를 지정할 수 있다.

System.out.printf("[%5d]", 10); // [   10]
System.out.printf("[%-5d]", 10); // [10   ]
System.out.printf("[%05d]", 10); // [00010]

수소점 아래 자리도 지정 가능한데 이때는 정수쪽은 빈 자리를 공백으로 채우고, 소수쪽 빈 자리는 0으로 채운다.

화면에서 입력 받기

Scanner란 화면으로부터 데이터를 입력받는 기능을 제공하는 클래스이다.

Scanner 사용

  1. import 문 추가
  2. Scanner 객체를 생성
  3. Scanner 객체를 사용
// 1번 방법
int num = scanner.nextInt();

// 2번 방법
String input = scanner.nextLine(); // 라인 단위로 입력 받음
int num = integer.parseInt(input);
import java.util.*;

public class Ex2 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int num = scanner.nextInt();
		System.out.println(num);
		
	}

}

두 가지 값을 띄어쓰기로 구분해서 입력 받으려면 nextInt 부분을 한 번 더 사용하면 된다.

Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
int num2 = scanner.nextInt();
System.out.println(num);

입출력 관련 객체들은 사용 후에 닫아줘야 한다.

타입간의 변환

문자와 숫자간의 변환은 '0'(문자 0)을 더하고 빼면 된다.
숫자에서 문자로 갈 때는 더하고, 문자에서 숫자로 갈 때는 뺀다.
아스키 코드 값과 관련이 있다.

문자열로의 변환은 빈 문자열("")을 더하면 된다.

문자열을 숫자로 변환하려면 Integer.parseInt()를 사용한다. 실수는 Double.parseDouble()을 사용한다. 즉, 메소드를 사용해야 한다.

문자열을 문자로 바꾸려면 charAt(0)을 사용하면 된다. 즉, "3"을 '3'으로 변환하는 것이다.

String str = "3";
System.out.println(str.charAt(0) - '0');
System.out.println('3' - '0' + 1);
System.out.println(Integer.parseInt("3" + 1));
System.out.println("3" + 1);
System.out.println(3 + '0'); // '0'은 숫자로 48
System.out.println((char)(3 + '0'));

3
4
31
31
51
3

연산자 우선 순위

  1. 산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행된다.
  2. 단항 > 이항 > 삼항. 단항 연산자의 우선순위가 이항 연산자보다 높다.
  3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.

증감 연산자

전위형은 i++를 원래 식 위에, 후위형은 아래에 넣는다고 생각하면 편하다.

// 전위형
j = ++i;

i++;
j = i;

// 후위형
j = i++;

j = i;
i++;

형변환

형변환을 생략하면 컴파일러가 알아서 자동적으로 형변환하는데 작은 값을 큰 쪽에 넣을 때만 자동 형변환이 가능하다.
기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환 된다.
short와 char은 서로 자동 형변환이 안된다.

산술 변환

연산 전에 피연산자의 타입을 일치시키는 것을 산술 변환이라고 한다.

  • 두 피연산자의 타입을 보다 큰 타입으로 일치시킨다.
  • 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.

두 번째 규칙 때문에 '0'을 빼면 문자에서 숫자로 변환되는 것이다.
'2' - '0'을 하면 char이 int형으로 바뀌면서 아스키코드 값에 맞춰 50 - 48로 변환되고, 결과는 2가 나온다.

반올림

Math.round() 메소드를 사용한다.
실수를 소수점 첫째 자리에서 반올림한 정수를 반환해준다.

long result = Math.round(4.52); // 5

n번째 자리에서 반올림하려면 추가 조치가 필요하다.

double pi = 3.141592;
double shortPi = Math.round(pi * 1000) / 1000.0;
System.out.println(shortPi);

자세히 설명하자면 우선 소수점 세번째 자리까지만 나오게 한다고 치고 세번째 자리까지 정수 부분으로 옮기기 위해 1000을 곱하고 그 후에 반올림을 하면 네번째 자리에서 반올림을 하게 되고, 그 후에 다시 1000을 나눠서 원래 자릿수로 돌아오게 한 것이다.

double pi = 3.141592;
System.out.println(pi);
System.out.println(pi * 1000);
System.out.println(Math.round(pi * 1000));
System.out.println(Math.round(pi * 1000) / 1000.0);

3.141592
3141.592
3142
3.142

절삭을 하려면 형변환을 해주면 된다.

System.out.println(pi*1000);
System.out.println((int)(pi*1000));
System.out.println((int)(pi*1000)/1000.0);

3141.592
3141
3.141

나머지 연산자

피연산자는 0이 아닌 정수만 허용하고, 부호는 무시된다.

문자열 비교

문자열 비교에는 == 대신 equals()를 사용해야 한다.

조건 연산자 ( ? : )

조건식의 결과에 따라 연산결과를 달리한다.

조건식 ? 식1 : 식2

result = (x > y) ? x : y; // true면 x, false면 y가 대입된다.