
※ 이 글은 쉽게 배우는 자바 프로그래밍(2017) 내용을 기반으로 작성했습니다. 일부 내용은 생략되었습니다.
자바 프로그램의 기본 구조
- 클래스 : 프로그램을 개발하는 단위
- 적어도 하나의 클래스가 있어야 한다.
- 클래스 이름은 대문자로 시작해야 하며, 클래스 내부엔 여러 메서드가 포함될 수 있다.
- 메서드 : 수행할 작업을 나열한 코드의 모임
- 자바 애플리케이션은 main() 메서드로 실행을 시작하므로 main() 메서드를 포함하는 클래스가 반드시 존재해야 한다.
- 실행문 : 작업을 지시하는 코드
- 1장 Hello.java 파일에서 넣은 System.out.println(”안녕!”);이 실행문이다.
- 주석문 : 프로그램에 덧붙이는 설명문
- 행 주석 : //
- 범위 주석 : /* …… */

식별자
식별자는 변수, 메서드, 클래스, 상수 등의 이름으로, 식별자를 작성할 때는 아래 규칙을 따라야 한다.
- 문자, 언더바(_), $로 시작해야 함. 한글도 가능하고, 영문자는 대소문자 구분한다.
- 연산자 포함 X
- 자바 키워드 X (if, else 등)
- 길이에 제한이 없다.
식별자는 보통 다음 관례를 따른다.
- 변수와 메서드 : 모두 소문자로 표기하되, 복합 단어는 첫 단어 제외 나머지 단어의 첫 자만 대문자로 표기
int thisYear;
boolean isEmpty;
- 클래스와 인터페이스 : 각 단어의 첫 자만 대문자로 표기
public class HelloDemo {}
public interface MyRunnable {}
- 상수 : 모두 대문자로 표기하고, 복합 단어는 단어를 언더바(_)로 연결
final int NUMBER_ONE = 1;
final double PI = 3.141592;
변수란?
- 변수 : 데이터를 보관하는 기억 공간
- 데이터 타입 : 값과 값을 다룰 수 있는 연산의 집합
- 데이터 타입에 따라 가능한 값, 수행 가능한 명령, 데이터 의미, 저장 방식이 달라진다.

데이터 타입과 리터럴
데이터 타입은 크게 2가지 종류로 나뉜다. 2장에서 다루는 것은 기초 타입이다.
- 기초 타입 : 정수, 실수, 논리 값을 담는 형태
- 참조 타입 : 객체가 있는 주소를 담는 형태

자바의 기초 타입은 다음과 같다.
| 분류 | 기초 타입 | 기억 공간 크기 | 기본 값 | 값의 범위 |
| 정수 | byte | 8bit | 0 | -128 ~ 127 |
| short | 16bit | 0 | -32,768 ~ 32,767 | |
| int | 32bit | 0 | -2,147,483,648 ~ 2,147,483,647 | |
| long | 64bit | 0L | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | |
| 문자 | char | 16bit | null | 0 ~ 65,535 |
| 실수 | float | 32bit | 0.0f | 약 ±3.4 x 10⁻³⁸ ~ ±3.4 x 10⁺³⁸ |
| double | 64bit | 0.0d | 약 ±1.7 x 10⁻³⁰⁸ ~ ±1.7 x 10⁺³⁰⁸ | |
| 논리 | boolean | 8bit | false | true/false |
리터럴은 변하지 않는 고정된 데이터(값) 그 자체이다.

정수
정수는 기본적으로 int 타입이고 값의 범위에 따라 byte, short, long을 사용한다. 2진수, 8진수, 16진수 리터럴 정수이면 0b, 0, 0x라는 접두사를 두어야 한다. long 타입의 정수 리터럴은 L이나 l 접미사를 붙인다.
int fifteen = 15; // 10진수
byte fifteen = 0b1111; // 2진수 15
short fifteen = 017; // 8진수 15
int fifteen = 0xF; // 16진수 15
long lightSpeed = 300000L; // L로 long 타입임을 명시
실수
실수는 기본적으로 double 타입이고 값의 범위에 따라 float 타입을 사용한다. 실수 리터럴은 일반 표기법이나 지수 표기법으로 표현 가능하다. float 타입의 실수 리터럴은 F나 f 접미사를 붙인다.
double half = 0.5; // 일반 표기법
double half = 5E-1; // 지수 표기법으로 5x10⁻¹을 의미
float pi = 3.14159; // 오류
float pi = 3.14159F; // F로 float 타입임을 명시해야 오류가 없음!
문자
문자는 char 타입을 사용하고, 내부적으로는 2바이트 문자 처리 방식인 유니코드(Unicode)를 사용한다. 유니코드는 0~65,535 범위의 정수로 표현하기 때문에 char 타입은 정수 타입이라고도 볼 수있다. 문자 리터럴은 작은따옴표(’)로 하나의 문자를 감싸서 표현한다.
char c = 'A'; // 문자
char c = 65; // 일종의 정수 타입이므로 65 대입 가능
char c = '\u0041' // 유니코드 값으로 대입
char c = "A" // "A"는 문자가 아니라 문자열이므로 오류
논리
논리 값은 boolean 타입을 사용하고, true와 false로 표현한다.
boolean condition = true; // 논리 리터럴 true
변수 선언
변수를 사용하려면 컴파일러에 어떤 데이터 타입을 쓸건지 알려야 한다. 이것을 변수 선언이라고 한다.
- 변수 선언 : 변수의 데이터 타입을 지정하고 이름을 붙이는 것
- 변수 선언도 실행문이니 세미콜론(;)을 붙여야 함.
- 데이터 타입이 같은 변수는 쉼표(,)로 연결해 선언 가능하다.
- 변수 선언과 초기화는 동시에 할 수도 있다.
int weight; // 정수 타입의 weight 변수 선언
double x, y, z; // 3개의 변수를 ,로 연결해 선언
int weight = 65; // 변수 선언과 초기화를 동시에 함
상수
- 상수 : 변경할 수 없는 데이터를 담는 변수로 값을 한 번 저장하면 다른 값으로 변경 불가하다.
- final 키워드로 반드시 지정해야 되며, 상수 이름은 모두 대문자
- 선언과 초기화를 동시에 가능하다.
- 선언된 상수는 반드시 초기화한 후 사용해야 함.
final double PI; // 상수 선언
final double PI = 3.14159; // 상수 선언과 초기화
타입 변환
타입 변환은 데이터 타입을 바꾸는 연산으로 크게 2가지로 나뉜다.
- 자동 타입 변환 : 프로그램 실행 중에 자동으로 타입이 변환되는 것으로 연산식이나 실행문에서 서로 다른 데이터 타입이 나타날 때 발생한다.
double d1 = 5 * 3.14;// 정수 5 -> 실수 5.0로 자동 타입 변환
double d2 = 1; // 정수 1을 실수 1.0로 자동 타입 변환
- 강제 타입 변환 : 타입 변환 연산자를 사용해 강제로 타입을 변환하는 것이다. 타입 변환 연산자는 ‘(데이터타입)’ 형식이다.
float f = (float)3.14; // double의 3.14 -> float의 3.14로 변환
byte b = (byte)300; // int의 300 -> byte의 300으로 변환 (데이터 손실 발생)
byte x = (byte)3.14; // double의 3.14 -> int 3으로 변환 (소수는 손실됨)
double d = (double)3.14f; // float의 3.14 -> double 3.14로 변환
자바 기본 출력
자바에서 데이터를 출력할 때는 모두 System.out 객체와 연결해 다음 메서드들을 사용한다.
- println() : 내용을 출력한 후 줄바꿈
- print() : 내용을 출력한 후 줄바꿈 X
- printf() : 내용을 지정된 포맷을 사용해 출력
서식문자는 변수의 값을 출력하기 위해 정의되는 포맷(format) 문자를 의미합니다.
| 서식문자 | 의미 |
| %d | 정수 |
| %f | 실수 |
| %s | 문자열 |
| %c | 문자 |
printf() 추가 설명
printf()는 %로 시작하는 포맷을 여러 개 포함할 수 있는 포맷 명시자를 사용한다. 이때 포맷 개수와 포맷을 적용할 데이터 개수는 일치해야 한다.
// System.out.printf("포맷 명시자", 데이터, 데이터, ...);
System.out.printf("x = %d and pi = %f\n"< x, pi);
printf()는 기본적으로 오른쪽 정렬이지만, % 다음에 마이너스 표시(-)가 있으면 왼쪽 정렬로 출력한다.
System.out.printf("%5d", 12); // 결과 -> | 12|
System.out.printf("%-5d", 12); // 결과 -> |12 |
% 다음에 오는 숫자도 중요하다. %a.bf가 있다면 a는 출력 결과가 차지하는 최소 칸 수이고, b는 소수점 이하 자릿수이다.
System.out.printf("%7.3f", 123.1234); // |123.123|
System.out.printf("%3.3f", 1234.123); // |1234.123|
System.out.printf("%4.1f", 1.2345); // | 1.2|
자바 기본 입력
키보드로 데이터로 입력받을 때는 System.in 객체를 사용한다.
보통 Scanner 클래스를 통해 간접적으로 System.in 객체를 사용해 처리한다.
- 1. Scanner 클래스의 경로 이름을 컴파일러에 알린다.
import java.util.Scanner;
- 2. System.in 객체와 연결된 Scanner 객체를 생성한다.
Scanner in = new Scanner(System.in);
- 3. Scanner 클래스가 제공하는 다양한 메서드를 이용해 키보드로 데이터를 입력받는다.
int x = in.nextInt(); // 정수를 읽어 x 변수에 대입한다.
Scanner 클래스가 제공하는 데이터 입력 메서드는 다음과 같다
| 메서드 | 반환 타입 |
| next() | String |
| nextByte() | byte |
| nextShort() | short |
| nextInt() | int |
| nextLong() | long |
| nextFloat() | float |
| nextDouble() | double |
| nextLine() | String |
연산자와 연산식 개념
- 연산 : 데이터를 계산해 결과를 얻어 내는 과정
- 연산자 : 연산에 사용하는 표시나 기호(+, *, / 등)
- 피연산자 : 연산되는 데이터
- 연산식 : 피연산자와 연산자의 조합


연산자 종류
산술 연산자는 사칙 연산이나 나머지 계산에 사용한다.
| 연산자 | 설명 |
| + | 덧셈 |
| - | 뺄셈 |
| * | 곱셈 |
| / | 나눗셈 |
| % | 나머지 |
비교 연산자는 2개의 피연산자를 비교해 결과 값으로 논리 값인 true 또는 false를 반환한다.
| 연산자 | 사용 예 | 설명 |
| == | x == y | x와 y는 같은가? |
| != | x != y | x와 y는 다른가? |
| > | x > y | x가 y보다 큰가? |
| >= | x >= y | x가 y보다 크거나 같은가? |
| < | x < y | x는 y보다 작은가? |
| <= | x <= y | x는 y보다 작거나 같은가? |
논리 연산자는 피연산자의 조건을 결합해 true와 false를 반환함
| 연산자 | 사용 예 | 설명 |
| && | a && b | a,b 둘다 true이면 true |
| || | a || b | a 또는 b가 true -> true |
| ! | !a | a의 반대 |
| ^ | a ^ b | a와 b가 서로 같으면 false |
&&와 ||는 기본적으로 쇼트서킷을 사용한다. &와 |는 &&와 ||의 기능과 같지만 쇼트서킷을 수행하지 않는다.
- 쇼트서킷 : 논리 연산자의 연결된 모든 조건식을 수행하지 않고, 필요한 조건식만 수행하는 것이다.
int x = 0, y = 1;
System.out.println((x < 1) || (y-- < 1)); // true
System.out.println("x = " + x + ", y = " + y); // x = 0, y = 1
System.out.println((x < 1) | (y-- < 1)); // true
System.out.println("x = " + x + ", y = " + y); // x = 0, y = 0
비트 연산자는 각 비트 단위로 논리 연산을 하는 연산자이다.
| 연산자 | 설명 |
| & | 두 비트가 1이면 1, 아니면 0 |
| | | 두 비트 중 하나라도 1이면 1, 아니면 0 |
| ^ | 두 비트가 서로 다르면 1, 동일하면 0 |
| ~ | 1을 0으로, 0을 1로 바꿈 |
시프트 연산자는 비트를 이동시키는 연산자이다.
| 연산자 | 설명 |
| << | a의 모든 비트가 왼쪽으로 b만큼 이동, 이동할때마다 최하위 비트를 0으로 채움 |
| >> | a의 모든 비트가 오른쪽으로 b만큼 이동, 이동할때마다 최상위 비트와 동일한 비트로 채움 |
| >>> | a의 모든 비트가 오른쪽으로 b만큼 이동, 이동할때마다 최상위 비트를 0으로 채움 |
대입 연산자는 오른쪽의 연산식의 결과 값을 왼쪽 변수에 저장한다.
복합 대입 연산자는 연산과 대입을 한 번에 수행해 간결하게 줄인 연산자이다.
| 일반 표현 | 복합 대입 연산자 |
| a = a + b | a += b |
| a = a - b | a -= b |
| a = a * b | a *= b |
| a = a / b | a /= b |
| a = a % b | a %= b |
| ... | ... |
부호 연산자는 피연산자의 부호를 유지하거나 반전하는 연산자이다.
| 연산자 | 설명 |
| + | 부호 유지 |
| - | 부호 반전 |
증감 연산자는 변수 값을 1 증가하거나 감소하는 연산자로 변수의 위치에 따라 의미가 달라진다.
| 연산자 | 설명 |
| ++x | 연산 전에 x값 1증가 |
| --x | 연산 전에 x값 1감소 |
| x++ | 연산 후에 x값 1증가 |
| x-- | 연산 후에 x값 1감소 |
여기서 짚고 넘어갈 부분은 x++, x--는 해당 피연산자가 사용되는 직후에 증감 또는 감소가 된다.
x = 5;
System.out.println(x++ + x-- + x); // 5 + 6 + 5 = 16
System.out.println(++x + --x); // 6 + 5 = 11
조건 연산자(?:)는 "조건식 ? 연산식 : 연산식2" 형태로 사용하며, 조건식이 true이면 결과값은 연산식1의 값, false이면 결과값은 연산식2의 값이 된다. 즉, true/false에 따라 결과가 달라진다.
int x = 1;
int y;
System.out.println((x == 1) ? 10 : 20); // (x == 1)가 true이므로 10 출력
System.out.println((x > 1) ? x++ : x + 20); // (x > 1)가 false이므로 21 출력
연산자 우선순위
연산자 우선순위는 단항 연산자 > 이항 연산자 > 삼항 연산자 순이고, 이항 연산자끼리는 산술 > 시프트 > 비교 > 비트 > 조건순이다.

'공부 > Java' 카테고리의 다른 글
| [Java] 3. 제어문과 메서드 (0) | 2026.06.24 |
|---|---|
| [Java] 1. 자바 시작하기 (0) | 2026.06.16 |