자바(Java)는 전 세계에서 가장 널리 사용되는 프로그래밍 언어 중 하나 입니다. 특히 기업용 시스템, 안드로이드 앱, 백엔드 서버 등 거의 모든 분야에서 활용되죠. 이번 글에서는 비전공자, 노베이스 입문자, 무경력 개발자가 꼭 알아야 할 자바의 기본 문법과 핵심 개념을 예제와 함께 완전히 쉽게 정리했습니다.

변수(Variable) — 값을 저장하는 이름표
한줄 정의 : 값을 저장하는 이름 붙은 공간.
쉽게 말해 변수는 메모리의 ‘박스’에 이름표를 붙인 것과 같아요.
int a = 10; // a라는 박스에 '정수(int)' 형태의 10 이라는 값을 저장
String s = "제로"; // s는 '문자열(String)' 형태의 "제로" 라는 값이 저장된 주소
✅ 기본형(Primitive)
Java에서는 변수를 만들 때, 어떤 종류의 데이터(자료형) 를 담을지 미리 정해줘야 합니다. 아래 표를 참고하세요.
| 자료형 | 설명 | 사용 예시 | 메모리 크기 |
|---|---|---|---|
int | 정수형(소수점 없는 수) | int age = 25; | 4byte |
double | 실수형(소수점 있는 수) | double pi = 3.14; | 8byte |
boolean | 참/거짓 저장 | boolean isLogin = true; | 1byte |
char | 한 글자 저장 (작은따옴표 ' ' 사용) | char grade = 'A'; | 2byte |
long | 큰 정수형 | long distance = 10000000000L; | 8byte |
float | 실수형(소수점), double보다 작음 | float temperature = 36.5f; | 4byte |
byte | 아주 작은 정수(파일 크기, 네트워크 데이터 전송에 사용) | byte b = 100; | 1byte |
short | 작은 정수형 | short s = 32000; | 2byte |
Tip) 숫자는 기본적으로 int, 소수점은 double 로 인식합니다. 그래서 float을 사용할 때는 꼭 f를 붙여야 합니다 (float a = 3.14f;).
✅ 참조형(Reference)String, 배열, 객체 등 ‘주소값(참조)’을 저장하는 변수. 참조형 이라는 말은 위의 예시처럼 기본형이 아니라 실제 데이터는 메모리의 ‘어딘가’를 가리키고 있다는 뜻입니다.
예제 : == 와 .equals() 의 차이
public class StringTest {
public static void main(String[] args) {
String a = "Hello";
String b = "Hello";
String c = new String("Hello");
System.out.println(a == b); // true
System.out.println(a == c); // false
System.out.println(a.equals(c)); // true
}
}
💬 해설
| 코드 | 의미 | 결과 | 이유 |
|---|---|---|---|
a == b | 메모리 주소 비교 | true | 문자열 리터럴은 같은 주소를 공유 |
a == c | 메모리 주소 비교 | false | new 키워드는 새로운 주소 생성 |
a.equals(c) | 내용(문자열) 비교 | true | 문자열의 실제 내용 비교 |
Tip) 실무에서 문자열 비교 시 ==를 쓰면 주소가 다를 때 버그가 생길 수 있습니다. 따라서 항상 .equals() 를 사용해야 합니다.
✅ 정보처리기사 시험 및 실제 실무 포인트
String은 참조형이다. (기본형 아님)==: 주소(참조값) 비교.equals(): 문자열의 내용 비교new String()으로 만든 문자열은 새로운 메모리 공간을 차지한다.
Tip) String은 참조형 → == 은 주소 비교, .equals()는 내용 비교.
Tip) 기본형 변수의 초기값 문제는 정보처리기사 실기에서도 자주 등장합니다.
클래스(Class)와 객체(Object)
한줄 정의 : 클래스는 설계도, 객체는 설계도로 만든 실체.
쉽게 말해 붕어빵틀이 클래스, 붕어빵이 객체예요.
class Person {
String name; // 속성
void sayHello() { // 행동
System.out.println("안녕, " + name);
}
}
Person p = new Person(); // 객체 생성
p.name = "제로";
p.sayHello(); // 출력: 안녕, 제로
✅ 포인트
new로 만들어진 객체는 힙(Heap)에 저장됩니다.- 지역변수는 스택(Stack)에 저장되므로, 실행 순서를 이해하면 흐름이 보입니다.
상속(Inheritance)
한줄 정의 : 부모 클래스의 기능을 자식이 물려받는 것.
쉽게 말해 “공통 기능은 위로 올려서 재사용하는 것”.
class Animal {
void eat() { System.out.println("먹는다"); }
}
class Dog extends Animal {
void bark() { System.out.println("멍멍!"); }
}
Dog d = new Dog();
d.eat(); // 부모 기능 사용
d.bark(); // 자식 기능 사용
✅ 포인트
extends로 상속을 표현합니다.- 상속을 이해하면 “다형성(Polymorphism)” 개념으로 이어집니다.
- 시험에서 “부모형 참조변수로 자식객체를 참조할 때 호출 결과”를 자주 묻습니다.
오버라이딩(Overriding) vs 오버로딩(Overloading)
| 구분 | 오버라이딩 | 오버로딩 |
|---|---|---|
| 의미 | 부모의 메서드를 자식이 다시 정의 | 같은 이름의 메서드를 여러 버전으로 정의 |
| 시점 | 런타임(실행 중 결정) | 컴파일타임(코드 작성 시 결정) |
| 키워드 | @Override | 없음 |
class Parent {
void f() { System.out.println("P"); }
}
class Child extends Parent {
@Override
void f() { System.out.println("C"); } // 오버라이딩
void f(int x) { System.out.println(x); } // 오버로딩
}
✅ 포인트
- 오버라이딩은 “실행 시점의 객체 타입” 기준.
- 오버로딩은 “매개변수 형태” 기준으로 메서드가 구분됩니다.
static — 모든 객체가 공유하는 변수
한줄 정의 : 클래스 단위로 공유되는 변수나 메서드.
쉽게 말해 “모든 인스턴스가 함께 쓰는 공용 게시판”.
class Counter {
static int count = 0; // 모든 객체가 공유
Counter() { count++; }
}
new Counter();
new Counter();
System.out.println(Counter.count); // 출력: 2
✅ 포인트
- static은 프로그램 시작 시 한 번만 메모리에 올라갑니다.
- 정보처리기사 실기에서는 “static 변수의 값이 몇 번 누적되느냐”를 자주 묻습니다.
[실전 예제] 정보처리기사 실기 기출형 문제
다음은 “상속 + 오버라이딩 + 필드 접근” 이 함께 나오는 대표적인 정보처리기사 실기의 Java 코드형 문제입니다.
public class Main {
public static void main(String[] args) {
Base a = new Derivate();
Derivate b = new Derivate();
System.out.print(a.getX() + a.x + b.getX() + b.x);
}
}
class Base {
int x = 3;
int getX() {
return x * 2;
}
}
class Derivate extends Base {
int x = 7;
int getX() {
return x * 3;
}
}
[풀이]
1️⃣ a의 타입은 Base, 실제 객체는 Derivate.
2️⃣ a.getX() → 실제 객체 기준이므로 Derivate.getX() 호출 → 7 * 3 = 21
3️⃣ a.x → 변수는 컴파일 시점 기준(Base.x) → 3
4️⃣ b.getX() → Derivate.getX() → 7 * 3 = 21
5️⃣ b.x → Derivate.x → 7
👉 최종 출력값 : 52
핵심 요약 : 메서드는 “실제 객체 타입” 기준으로 실행 (동적 바인딩) / 필드는 “참조 변수 타입” 기준으로 접근 (정적 바인딩)
[자주 나오는 연습 문제]
✅ String s1 = "a"; String s2 = new String("a"); System.out.println(s1==s2);
→ 결과 : false (==은 주소 비교)
✅ int[] arr = new int[3]; System.out.println(arr[0]);
→ 결과 : 0 (기본값)
✅ static 변수는 언제 공유될까?
→ 클래스가 로드될 때 한 번만 메모리에 생성됨.
참고 자료
- Oracle Java 공식 튜토리얼: https://docs.oracle.com/javase/tutorial/
- W3Schools Java Tutorial: https://www.w3schools.com/java/
- Baeldung Java Basics: https://www.baeldung.com/java
이 글은 비전공자 개발자 제로의 성장 블로그 | 제로투데브 시리즈 중 ‘Java 시리즈 2편’입니다.
👉 1편이 궁금하다면? [Java] Java에 대해 알아보자.(Java 시리즈 1편)
다음 편 예고
다음 편에서는 [Java] 비전공자 / 노 베이스 입문자를 위한 자바 기본 활용 (Java 시리즈 3편) 으로 이어집니다. 많은 기대 부탁드립니다!