이번 포스팅에서는 Java의 객체지향 프로그래밍(OOP)의 기초 개념에 대해 자세히 알아보겠습니다.
OOP는 소프트웨어 개발에서 매우 중요한 패러다임으로, 코드의 재사용성과 유지보수성을 높여줍니다.
여기서는 클래스와 객체, 필드와 메서드, 생성자와 소멸자에 대해 각각 자세히 설명하겠습니다.
1. 클래스와 객체의 개념
1.1 클래스
클래스는 객체를 생성하기 위한 청사진 또는 템플릿입니다. 클래스는 객체의 속성과 행동을 정의하며, 객체를 생성하기 위해 필요한 모든 정보를 포함합니다. 예를 들어, 자동차를 모델링하는 Car 클래스를 만들어 보겠습니다.
예제:
class Car {
// 필드 (속성)
String color; // 자동차의 색상
String model; // 자동차의 모델
int year; // 자동차의 연식
// 메서드 (행동)
void drive() {
System.out.println("차가 달리고 있습니다.");
}
void displayInfo() {
System.out.println("모델: " + model + ", 색상: " + color + ", 연식: " + year);
}
}
위 코드에서 Car 클래스는 자동차의 색상, 모델, 연식을 나타내는 세 개의 필드를 가지고 있습니다. drive() 메서드는 자동차가 달리는 행동을 나타내며, displayInfo() 메서드는 자동차의 정보를 출력합니다.
1.2 객체
객체는 클래스에서 정의된 속성과 행동을 갖는 실체입니다. 클래스를 기반으로 객체를 생성하는 방법은 다음과 같습니다.
예제:
public class Main {
public static void main(String[] args) {
// Car 클래스의 객체 생성
Car myCar = new Car();
myCar.color = "빨강"; // 객체의 필드에 값 설정
myCar.model = "소나타"; // 객체의 필드에 값 설정
myCar.year = 2020; // 객체의 필드에 값 설정
// 객체의 메서드 호출
myCar.displayInfo(); // "모델: 소나타, 색상: 빨강, 연식: 2020" 출력
myCar.drive(); // "차가 달리고 있습니다." 출력
}
}
이 코드에서 myCar는 Car 클래스의 객체입니다. myCar 객체를 통해 color, model, year 필드를 설정하고, displayInfo()와 drive() 메서드를 호출하여 정보를 출력합니다.
2. 필드와 메서드
2.1 필드
필드는 객체의 속성을 정의합니다. 위의 Car 클래스에서 color, model, year는 모두 필드입니다. 필드는 객체의 상태를 나타내며, 객체가 생성된 후에 값을 설정하거나 변경할 수 있습니다.
2.2 메서드
메서드는 클래스의 행동을 정의합니다. 메서드는 특정 작업을 수행하거나 객체의 상태를 변경하는 데 사용됩니다. 예를 들어, 자동차의 연식을 업데이트하는 메서드를 추가해 보겠습니다.
예제:
class Car {
String color;
String model;
int year;
void drive() {
System.out.println("차가 달리고 있습니다.");
}
void displayInfo() {
System.out.println("모델: " + model + ", 색상: " + color + ", 연식: " + year);
}
// 연식을 업데이트하는 메서드
void updateYear(int newYear) {
year = newYear;
System.out.println("연식이 " + newYear + "로 업데이트되었습니다.");
}
}
public class Main {
public static void main(String[] args) {
Car myCar = new Car();
myCar.color = "파랑";
myCar.model = "아반떼";
myCar.year = 2019;
myCar.displayInfo(); // "모델: 아반떼, 색상: 파랑, 연식: 2019" 출력
myCar.updateYear(2021); // "연식이 2021로 업데이트되었습니다." 출력
myCar.displayInfo(); // "모델: 아반떼, 색상: 파랑, 연식: 2021" 출력
}
}
위의 코드에서 updateYear() 메서드는 자동차의 연식을 업데이트하는 기능을 추가합니다. 메서드를 호출하면 연식이 변경되고, 변경된 정보를 다시 출력합니다.
3. 생성자(Constructor)와 소멸자(Destructor)
3.1 생성자
생성자는 객체가 생성될 때 호출되는 특별한 메서드입니다. 생성자는 주로 객체의 초기 상태를 설정하는 데 사용됩니다. 기본 생성자와 매개변수가 있는 생성자를 정의할 수 있습니다.
예제:
class Car {
String color;
String model;
int year;
// 매개변수가 있는 생성자
Car(String color, String model, int year) {
this.color = color; // this는 현재 객체를 참조
this.model = model;
this.year = year;
}
void drive() {
System.out.println("차가 달리고 있습니다.");
}
void displayInfo() {
System.out.println("모델: " + model + ", 색상: " + color + ", 연식: " + year);
}
}
public class Main {
public static void main(String[] args) {
// 생성자를 사용하여 객체 생성
Car myCar = new Car("검정", "K5", 2022);
myCar.displayInfo(); // "모델: K5, 색상: 검정, 연식: 2022" 출력
myCar.drive(); // "차가 달리고 있습니다." 출력
}
}
위의 코드에서 Car 클래스는 매개변수가 있는 생성자를 정의하여 객체 생성 시 색상, 모델, 연식을 초기화합니다. new Car("검정", "K5", 2022)를 통해 객체를 생성할 때, 생성자가 호출되어 필드가 설정됩니다.
3.2 소멸자
Java에서는 전통적인 소멸자 개념이 없습니다. 객체가 더 이상 필요하지 않을 때, Java의 가비지 컬렉터가 자동으로 메모리를 해제합니다. 하지만 특정 자원을 해제해야 할 필요가 있을 경우, finalize() 메서드를 사용할 수 있습니다. 그러나 이 방법은 권장되지 않으며, 자원 관리를 위해 try-with-resources 구문이나 finally 블록을 사용하는 것이 좋습니다.
예제:
class Resource {
void use() {
System.out.println("자원을 사용합니다.");
}
// finalize() 메서드 (권장되지 않음)
@Override
protected void finalize() throws Throwable {
System.out.println("자원이 해제됩니다.");
super.finalize();
}
}
public class Main {
public static void main(String[] args) {
Resource resource = new Resource();
resource.use(); // "자원을 사용합니다." 출력
resource = null; // 객체를 null로 설정하여 가비지 컬렉션 대상이 되도록 함
// 가비지 컬렉터가 finalize() 메서드를 호출할 수 있도록 유도
System.gc(); // 가비지 컬렉션 요청
}
}
위의 코드에서 finalize() 메서드는 객체가 가비지 컬렉션에 의해 수집될 때 호출됩니다. 하지만 이 방법은 예측할 수 없는 시점에 호출되므로, 자원 관리를 위해 다른 방법을 사용하는 것이 좋습니다.
4. 마치며
오늘은 Java의 객체지향 프로그래밍의 기초 개념인 클래스와 객체, 필드와 메서드, 생성자와 소멸자에 대해 자세히 알아보았습니다. OOP는 코드의 구조화 및 재사용성을 높이는 데 매우 유용하며, 이를 통해 보다 효율적인 소프트웨어 개발이 가능합니다. 앞으로도 OOP의 다양한 개념을 깊이 있게 공부하시길 바랍니다!
'IT프로그램 언어 > Java' 카테고리의 다른 글
Java(인터페이스와 추상클래스) (1) | 2025.01.09 |
---|---|
Java(상속과 다형성) (5) | 2024.12.25 |
Java(메소드의 매개변수와 반환값, 오버로딩) (3) | 2024.12.16 |
Java(메서드의 정의와 호출) (3) | 2024.12.13 |
Java(배열과 문자열) (4) | 2024.12.08 |