C/C++과 달리, 자바는 모든 코드가 반드시 class 내부에 있어야 함.
엔트리 포인트 (Entry Point): 프로그램의 시작점. JVM이 가장 먼저 실행하는 메서드.
public static void main(String[] args)
이 main 메서드 선언부는 고정된 틀이므로 반드시 암기해야 함.
public: 외부(JVM)에서 접근할 수 있어야 함.
static: 객체(인스턴스) 생성 전에 JVM이 바로 실행할 수 있어야 함.
void: 프로그램의 시작점일 뿐, 메서드 자체가 값을 반환할 필요가 없음.
String[] args: 프로그램 실행 시 외부에서 값을 넘겨받기 위한 통로. (예: java MyProgram 10 20) 모든 값은 String 배열로 들어옴.
(규칙) 하나의 클래스 안에는 main 메서드가 두 개 이상 존재할 수 없음. (JVM이 진입점을 알 수 없음)
cf. 서로 다른 클래스가 각자 main을 갖는 것은 가능. java ClassA를 실행하면 ClassA의 main이 실행됨.
1) 출력: System.out.println()
C++의 cout과 유사한 기능.
println의 ln은 "End Line"의 약자로, 내용 출력 후 줄바꿈(엔터)을 함.
2) 입력: Scanner (중요)
C++의 cin보다 복잡. 파이프라인 구조를 이해해야 함.
System.in: 키보드로부터 원시 바이트(byte) 데이터를 읽어들이는 객체. (이 자체로는 데이터 해석 불가)
Scanner: System.in으로부터 받은 바이트 데이터를 int, String 등 원하는 타입으로 변환/해석하는 객체.
// 1. Scanner 객체 생성 (키보드 입력을 해석기에 연결)
Scanner scanner = new Scanner(System.in);
// 2. 타입에 맞게 읽기
int num = scanner.nextInt(); // 정수(int) 읽기
String s = scanner.next(); // 문자열(String) 읽기
double d = scanner.nextDouble(); // 실수(double) 읽기
// 3. 사용 종료 (필수)
scanner.close();
코드의 가독성과 전문성을 위해 지켜야 하는 중요한 규칙.
클래스 (Class): 항상 대문자로 시작. (예: MyClassName)
변수 (Variable), 메서드 (Method): 항상 소문자로 시작. (예: myVariableName)
상수 (Constant): 전부 대문자와 _ (언더바)로 작성. (예: MAX_SIZE)
1) 기본 타입 (Primitive Types)
boolean (1 bit)
char (2 bytes) - C/C++(ASCII, 1 byte)와 달리, Java는 유니코드(Unicode)를 사용하므로 2바이트. 한글 등 표현 가능.
byte (1), short (2), int (4), long (8)
float (4), double (8)
2) 참조 타입 (Reference Types)
변수 안에 실제 값이 아닌 '주소(address)'를 저장하는 타입.
종류: 배열 (Array), 클래스/객체 (Class/Object), 인터페이스 (Interface)
null: 참조 타입 변수가 어떤 주소도 가리키고 있지 않음을 의미.
3) 타입 변환 (Casting)
자동 변환: 작은 타입에서 큰 타입으로 이동. (예: int → long)
강제 변환: 큰 타입에서 작은 타입으로 이동. (데이터 손실 위험)
// 예: int(4바이트)를 byte(1바이트)로 강제 변환
int num = 300;
byte b = (byte)num; // byte는 약 -128~127 범위. 300을 담을 수 없어 값이 깨짐.
C++의 포인터와 달리, Java의 배열은 '참조(Reference)' 방식으로 동작.
C++ (포인터): int arr = new int[10]; (포인터 사용, 수동 delete 필요)
Java (참조): int[] arr = new int[10]; (포인터 없음, GC가 자동 처리)
new int[10]: 메모리 힙(Heap) 영역에 10칸짜리 정수 배열(실체)을 생성.
int[] arr: 힙 영역에 생성된 배열의 '주소'를 저장하는 '참조 변수'.
참조의 특성 (주소 복사)
int[] b = arr;
위 코드는 배열(실체)을 복사하는 것이 아니라, arr이 들고 있던 '주소'만 b에 복사함.
결과: arr과 b는 하나의 동일한 배열을 가리킴.
배열의 길이: .length
arr.length 속성으로 배열의 크기를 알 수 있음.
for (int i = 0; i < arr.length; i++) { ... }
int[][] score = new int[4][2]; // 4행 2열 배열 생성
비정방 배열 (Ragged Array): 행마다 열의 개수가 다른 배열.
int[][] arr = new int[3][]; // 3개의 행만 우선 생성
arr[0] = new int[2]; // 0번 행은 2열
arr[1] = new int[5]; // 1번 행은 5열
for-each (향상된 for문): (Python의 for...in과 유사)
// arr의 모든 요소를 k에 하나씩 넣으며 반복
for (int k : arr) { ... }