| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 알고리즘공부
- 코딩테스트팁
- 개발공부
- 자바프로그래밍
- HashMap
- JVM
- 코딩테스트
- 자바공부
- 파이썬
- Java
- 프로그래밍기초
- 메모리관리
- 멀티스레드
- 코딩인터뷰
- 가비지컬렉션
- 알고리즘
- 예외처리
- 객체지향
- 백준
- 자바기초
- 개발자취업
- 코딩테스트준비
- 코딩공부
- 정렬
- 자바
- 개발자팁
- 프로그래머스
- 자료구조
- 클린코드
- 자바개발
- Today
- Total
코드 한 줄의 기록
Java 클래스와 객체 완벽 정리 - 초보자도 이해하는 객체지향 프로그래밍 핵심 개념 본문
Java를 배우면서 가장 먼저 접하게 되는 개념이 바로 클래스와 객체입니다. 처음에는 "왜 이런 걸 배워야 하지?" 싶었는데, 지금 돌이켜보니 Java 프로그래밍의 모든 것이 여기서 시작된다는 걸 깨닫게 되었습니다. 오늘은 저와 함께 Java의 클래스와 객체 개념을 차근차근 정리해보겠습니다.
클래스란 무엇인가? - 설계도라는 비유를 넘어서
클래스의 정의
클래스는 객체를 정의해놓은 것 또는 객체의 설계도 또는 틀이라고 정의할 수 있습니다. 하지만 단순히 "설계도"라는 비유만으로는 이해가 부족할 수 있습니다.
클래스를 좀 더 구체적으로 설명하면, 유사한 특징을 가진 객체들의 속성과 동작을 묶어 놓은 집합체입니다. 예를 들어, '자동차'라는 클래스를 만들면 자동차의 색상, 브랜드, 최고 속도 등의 속성과 가속, 감속, 시동 켜기 등의 동작을 정의할 수 있습니다.
클래스의 용도
클래스는 객체를 생성하는데 사용되며, 클래스에 정의된 대로 객체가 생성됩니다. 하나의 설계도만 잘 만들어 놓으면 제품을 만드는 일이 쉬워지는 것처럼, 클래스를 한번만 잘 만들어 놓으면 매번 객체를 생성할 때마다 어떻게 만들어야할지 고민하지 않고 해당 클래스로부터 객체를 생성해서 사용하기만 하면 됩니다.
class Car {
String color; // 색상
String brand; // 브랜드
int maxSpeed; // 최고 속도
void start() { // 시동 켜기
System.out.println("시동이 켜졌습니다.");
}
void accelerate() { // 가속
System.out.println("속도가 증가합니다.");
}
}
객체란 무엇인가? - 클래스의 실체화
객체의 정의
객체는 사전적인 정의로는 '실제 존재하는 것'입니다. 객체지향 이론에서는 사물과 같은 유형적인 것뿐만 아니라, 개념이나 논리와 같은 무형적인 것들도 객체로 간주합니다.
프로그래밍에서 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻합니다. 클래스를 기반으로 생성된 실체라고 할 수 있으며, 각 객체는 해당 클래스의 속성과 동작을 가지게 됩니다.
인스턴스와 객체의 관계
클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 하며, 어떤 클래스로 만들어진 객체를 그 클래스의 인스턴스(instance)라고 합니다.
// 클래스 → 인스턴스화 → 인스턴스(객체)
Car myCar = new Car(); // Car 클래스의 인스턴스 생성
참조의 개념 - Java만의 특별한 메모리 관리 방식
기본 타입 vs 참조 타입
Java에서 변수는 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 나뉩니다.
기본 타입은 실제 값을 변수에 저장하지만, 참조 타입은 배열, 열거, 클래스, 인터페이스를 이용해서 선언된 변수로 메모리에 번지(주소)를 값으로 갖습니다.
// 기본 타입 변수 - 실제 값 저장
int age = 25;
double price = 100.5;
// 참조 타입 변수 - 주소값 저장
String name = "홍길동";
Car myCar = new Car();
메모리 영역의 이해
Java 프로그램이 실행될 때 메모리는 크게 세 영역으로 구분됩니다.
- 메소드 영역 (Method Area)
- 정적 필드(static field), 상수(constant), 생성자(constructor), 메소드(method) 코드 등이 저장됩니다
- 힙 영역 (Heap Area)
- 객체와 배열이 생성되는 영역입니다
- 참조하는 변수나 필드가 없다면 가비지 컬렉터(Garbage Collector)에 의해 자동으로 제거됩니다
- JVM 스택 영역
- 기본 타입 변수와 참조 타입 변수가 생성되고 제거됩니다
- 참조 타입 변수는 힙 영역에 있는 객체의 주소값을 저장합니다
참조 변수의 특징
참조 타입 변수들 간의 ==, != 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용됩니다. 실제로는 주소 값을 비교하는 것입니다.
Car car1 = new Car();
Car car2 = new Car();
Car car3 = car1;
System.out.println(car1 == car2); // false (다른 객체)
System.out.println(car1 == car3); // true (같은 객체)
클래스의 멤버 구성 - 속성과 기능의 집합
클래스의 기본 구조
클래스는 크게 세 가지 구성 요소로 이루어집니다.
- 멤버 변수(필드) - 객체의 속성을 저장
- 메서드 - 객체의 기능을 구현
- 생성자 - 객체 생성 시 초기화 담당
class Person {
// 멤버 변수 (필드)
private String name;
private int age;
// 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 메서드
public void introduce() {
System.out.println("안녕하세요, 저는 " + name + "이고, " + age + "살입니다.");
}
}
멤버 변수의 종류
멤버 변수는 메서드 밖에서 선언된 변수를 말하며, 여러 형태로 분류됩니다.
- 인스턴스 변수
- 객체가 생성될 때 객체들마다 따로 생성되어 고유의 값을 갖는 변수입니다
- 클래스 변수(static 변수)
- static 키워드로 선언되며, 객체가 생성될 때 단 하나만 생성되어 모든 객체들이 공유하는 변수입니다
- 상수
- 선언과 동시에 값이 정해지고 변하지 않는 변수입니다
접근 제어 한정자
멤버 변수와 메서드에는 접근 제어 한정자를 사용하여 접근 범위를 제한할 수 있습니다.
- public: 모든 클래스에서 접근 가능
- private: 선언된 클래스 안에서만 사용 가능
- protected: 같은 클래스 또는 하위 파생 클래스에서만 접근 가능
- default: 같은 패키지 내의 클래스에서만 접근 가능
객체 생성과 사용 - 실제 코딩에서의 적용
객체 생성 방법
클래스로부터 인스턴스를 생성하는 방법은 다음과 같습니다.
// 객체 생성
Person person1 = new Person("김철수", 25);
객체 사용하기
생성된 객체의 멤버에 접근할 때는 점(.) 연산자를 사용합니다.
// 객체 생성
Person person1 = new Person("김철수", 25);
// 메서드 호출
person1.introduce(); // "안녕하세요, 저는 김철수이고, 25살입니다."
// 클래스 변수 접근 (클래스명으로 접근 권장)
System.out.println(Student.school); // "한국대학교"
가비지 컬렉션 - Java의 자동 메모리 관리
가비지의 정의
가비지(garbage)는 Java 응용프로그램에서 더 이상 사용하지 않게 된 객체나 배열 메모리를 의미합니다. 참조하는 레퍼런스가 하나도 없는 객체나 배열을 가비지로 판단합니다.
예시
Person p1 = new Person("철수", 20);
Person p2 = new Person("영희", 22);
p2 = p1; // p2가 가리키던 "영희" 객체는 가비지가 됨
가비지 컬렉션의 동작
가비지 컬렉션(Garbage Collection)은 가비지가 차지하고 있는 메모리 공간을 회수하여 가용 메모리를 늘리는 작업입니다. Java 플랫폼에 의해 자동으로 처리되므로 개발자가 직접 객체를 제거할 필요가 없습니다.
대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라집니다. 이는 Java의 중요한 장점 중 하나로, 메모리 누수 걱정 없이 프로그래밍할 수 있게 해줍니다.
실무에서의 활용 - 왜 이 개념들이 중요한가?
객체지향 프로그래밍의 장점
- 코드 재사용이 용이함
- 상속을 통해 코드 재사용을 할 수 있고 남이 만든 클래스를 쉽게 이용할 수 있습니다
- 생산성이 향상됨
- 클래스 단위로 모듈화하고 독립적인 객체를 생성하는 방식이기 때문에 생산성이 향상됩니다
- 유지보수가 쉬움
- 프로그램 추가, 수정 시 캡슐화를 통해 주변에 미치는 영향을 제한할 수 있습니다
실무 개발 시 주의사항
- 참조와 복사의 차이점 이해
- 객체 변수를 다른 변수에 대입할 때는 주소값이 복사되므로 같은 객체를 가리키게 됩니다
- 메모리 효율성 고려
- static 변수는 모든 인스턴스가 공유하므로 메모리 효율적이지만, 과도한 사용은 메모리 누수를 일으킬 수 있습니다
Java의 클래스, 객체, 참조 개념은 처음에는 어렵게 느껴질 수 있지만, 실제 프로그래밍을 하면서 점점 그 중요성을 깨닫게 됩니다. 특히 대규모 프로젝트에서는 이런 개념들이 코드의 구조화와 유지보수에 결정적인 역할을 합니다.
이 글을 통해 Java의 기본 개념들을 정리해보았는데, 이론만으로는 부족합니다. 실제로 코드를 작성해보면서 이런 개념들이 어떻게 적용되는지 경험해보시길 권합니다. 저도 처음에는 이해가 안 됐던 부분들이 코딩을 하면서 자연스럽게 체득되었거든요.
다음에는 상속, 다형성, 캡슐화 같은 객체지향의 핵심 특징들에 대해서도 정리해보겠습니다. Java 개발자로 성장하는 여러분의 여정에 도움이 되길 바랍니다!
Java 날짜·시간 API 완벽 가이드: java.time으로 손쉽게 포맷·파싱하기
Java 8부터 도입된 java.time 패키지는 기존 java.util.Date와 java.util.Calendar의 단점을 대폭 보완하여, 날짜와 시간을 더 안전하고 직관적으로 다룰 수 있게 해줍니다. 이 글에서는 LocalDate, LocalTime, LocalDat
byteandbit.tistory.com
'JAVA' 카테고리의 다른 글
| Java 객체 생성 완벽 가이드: 생성자, 정적 팩토리 메서드, 생성자 체이닝 총정리 (0) | 2025.10.09 |
|---|---|
| Java 캡슐화와 접근 제어자 완벽 가이드: 불변 객체 패턴 기초부터 활용까지 (0) | 2025.10.08 |
| Java 날짜·시간 API 완벽 가이드: java.time으로 손쉽게 포맷·파싱하기 (0) | 2025.10.06 |
| Java StringBuilder vs StringBuffer - 성능과 스레드 안전성 완전 정복 가이드 (0) | 2025.10.05 |
| Java String 불변성과 메모리 최적화: 리터럴 풀과 equals 비교 완벽 가이드 (0) | 2025.10.04 |