안녕하세요! 지난 시간에는 자바의 세계에 첫 발을 내딛는 시간을 가졌었죠? 오늘은 자바 프로그래밍의 기본 뼈대를 이루는 핵심 문법 요소들을 자세히 알아보는 시간을 갖겠습니다. 마치 집을 지을 때 튼튼한 기초 공사가 필수적인 것처럼, 프로그래밍에서도 기본 문법을 탄탄하게 다지는 것은 매우 중요합니다.
이번 포스팅에서는 변수와 자료형, 다양한 연산자, 흐름을 제어하는 제어문, 그리고 데이터를 효율적으로 관리하는 배열까지, 자바 코딩의 핵심 내용을 꼼꼼하게 살펴보고, 실습 예제를 통해 기본 문법 활용 능력을 키워 드릴게요. 자, 그럼 함께 자바 문법의 세계로 풍덩 빠져볼까요? 😄
📦 변수와 자료형: 데이터 보관 상자 만들기
변수 (Variable) 는 데이터를 저장하는 메모리 공간의 이름입니다. 마치 택배 상자에 이름을 붙여서 물건을 보관하는 것과 비슷하다고 생각하면 이해하기 쉬울 거예요. 프로그램은 변수를 사용하여 데이터를 저장하고, 필요할 때 저장된 데이터를 꺼내서 사용합니다.
자바에서는 변수를 사용하기 전에 반드시 자료형 (Data Type) 을 선언해야 합니다. 자료형은 변수에 저장할 데이터의 종류 (정수, 실수, 문자 등) 와 크기를 지정하는 것입니다. 자바의 자료형은 크게 기본 자료형 (Primitive Type) 과 참조 자료형 (Reference Type) 으로 나뉩니다.
🧱 기본 자료형 (Primitive Type)
기본 자료형은 실제 값을 직접 저장하는 자료형입니다. 자바는 다음과 같은 8가지 기본 자료형을 제공합니다.
자료형 | 크기 (bit) | 범위 | 설명 | 예시 |
byte | 8 | -128 ~ 127 | 정수형 (바이트) | byte b = 10; |
short | 16 | -32,768 ~ 32,767 | 정수형 (짧은 정수) | short s = 1000; |
int | 32 | -2,147,483,648 ~ 2,147,483,647 | 정수형 (기본 정수) | int i = 100000; |
long | 64 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 정수형 (긴 정수) | long l = 10000000000L; |
float | 32 | ±1.4*10^-45 ~ ±3.4*10^38 | 실수형 (단정밀도 부동소수점) | float f = 3.14f; |
double | 64 | ±4.9*10^-324 ~ ±1.8*10^308 | 실수형 (배정밀도 부동소수점) | double d = 3.141592653589793; |
char | 16 | U+0000 ~ U+FFFF (유니코드 문자) | 문자형 | char c = 'A'; |
boolean | 1 | true 또는 false | 논리형 | boolean bool = true; |
- 정수형: byte, short, int, long 은 정수를 저장하는 자료형입니다. 크기에 따라 저장할 수 있는 정수의 범위가 다르며, 일반적으로 int 형을 가장 많이 사용합니다. 아주 큰 정수를 다뤄야 할 때는 long 형을 사용합니다. long 타입 리터럴을 표기할 때는 숫자 뒤에 L 또는 l 을 붙입니다. (예: 100L)
- 실수형: float, double 은 실수를 저장하는 자료형입니다. double 형이 float 형보다 더 정밀한 실수를 표현할 수 있으며, 일반적으로 double 형을 많이 사용합니다. float 타입 리터럴을 표기할 때는 숫자 뒤에 f 또는 F 를 붙입니다. (예: 3.14f)
- 문자형: char 는 하나의 문자를 저장하는 자료형입니다. 작은따옴표 (' ') 로 묶어서 표현하며, 유니코드 문자를 저장할 수 있습니다. (예: 'A', '가', '%')
- 논리형: boolean 은 참 (true) 또는 거짓 (false) 값 중 하나를 저장하는 자료형입니다. 조건 판단, 프로그램 흐름 제어 등에 사용됩니다.
📦 참조 자료형 (Reference Type)
참조 자료형은 객체의 주소 값 (참조 값) 을 저장하는 자료형입니다. 기본 자료형 외의 모든 자료형은 참조 자료형에 해당하며, 대표적으로 클래스 (Class), 인터페이스 (Interface), 배열 (Array) 등이 있습니다. 참조 자료형 변수는 실제 객체가 저장된 메모리 주소를 가리키며, 객체를 통해 데이터에 접근하고 기능을 사용할 수 있습니다.
문자열 (String) 도 참조 자료형에 해당하며, 큰따옴표 (" ") 로 묶어서 표현합니다. (예: "Hello, Java!")
✍️ 변수 선언 및 초기화
변수를 사용하기 위해서는 먼저 선언해야 합니다. 변수 선언은 다음과 같은 형식으로 작성합니다.
자료형 변수이름;
예를 들어, 정수형 변수 age 를 선언하려면 다음과 같이 작성합니다.
int age;
변수를 선언하면서 초기값을 할당하는 것을 초기화 (Initialization) 라고 합니다. 변수 선언과 초기화를 동시에 할 수도 있습니다.
자료형 변수이름 = 초기값;
예를 들어, 정수형 변수 age 를 선언하고 초기값으로 25를 할당하려면 다음과 같이 작성합니다.
int age = 25;
변수의 이름은 식별자 (Identifier) 라고 하며, 다음과 같은 규칙을 따라야 합니다.
- 문자, 숫자, _, $ 기호만 사용할 수 있습니다.
- 숫자로 시작할 수 없습니다.
- 대소문자를 구분합니다. (예: age 와 Age 는 다른 변수입니다.)
- 자바 예약어 (예: int, class, public 등) 는 사용할 수 없습니다.
변수 이름은 의미를 명확하게 나타낼 수 있도록 짓는 것이 좋습니다. (예: 나이를 저장하는 변수는 age, 이름을 저장하는 변수는 name 등)
🧮 연산자: 값들을 요리조리 계산하기
연산자 (Operator) 는 값 (피연산자) 에 대해 특정 연산을 수행하는 기호입니다. 자바는 다양한 종류의 연산자를 제공하며, 연산자를 통해 값들을 계산하고 조작할 수 있습니다.
🔢 산술 연산자 (Arithmetic Operators)
산술 연산자는 사칙연산과 나머지 연산을 수행하는 연산자입니다.
연산자 | 설명 | 예시 | 결과 |
+ | 덧셈 | 5 + 3 | 8 |
- | 뺄셈 | 5 - 3 | 2 |
* | 곱셈 | 5 * 3 | 15 |
/ | 나눗셈 (몫) | 5 / 3 | 1 |
% | 나눗셈 (나머지) | 5 % 3 | 2 |
++ | 1 증가 | int x = 5; x++; | x 는 6 |
-- | 1 감소 | int x = 5; x--; | x 는 4 |
- +, -, *, /, % 는 이항 연산자 (피연산자가 2개) 이며, 사칙연산 및 나머지 연산을 수행합니다.
- ++, -- 는 단항 연산자 (피연산자가 1개) 이며, 변수의 값을 1씩 증가 또는 감소시킵니다. ++ 또는 -- 연산자를 변수 앞에 붙이는 전위형 (++x, --x) 과 변수 뒤에 붙이는 후위형 (x++, x--) 이 있습니다. 전위형은 변수 값을 먼저 증가/감소시킨 후 연산에 참여하고, 후위형은 현재 변수 값을 먼저 연산에 참여시킨 후 변수 값을 증가/감소시킵니다.
⚖️ 비교 연산자 (Comparison Operators)
비교 연산자는 두 값의 크기를 비교하는 연산자입니다. 비교 연산의 결과는 항상 boolean 값 (true 또는 false) 입니다.
== | 같다 | 5 == 3 | false |
!= | 다르다 | 5 != 3 | true |
> | 크다 | 5 > 3 | true |
< | 작다 | 5 < 3 | false |
>= | 크거나 같다 | 5 >= 3 | true |
<= | 작거나 같다 | 5 <= 3 | false |
🧮 논리 연산자 (Logical Operators)
논리 연산자는 논리 AND, 논리 OR, 논리 NOT 연산을 수행하는 연산자입니다. 피연산자는 boolean 값이며, 연산 결과 또한 boolean 값입니다.
&& | 논리 AND | true && false | false |
`\ | \ | ` | 논리 OR |
! | 논리 NOT | !true | false |
- && (논리 AND) : 두 피연산자가 모두 true 일 때만 true 를 반환하고, 나머지는 false 를 반환합니다.
- \|\| (논리 OR) : 두 피연산자 중 하나라도 true 이면 true 를 반환하고, 모두 false 일 때만 false 를 반환합니다.
- ! (논리 NOT) : 피연산자의 논리값을 반전시킵니다. true 는 false 로, false 는 true 로 바꿉니다.
🎛️ 비트 연산자 (Bitwise Operators)
비트 연산자는 2진수 비트 단위로 연산을 수행하는 연산자입니다. 주로 하드웨어 제어, 암호화, 이미지 처리 등에서 사용되며, 일반적인 애플리케이션 개발에서는 자주 사용되지는 않습니다.
연산자 | 설명 | 예시 | 결과 (10진수) | 결과 (2진수) |
& | 비트 AND | 5 & 3 | 1 | 0001 |
`\ | ` | 비트 OR | `5 \ | 3` |
^ | 비트 XOR | 5 ^ 3 | 6 | 0110 |
~ | 비트 NOT | ~5 | -6 | ... |
<< | 왼쪽 시프트 | 5 << 1 | 10 | 1010 |
>> | 오른쪽 시프트 | 5 >> 1 | 2 | 0010 |
>>> | 부호 없는 오른쪽 시프트 | -5 >>> 1 | 2147483645 | ... |
- 비트 연산자는 정수형 자료형 (byte, short, int, long, char) 에만 사용할 수 있습니다.
- & (비트 AND), \| (비트 OR), ^ (비트 XOR), ~ (비트 NOT) 는 각 비트 단위로 논리 연산을 수행합니다.
- << (왼쪽 시프트) 는 비트를 왼쪽으로 이동시키고, 빈자리는 0으로 채웁니다. 왼쪽 시프트는 2의 거듭제곱을 곱하는 효과가 있습니다. (예: x << n 은 x * 2^n 과 같습니다.)
- >> (오른쪽 시프트) 는 비트를 오른쪽으로 이동시키고, 부호 비트를 유지합니다. 오른쪽 시프트는 2의 거듭제곱으로 나누는 효과가 있습니다. (예: x >> n 은 x / 2^n 과 같습니다.)
- >>> (부호 없는 오른쪽 시프트) 는 비트를 오른쪽으로 이동시키고, 빈자리는 항상 0으로 채웁니다. 음수의 경우 >> 와 결과가 다를 수 있습니다.
✍️ 연산자 우선순위
하나의 수식에 여러 연산자가 사용될 경우, 연산자 우선순위에 따라 연산 순서가 결정됩니다. 일반적으로 산술 연산자 > 비교 연산자 > 논리 연산자 > 대입 연산자 순으로 우선순위가 높습니다. 괄호 () 를 사용하면 연산자 우선순위를 명시적으로 조절할 수 있습니다. 헷갈릴 때는 괄호를 적절히 사용하여 연산 순서를 명확하게 하는 것이 좋습니다.
🚦 제어문: 프로그램 흐름을 내 마음대로
제어문 (Control Statement) 은 프로그램의 실행 흐름을 조건에 따라 분기하거나 반복하도록 제어하는 문장입니다. 자바는 조건문 과 반복문 두 가지 종류의 제어문을 제공합니다.
conditional statements - if, switch 조건문
조건문 (Conditional Statement) 은 주어진 조건식의 결과에 따라 실행할 코드 블록을 선택적으로 실행하는 문장입니다. 자바는 if 문과 switch 문 두 가지 조건문을 제공합니다.
📌 if 문
if 문은 조건식이 참 (true) 일 경우 특정 코드 블록을 실행하는 기본적인 조건문입니다. if-else 문, if-else if-else 문 등 다양한 형태로 사용할 수 있습니다.
- if 문:조건식이 true 이면 {} 안의 코드 블록이 실행되고, false 이면 코드 블록을 건너뜁니다.
-
if (조건식) { // 조건식이 참일 경우 실행되는 코드 블록 }
- if-else 문:조건식이 true 이면 if 블록의 코드 실행, false 이면 else 블록의 코드 실행.
-
if (조건식) { // 조건식이 참일 경우 실행되는 코드 블록 } else { // 조건식이 거짓일 경우 실행되는 코드 블록 }
- if-else if-else 문:여러 개의 조건을 순차적으로 검사하고, 참인 조건에 해당하는 코드 블록을 실행합니다. 모든 조건이 거짓이면 else 블록의 코드가 실행됩니다. else if 절은 여러 개를 사용할 수 있으며, else 절은 생략 가능합니다.
-
if (조건식1) { // 조건식1이 참일 경우 실행되는 코드 블록 } else if (조건식2) { // 조건식1이 거짓이고 조건식2가 참일 경우 실행되는 코드 블록 } else if (조건식3) { // 조건식1, 2가 거짓이고 조건식3이 참일 경우 실행되는 코드 블록 } else { // 모든 조건식이 거짓일 경우 실행되는 코드 블록 }
📌 switch 문
switch 문은 변수의 값에 따라 실행할 코드 블록을 선택하는 조건문입니다. case 레이블과 break 문을 사용하여 값을 비교하고 분기합니다.
switch (변수) {
case 값1:
// 변수 값이 값1과 같을 경우 실행되는 코드 블록
break; // break 문은 switch 문을 빠져나오도록 합니다.
case 값2:
// 변수 값이 값2와 같을 경우 실행되는 코드 블록
break;
case 값3:
// 변수 값이 값3과 같을 경우 실행되는 코드 블록
break;
default:
// 변수 값이 어떤 case 값과도 일치하지 않을 경우 실행되는 코드 블록
break; // default 절의 break 문은 생략 가능합니다.
}
- switch 문은 변수 값을 case 레이블의 값과 순차적으로 비교합니다. 일치하는 case 레이블을 찾으면 해당 코드 블록부터 break 문 또는 switch 문 끝까지 코드를 실행합니다.
- break 문은 switch 문을 빠져나오도록 합니다. break 문이 없으면, 일치하는 case 레이블 이후의 모든 case 블록의 코드가 순차적으로 실행됩니다. (fall-through)
- default 절은 변수 값이 어떤 case 값과도 일치하지 않을 경우 실행되는 코드 블록입니다. default 절은 생략 가능합니다.
- switch 문은 변수 타입으로 byte, short, char, int, enum, String 만 사용할 수 있습니다. (JDK 7부터 String 타입 사용 가능)
loop statements - for, while, do-while 반복문
반복문 (Loop Statement) 은 특정 코드 블록을 조건이 만족하는 동안 반복적으로 실행하는 문장입니다. 자바는 for 문, while 문, do-while 문 세 가지 반복문을 제공합니다.
📌 for 문
for 문은 정해진 횟수만큼 반복할 때 주로 사용하는 반복문입니다. 초기화, 조건식, 증감식을 사용하여 반복 횟수를 제어합니다.
for (초기화; 조건식; 증감식) {
// 조건식이 참인 동안 반복 실행되는 코드 블록
}
- 초기화 (Initialization): 반복문 시작 시 딱 한 번 실행됩니다. 반복 변수를 초기화하는 역할을 합니다. (예: int i = 0;)
- 조건식 (Condition): 매 반복마다 조건식을 검사합니다. 조건식이 true 이면 반복 블록 실행, false 이면 반복문 종료.
- 증감식 (Increment/Decrement): 반복 블록 실행 후 매번 실행됩니다. 반복 변수 값을 증가 또는 감소시켜, 반복 횟수를 제어합니다. (예: i++)
for 문은 초기화, 조건식, 증감식을 생략할 수 있지만, 일반적으로 생략하지 않고 명시적으로 작성하는 것이 코드 가독성을 높이는 데 좋습니다.
📌 while 문
while 문은 조건식이 참인 동안 계속해서 반복하는 반복문입니다. 반복 횟수가 불명확하거나, 특정 조건이 만족될 때까지 반복해야 할 때 사용합니다.
while (조건식) {
// 조건식이 참인 동안 반복 실행되는 코드 블록
}
while 문은 조건식만 주어지고, 초기화 및 증감식은 반복문 외부에서 처리해야 합니다. while 문 내부에서 조건식의 결과를 변경하는 코드가 없으면, 무한 루프에 빠질 수 있으므로 주의해야 합니다.
📌 do-while 문
do-while 문은 while 문과 유사하지만, 반복 블록을 최소 한 번은 실행한다는 차이점이 있습니다. 조건식을 반복 블록 실행 후 검사합니다.
do {
// 최소 한 번 실행되고, 조건식이 참인 동안 반복 실행되는 코드 블록
} while (조건식);
do-while 문은 사용자 입력 유효성 검사, 특정 작업을 최소 한 번 실행해야 하는 경우 등에 유용하게 사용됩니다. while 문과 마찬가지로 무한 루프에 빠지지 않도록 주의해야 합니다.
💥 break 문과 continue 문
break 문과 continue 문은 반복문 내부에서 반복 흐름을 제어하는 데 사용되는 키워드입니다.
- break 문: 반복문 (for, while, do-while) 또는 switch 문을 즉시 빠져나갈 때 사용합니다. 반복문 중간에 특정 조건을 만족하면 반복을 중단하고 반복문 외부로 나가고 싶을 때 사용합니다.
- continue 문: 반복문 (for, while, do-while) 의 현재 반복을 건너뛰고 다음 반복으로 진행할 때 사용합니다. 반복문 내부에서 특정 조건을 만족하는 경우, 현재 반복 블록의 남은 코드를 실행하지 않고 다음 반복으로 넘어가고 싶을 때 사용합니다.
🧰 배열: 여러 데이터를 묶어서 관리하기
배열 (Array) 은 같은 자료형의 여러 데이터를 하나의 변수 이름으로 묶어서 관리하는 자료 구조입니다. 배열을 사용하면 많은 양의 데이터를 효율적으로 저장하고 관리할 수 있으며, 인덱스 (Index) 를 사용하여 각 데이터에 접근할 수 있습니다.
🧱 1차원 배열
1차원 배열은 데이터를 직선 형태로 나열한 배열입니다. 마치 기차처럼, 데이터들이 순서대로 연결되어 있다고 생각하면 됩니다.
- 배열 선언:예: int[] numbers; (정수형 배열 numbers 선언)
-
자료형[] 배열이름; // 또는 자료형 배열이름[]; (C/C++ 스타일)
- 배열 생성: 배열을 선언만 해서는 사용할 수 없고, 생성해야 메모리 공간이 할당됩니다. new 연산자와 배열 크기를 사용하여 배열을 생성합니다.예: numbers = new int[5]; (크기가 5인 정수형 배열 numbers 생성)
-
배열이름 = new 자료형[배열크기];
- 배열 선언 및 생성 (동시):예: int[] numbers = new int[5];
-
자료형[] 배열이름 = new 자료형[배열크기];
- 배열 초기화: 배열 생성 후 각 요소에 초기값을 할당할 수 있습니다.예: numbers[0] = 10; (배열 numbers 의 0번 인덱스 요소에 10을 할당)
-
배열이름[인덱스] = 값;
- 배열 선언, 생성 및 초기화 (동시, 리터럴 방식): 배열을 선언, 생성하면서 초기값을 바로 할당할 수도 있습니다.예: int[] numbers = {10, 20, 30, 40, 50}; (크기가 5이고 초기값이 {10, 20, 30, 40, 50} 인 정수형 배열 numbers 생성 및 초기화)
-
자료형[] 배열이름 = {값1, 값2, 값3, ...};
- 배열 요소 접근: 배열 요소에 접근하려면 인덱스를 사용합니다. 인덱스는 0부터 시작하며, 마지막 요소의 인덱스는 배열 크기 - 1 입니다.예: int firstElement = numbers[0]; (배열 numbers 의 0번 인덱스 요소 값을 firstElement 변수에 저장)
-
배열이름[인덱스]
- 배열 길이: 배열의 크기 (요소 개수) 를 얻으려면 배열이름.length 속성을 사용합니다.
-
int arrayLength = numbers.length; // arrayLength는 5가 됩니다.
🧱 다차원 배열
다차원 배열은 2차원, 3차원 등 평면 또는 공간 형태로 데이터를 나열한 배열입니다. 2차원 배열은 마치 테이블 (행과 열) 과 같은 형태입니다.
- 2차원 배열 선언:예: int[][] matrix; (2차원 정수형 배열 matrix 선언)
-
자료형[][] 배열이름;
- 2차원 배열 생성: 2차원 배열은 행 (row) 과 열 (column) 크기를 지정하여 생성합니다.예: matrix = new int[3][4]; (3행 4열의 2차원 정수형 배열 matrix 생성)
-
배열이름 = new 자료형[행크기][열크기];
- 2차원 배열 선언, 생성 및 초기화 (동시, 리터럴 방식):예:
-
int[][] matrix = { {1, 2, 3, 4}, // 1행 {5, 6, 7, 8}, // 2행 {9, 10, 11, 12} // 3행 };
-
자료형[][] 배열이름 = { {값1, 값2, 값3, ...}, // 1행 {값1, 값2, 값3, ...}, // 2행 {값1, 값2, 값3, ...} // 3행 ... };
- 2차원 배열 요소 접근: 2차원 배열 요소에 접근하려면 행 인덱스와 열 인덱스를 모두 사용합니다.예: int element = matrix[1][2]; (배열 matrix 의 2행 3열 요소 값을 element 변수에 저장)
-
배열이름[행인덱스][열인덱스]
- 다차원 배열 (3차원 이상): 3차원 이상의 배열도 2차원 배열과 유사한 방식으로 선언, 생성, 초기화 및 요소 접근이 가능합니다. 차원 수만큼 [] 를 추가하고, 각 차원의 크기를 지정하면 됩니다.
☕ 클래스와 객체 기본 개념 맛보기
클래스 (Class) 와 객체 (Object) 는 객체 지향 프로그래밍 (OOP) 의 핵심 개념입니다. 자바는 객체 지향 언어이므로, 클래스와 객체를 이해하는 것은 매우 중요합니다.
- 클래스: 객체를 만들기 위한 설계도 또는 템플릿 입니다. 클래스는 객체의 속성 (데이터) 과 기능 (메소드) 을 정의합니다. 마치 붕어빵 틀과 같습니다.
- 객체: 클래스를 기반으로 실제로 생성된 실체 입니다. 객체는 클래스에 정의된 속성과 기능을 가지며, 메모리에 할당됩니다. 마치 붕어빵 틀에서 찍혀 나온 붕어빵과 같습니다.
클래스와 객체에 대한 자세한 내용은 앞으로 더 자세히 배우게 될 예정입니다. 이번 시간에는 클래스는 설계도, 객체는 실체 라는 기본적인 개념만 이해하고 넘어가도록 하겠습니다.
✅ 결론: 기본 문법, 자바 프로그래밍의 튼튼한 뿌리
이번 포스팅에서는 자바 프로그래밍의 기본적인 문법 요소들을 자세히 알아보았습니다. 변수와 자료형을 통해 데이터를 저장하고 관리하는 방법, 연산자를 사용하여 값들을 계산하고 조작하는 방법, 제어문을 통해 프로그램의 흐름을 제어하는 방법, 그리고 배열을 사용하여 여러 데이터를 효율적으로 묶어서 관리하는 방법까지, 자바 코딩의 기본 뼈대를 세우는 데 필요한 핵심 내용들을 익히셨습니다.
다음 시간에는 클래스와 객체에 대해 더 깊이 있게 알아보면서, 본격적인 객체 지향 프로그래밍의 세계로 나아갈 준비를 하겠습니다. 오늘 배운 내용들을 꼼꼼히 복습하고, 다양한 예제 코드를 실습해 보면서 자바 기본 문법을 완벽하게 마스터해 보세요! 💪
'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA]자바 컬렉션 프레임워크: 데이터 관리, 이제 효율적으로! 🧰 (8) | 2025.02.28 |
---|---|
[JAVA]자바의 심장을 꿰뚫다! 객체 지향 프로그래밍 (OOP) 완벽 정복 🚀 (9) | 2025.02.27 |
[JAVA]자바의 세계로 첫 발을 내딛다! 자바 시작하기 🚀 (7) | 2025.02.27 |
[JAVA]자바 추상 클래스와 인터페이스 완벽 분석: 선택 가이드와 활용법 🚀 (8) | 2025.02.26 |
[SpringBoot]스프링부트 성능 최적화🚀🚀 (0) | 2024.12.23 |