문득 자바를 사용하면서 문법 공부 위주로 해왔다는 것을 깨달았다. 문법보다 왜 이걸 사용해야하는지 본질적으로 접근하고자 오늘부터 다시 한번 정리하고 Spring 공부를 다시 한번 할 생각이다.
특히나 요즘같은 시기엔 기초가 탄탄한 개발자야말로 살아남을 수 있다는 생각이 들기에!
클래스가 필요한 이유
자바 세상은 클래스와 객체로 이루어져 있다.
Student 여러명의 정보를 출력하는 프로그램을 만들기 위해선, Student1의 이름, 나이, 성적이 필요하고 Student2의 이름, 나이, 성적이 필요하고 Student3의 이름, 나이 성적이 필요하고 ... StudentN의 이름, 나이, 성적이 필요하다. 이 모든 정보를 하드코딩해 작성할 수도 있겠지만 그렇게 하면 유지보수면에서 불리하고 나중에 확장성을 고려했을 때 좋지 않은 코드다.
이럴 때 사용하는게 바로 클래스이다.
package class1;
public class Student {
String name;
int age;
int grade;
}
클래스 Student 내부에는 name, age, grade 변수를 가진다.
이렇게 클래스에 정의한 변수들을 멤버 변수, 또는 필드라 한다.
- 멤버 변수(Member Variable): 이 변수들은 특정 클래스에 소속된 멤버이기 때문에 이렇게 부른다.
- 필드(Field): 데이터 항목을 가리키는 전통적인 용어이다. 데이터베이스, 엑셀 등에서 데이터 각각의 항목을 필드라 한다.
- 자바에서 멤버 변수, 필드는 같은 뜻이다. 클래스에 소속된 변수를 뜻한다.
package class1;
public class ClassStart1 {
public static void main(String[] args) {
Student student1 = new Student();
student1.name = "김옥순";
student1.age = 15;
student1.grade = 90;
Student student2 = new Student();
student2.name = "김영철";
student2.age = 16;
student2.grade = 80;
System.out.println("이름: "+student1.name+" 나이: "+ student1.age+" 성적: "+student1.grade);
System.out.println("이름: "+student2.name+" 나이: "+ student2.age+" 성적: "+student2.grade);
}
}
사용자가 직접 정의하는 사용자 정의 타입을 만들려면 설계도가 필요하다. 이 설계도가 바로 클래스이다.
- 설계도인 클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다.(student1과 student2는 객체/인스턴스)
- 클래스를 통해서 사용자가 원하는 종류의 데이터 타입을 마음껏 정의할 수 있다.
클래스는 설계도이고, 이 설계도를 기반으로 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다. 둘다 같은 의미로 사용된다.
여기서는 학생(Student) 클래스를 기반으로 학생1(student1), 학생2(student2) 객체 또는 인스턴스를 만들었다.
해당 코드를 하나씩 뜯어보자면,
1. 객체 생성
- new Student(): `new` 는 새로 생성한다는 뜻이다. new Student()는 Student 클래스 정보를 기반으로 새로운 객체를 생성하라는 뜻이다. 이렇게 하면 메모리에 실제 Student 객체(인스턴스)를 생성한다.
- Student 클래스는 name, age, grade 변수를 가지고 있다. 이 변수를 사용하는데 필요한 메모리 공간도 함께 확보한다.
2. 참조값 보관
- 객체를 생성하면 자바는 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값(주소)(x001)을 반환한다.
- 여기서 x001 이라고 표현한 것이 참조값이다. (실제로 x001 처럼 표현되는 것은 아니고 이해를 돕기 위한 예시)
- new 키워드를 통해 객체가 생성되고 나면 참조값을 반환한다. 앞서 선언한 변수인 Student student1 에 생성된 객체의 참조값(x001)을 보관한다.
- Student student1 변수는 이제 메모리에 존재하는 실제 Student 객체(인스턴스)의 참조값을 가지고 있다.
이후에 학생2(student2)까지 생성하면 다음과 같이 Student 객체(인스턴스)가 메모리에 2개 생성된다. 각각 참조값이 다르므로 서로 구분할 수 있다.
클래스, 객체, 인스턴스 정리
클래스 - Class
클래스는 객체를 생성하기 위한 '틀' 또는 '설계도'이다. 클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의한다. 예를 들어 학생이라는 클래스는 속성으로 name, age, grade를 가진다.
객체 - Object
객체는 클래스에서 정의한 속성과 기능을 가진 실체이다. 객체는 서로 독립적인 상태를 가진다. 예를 들어 위 코드에서 student1 은 학생1의 속성을 가지는 객체이고, student2는 학생2의 속성을 가지는 객체이다. student1과 student2는 같은 클래스에서 만들어졌지만, 서로 다른 객체이다.
인스턴스 - Instance
인스턴스는 특정 클래스로부터 생성된 객체를 의미한다. 그래서 객체와 인스턴스라는 용어는 자주 혼용된다. 인스턴스는 주로 객체가 어떤 클래스에 속해 있는지 강조할 때 사용한다. 예를 들어서 "student1 객체는 Student 클래스의 인스턴스다." 라고 표현한다.
객체 vs 인스턴스
둘다 클래스에서 나온 실체라는 의미에서 비슷하게 사용되지만, 용어상 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어이다. 보통 student1은 Student의 객체이다. 라고 말하는 대신 "student1은 Student의 인스턴스이다."라고 특정 클래스와의 관계를 명확히 할 때 인스턴스라는 용어를 주로 사용한다.
좀 더 쉽게 풀어보자면, 모든 인스턴스는 객체이지만, 우리가 인스턴스라고 부르는 순간은 특정 클래스로부터 그 객체가 생성되었음을 강조하고 싶을 때이다. 예를 들어 student1은 객체이지만, 이 객체가 Student클래스로부터 생성된다는 점을 명확히 하기 위해 student1을 `Student` 의 인스턴스라고 부른다.
하지만 둘다 클래스에서 나온 실체라는 핵심 의미는 같기 때문에 보통 둘을 구분하지 않고 사용한다.