클래스(Class)와 객체란?
클래스(Class)는 자바에서 객체 지향 프로그래밍(OOP)의 핵심 개념 중 하나로, 데이터와 데이터를 처리하는 메서드를 하나의 단위로 묶어놓은 설계도 혹은 템플릿입니다. 클래스를 이용하여 실제로 생성되는 것이 객체이며, 클래스는 객체를 생성하기 위한 틀이라고 할 수 있습니다.
클래스와 객체
클래스와 객체는 설계와 실체라는 관점에서 이해할 수 있습니다. 클래스는 객체를 만들기 위한 설계도로, 어떤 객체가 가져야 할 속성과 행동을 정의합니다. 반면 객체는 클래스를 기반으로 실제로 생성된 것으로, 프로그램에서 작업을 수행하거나 데이터를 저장하는 등의 역할을 합니다.
클래스
- 설명: 클래스는 일종의 설계도 또는 틀로, 데이터와 데이터를 다루는 메서드들을 하나로 묶어둔 것입니다.
- 예시: 학생 클래스를 만든다고 가정해봅시다. 학생 클래스에는 학생의 속성(이름, 학번, 성적)과 행동(성적을 출력하는 메서드)이 정의됩니다.
💡코드 예시
public class Student {
String name;
int studentID;
double grade;
public void displayGrade() {
System.out.println(name + "의 성적: " + grade);
}
}
Java객체
- 설명: 객체는 클래스를 기반으로 실제로 메모리에 생성된 것으로, 해당 클래스의 인스턴스입니다. 클래스는 일종의 틀일 뿐, 실제 사용하려면 객체를 생성해야 합니다.
- 예시: 위에서 만든 학생 클래스를 이용하여 실제 학생 객체를 생성할 수 있습니다. 이 객체는 학생 클래스에 정의된 속성과 메서드를 사용할 수 있습니다.
💡코드 예시
public class Main {
public static void main(String[] args) {
Student student1 = new Student();
student1.name = "홍길동";
student1.studentID = 2022001;
student1.grade = 90.5;
student1.displayGrade(); // 출력: 홍길동의 성적: 90.5
}
}
Java설명
이렇게 클래스는 개념적인 틀이며, 객체는 그 틀을 기반으로 실체화된 것입니다. 객체를 통해 클래스에 정의된 속성과 메서드를 실제로 사용할 수 있습니다. 이런 객체 지향 프로그래밍의 개념은 코드의 재사용성을 높이고, 프로그램을 보다 체계적이고 유지보수하기 쉽게 만들어줍니다.
클래스 구조
클래스 선언(Declaration)
클래스는 class 키워드를 사용하여 선언됩니다. 클래스 선언은 클래스의 이름과 중괄호로 둘러싸인 클래스의 내용으로 구성됩니다. 클래스의 이름은 관례상 대문자로 시작하고, 카멜 표기법을 따릅니다. 클래스 내부에는 멤버 변수, 생성자, 메서드 등이 들어갑니다.
public class MyClass {
// 클래스의 내용이 여기에 옵니다.
}
Java멤버 변수(Instance Variables 또는 Fields)
클래스 내부에는 데이터를 저장하기 위한 멤버 변수가 선언됩니다. 멤버 변수는 클래스의 속성이나 상태를 나타냅니다. 클래스 내에서 선언되며, 객체의 각 인스턴스마다 고유한 값을 가질 수 있습니다.
public class MyClass {
// 멤버 변수 선언
int myVariable;
}
Java생성자(Constructor)
생성자는 클래스의 객체를 초기화하는 데 사용됩니다. 클래스의 인스턴스가 생성될 때 자동으로 호출되며, 주로 멤버 변수들을 초기화하는 데에 사용됩니다. 생성자는 클래스와 동일한 이름을 가지며, 반환 형식이 없습니다.
public class MyClass {
int myVariable;
// 생성자 선언
public MyClass(int initialValue) {
myVariable = initialValue;
}
}
Java메서드(Methods)
메서드는 클래스가 수행하는 작업을 정의합니다. 클래스 내부에 선언되며, 객체의 상태를 변경하거나 정보를 반환하는 역할을 합니다.
public class MyClass {
int myVariable;
public MyClass(int initialValue) {
myVariable = initialValue;
}
// 메서드 선언
public void printVariable() {
System.out.println("변수의 값: " + myVariable);
}
}
Java접근 제어자(Access Modifiers)
클래스, 멤버 변수, 메서드에는 접근 제어자가 사용됩니다. 이는 해당 항목이 다른 클래스에서 어떻게 접근되고 사용될 수 있는지를 제어합니다. 대표적인 접근 제어자로는 public, private, protected 등이 있습니다.
public으로 선언된 변수는 어디서나 접근 가능하고, private으로 선언된 메서드는 클래스 내부에서만 접근 가능합니다.
public class MyClass {
// public 접근 제어자를 가진 멤버 변수
public int myVariable;
// private 접근 제어자를 가진 메서드
private void privateMethod() {
// 메서드의 내용
}
}
Java객체
객체란?
자바에서 객체(Object)는 현실 세계의 사물이나 개념을 프로그래밍에서 모델링하는 데 사용되는 핵심 요소 중 하나입니다. 객체 지향 프로그래밍(OOP) 패러다임에서는 모든 것을 객체로 간주하고, 이 객체들 간의 상호작용을 중심으로 프로그램을 구성합니다.
자바에서 객체는 클래스(Class)의 인스턴스(Instance)입니다. 클래스는 객체의 설계도로서, 객체가 가져야 할 속성(멤버 변수)과 동작(메서드)을 정의합니다. 이를 통해 객체는 데이터와 그 데이터를 다루는 코드가 하나로 묶여서 구조화됩니다.
기본적인 객체 생성
객체를 생성하려면 클래스의 생성자를 호출해야 합니다. new 키워드를 사용하여 클래스의 생성자를 호출하고, 이를 변수에 할당하여 객체를 참조할 수 있습니다.
// MyClass 클래스의 객체 생성
MyClass myObject = new MyClass();
Java- 위의 예제에서 MyClass는 클래스 이름이며, myObject는 객체를 참조하는 변수입니다.
- new MyClass()는 MyClass 클래스의 기본 생성자를 호출하여 객체를 생성하고, 그 객체의 참조를 myObject에 할당합니다.
매개변수가 있는 생성자 사용
클래스에 여러 생성자가 정의된 경우, 필요에 따라 적절한 생성자를 선택하여 객체를 생성할 수 있습니다.
// 매개변수가 있는 생성자를 사용한 객체 생성
MyClass myObject = new MyClass("홍길동", 25);
Java- 이 예제에서는 MyClass 클래스의 매개변수가 있는 생성자를 호출하여 객체를 생성하고, 생성자에 필요한 인자들을 전달합니다.
다른 객체의 참조 복사
이미 생성된 객체의 참조를 다른 변수에 복사할 수도 있습니다. 이 경우, 두 변수는 같은 객체를 참조하게 됩니다.
MyClass firstObject = new MyClass();
MyClass secondObject = firstObject; // firstObject의 참조를 secondObject에 복사
Java- 이제 firstObject와 secondObject는 같은 객체를 가리키며, 한 변수에서 객체를 변경하면 다른 변수에서도 동일한 변경 내용이 반영됩니다.
배열로 객체 생성
객체를 배열로 생성할 수도 있습니다. 배열은 동일한 타입의 여러 객체를 저장하는 데 사용됩니다.
// MyClass 객체를 담은 배열 생성
MyClass[] objectArray = new MyClass[5];
Java- 이렇게 생성된 배열은 초기화되지 않은 객체의 참조를 가지고 있으며, 필요에 따라 각 요소를 개별적으로 초기화할 수 있습니다.
결론
이 글에서는 자바에서의 클래스와 객체에 대한 기본 개념을 살펴보았습니다. 클래스는 객체 지향 프로그래밍의 핵심이며, 데이터와 메서드를 묶어 놓은 설계도로 이해할 수 있습니다. 객체는 클래스의 실체로, 클래스를 기반으로 실제로 생성되어 프로그램에서 사용되는 인스턴스입니다.
클래스와 객체의 관계를 설명하면서, 클래스는 개념적인 설계 도면이며, 객체는 그 설계 도면을 기반으로 실제로 생성된 것이라고 강조했습니다. 객체 지향 프로그래밍은 이러한 클래스와 객체의 개념을 활용하여 코드의 모듈화와 재사용성을 높이는 방향으로 프로그램을 구성하는 패러다임입니다.