본문 바로가기
공부/Java

[Java] 2. 자바 프로그램 구조와 기초 문법 익히기

by kqe123 2026. 6. 17.

 

 

※ 이 글은 쉽게 배우는 자바 프로그래밍(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 타입을 사용하고, truefalse로 표현한다.

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