
📌 클래스가 필요한 이유
배열 사용의 한계 때문 !!!
▶️ ClassStart2
package class1;
public class ClassStart1 {
public static void main(String[] args) {
String student1Name = "학생1";
int student1Age = 15;
int student1Grade = 90;
String student2Name = "학생2";
int student2Age = 16;
int student2Grade = 800;
System.out.println("이름:" + student1Name + " 나이:" + student1Age + " 성적:" + student1Grade);
System.out.println("이름:" + student2Name + " 나이:" + student2Age + " 성적:" + student2Grade);
}
}
배열을 사용해서 코드 변경을 최소화하는데는 성공했지만, 한 학생의 데이터가 studentNames[]
, studentAges[]
, studentGrades[]
라는 3개의 배열에 나누어 있다. 따라서 데이터를 변경할 때 매우 조심해서 작업해야 한다. 예를 들어서 학생 2의 데이터를 제거하려면 각각의 배열마다 학생2의 요소를 정확하게 찾아서 제거해주어야 한다.
🔎 클래스 도입
▶️ ClassStart3
package class1;
public class ClassStart3 {
public static void main(String[] args) {
Student student1;
student1 = new Student();
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
Student student2 = new Student();
student2.name = "학생2";
student2.age = 16;
student2.grade = 80;
System.out.println("이름:" + student1.name + " 나이:" + student1.age + "성적:" + student1.grade);
System.out.println("이름:" + student2.name + " 나이:" + student2.age + "성적:" + student2.grade);
}
}
클래스에 정의한 변수들을 멤버 변수, 또는 필드라 한다.
- 멤버 변수(Member Variable) : 이 변수들은 특정 클래스에 소속된 멤버이기 때문에 이렇게 부른다.
- 필드(Field) : 데이터 항목을 가리키는 전통적인 용어이다. 데이터베이스, 엑셀 등에서 데이터 각각의 항목을 필드라 한다.
- 자바에서 멤버 변수, 필드는 같은 뜻이다. 클래스에 소속된 변수를 뜻한다
클래스와 사용자 정의 타입
- 타입은 데이터의 종류나 형태를 나타낸다.
int
라고 하면 정수 타입,String
이라고 하면 문자 타입이다.- 학생(
Student
)이라는 타입을 만들면 되지 않을까?
- 클래스를 사용하면
int
,String
과 같은 타입을 직접 만들 수 있다. - 사용자가 직접 정의하는 사용자 정의 타입을 만들려면 설계도가 필요하다. 이 설계도가 바로 클래스이다.
- 설계도인 클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다.
- 클래스를 통해서 사용자가 원하는 종류의 데이터 타입을 마음껏 정의할 수 있다.
용어: 클래스, 객체, 인스턴스
클래스는 설계도이고, 이 설계도를 기반으로 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다. 둘 다 같은 의미로 사용된다.
여기서는 학생(Student
) 클래스를 기반으로 학생1(student1
), 학생2(student2
) 객체 또는 인스턴스를 만들었다.
💡 클래스 : 설계도 , 붕어빵 틀
💡 인스턴스나 객체 : 붕어빵
1. 변수 선언

Student student1
- Student 타입을 받을 수 있는 변수를 선언한다.
2. 객체 생성

- 객체를 사용하려면 먼저 설계도인 클래스를 기반으로 객체(인스턴스)를 생성해야 한다.
new Student()
:new
는 새로 생성한다는 뜻이다.new Student()
는Student
클래스 정보를 기반으로 새로운 객체를 생성하라는 뜻이다. 이렇게 하면 메모리에 실제Student
객체(인스턴스)를 생성한다.- 객체를 생성할 때는
new 클래스명()
을 사용하면 된다. 마지막에()
도 추가해야 한다. Student
클래스는String name
,int age
,int grade
멤버 변수를 가지고 있다. 이 변수를 사용하는 데 필요한 메모리 공간도 함께 확보한다.
3. 참조값 보관

- 객체를 생성하면 자바는 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값(주소)(예:
x001
)을 반환한다.- 여기서
x001
이라고 표현한 것이 참조값이다. (실제로x001
처럼 표현되는 것은 아니고 이해를 돕기 위한 예시이다.)
- 여기서
new
키워드를 통해 객체가 생성되고 나면 참조값을 반환한다. 앞서 선언한 변수인Student student1
에 생성된 객체의 참조값(x001
)을 보관한다.Student student1
변수는 이제 메모리에 존재하는 실제Student
객체(인스턴스)의 참조값을 가지고 있다.student1
변수는 방금 만든 객체에 접근할 수 있는 참조값을 가지고 있다. 따라서 이 변수를 통해서 객체를 접근(참조)할 수 있다. 쉽게 이야기해서student1
변수를 통해 메모리에 있는 실제 객체를 접근하고 사용할 수 있다.
참조값을 변수에 보관해야 하는 이유
- 객체를 생성하는
new Student()
코드 자체에는 아무런 이름이 없다. 이 코드는 단순히Student
클래스를 기반으로 메모리에 실제 객체를 만드는 것이다.- 따라서 생성한 객체에 접근할 수 있는 방법이 필요하다.
- 이런 이유로 객체를 생성할 때 반환되는 참조값을 어딘가에 보관해야 한다.
- 앞서
Student student1
변수가 참조값(x001
)을 저장하도록 해두었으므로, 저장한 참조값(x001
)을 통해 실제 메모리에 존재하는 객체에 접근할 수 있다.
지금까지 설명한 내용을 간단히 표현하면 다음과 같다:
Student student1 = new Student(); // 1. Student 객체 생성
Student student1 = x001; // 2. new Student()의 결과로 x001 참조값 반환
student1 = x001; // 3. 최종 결과
- 이후에 학생2(
student2
)까지 생성하면 다음과 같이Student
객체(인스턴스)가 메모리에 2개 생성된다. 각 객체는 참조값이 다르므로 서로 구분할 수 있다.
🔎 객체 사용
클래스를 통해 생성한 객체를 사용하려면 먼저 메모리에 존재하는 객체에 접근해야 한다. 객체에 접근하려면 .(dot)을 사용하면 된다.
객체에 값 대입
객체가 가지고 있는 멤버 변수(name
, age
, grade
)에 값을 대입하려면 먼저 객체에 접근해야 한다.
- 객체에 접근하려면
.
(점, dot) 키워드를 사용하면 된다. - 이 키워드는 변수(
student1
)에 들어있는 참조값(x001
)을 읽어서 메모리에 존재하는 객체에 접근한다.
순서를 간단히 풀어보면 다음과 같다:
student1.name = "학생1"; // 1. student1 객체의 name 멤버 변수에 값 대입
x001.name = "학생1"; // 2. 변수에 있는 참조값을 통해 실제 객체에 접근, 해당 객체의 name 멤버 변수에 값 대입

객체 값 읽기
객체의 값을 읽는 것도 앞서 설명한 내용과 같다.
.
(점, dot) 키워드를 통해 참조값을 사용해서 객체에 접근한 다음에 원하는 작업을 하면 된다.
다음은 예제를 보자:
// 1. 객체 값 읽기
System.out.println("이름: " + student1.name);
// 2. 변수에 있는 참조값을 통해 실제 객체에 접근하고, name 멤버 변수에 접근한다.
System.out.println("이름: " + x001.name);
// 3. 객체의 멤버 변수의 값을 읽어옴
System.out.println("이름: " + "학생1");

🔎 클래스, 객체, 인스턴스 정리
💡 클래스(붕어빵 틀) : 객체를 생성하기 위한 ‘틀’ 또는 ‘설계도’
💡 인스턴스(팥붕) : 클래스로부터 생성된 객체, 어떤 클래스에 속해 있는지 강조할 때 사용, 좀 더 관계에 초점을 맞춘 용어 !
💡 객체(슈붕) : 클래스에서 정의한 속성과 기능을 가진 실체
📌 배열 도입
배열을 사용하면 특정 타입을 연속한 데이터 구조로 묶어서 사용가능 하다
Student 타입 사용하는 배열을 도입해보자.
배열에 참조값 대입
이번에는 Student 를 담을 수 있는 배열을 생성하고, 해당 배열에 student1 , student2 인스턴스를 보관하자.
Student[] students = new Student[2];
자바에서 대입은 항상 변수에 들어 있는 값을 복사한다.

배열에 참조값을 대입한 이후 배열 그림

⚡ 주의!
변수에는 인스턴스 자체가 들어있는 것이 아니다! 인스턴스의 위치를 가리키는 참조값이 들어있을 뿐이다! 따라서 대입 ( = )
시에 인스턴스가 복사되는 것이 아니라 참조값만 복사된다
클래스 내부에서는 다른 인스턴스의 private 멤버에도 접근할 수 있는 권한이 있다. 이는 자바의 접근 제어 규칙 중 하나이다.
즉, 같은 클래스 내부에서는 그 클래스의 인스턴스들이 서로의 private 멤버 변수에 접근할 수 있다.
⌨️ 단축키 꿀팁 !
psvm
을 입력한 후, 엔터를 입력하면 java의 main() 메소드가 자동으로 생성된다. psvm
은 public static void main의 약자다.
iter
for(Student s : students){
System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
}
'Language > Java' 카테고리의 다른 글
[Java] if-else와 try-catch에 대해서 (0) | 2025.03.14 |
---|---|
[Java] 제네릭(Generic) (0) | 2025.03.06 |
[Java] 기본형과 참조형 (0) | 2025.03.06 |
[Java] 익명 클래스 (Annoymous Class)와 람다 (Lamda) (0) | 2025.03.05 |
[Java] 컬렉션 (Collection) (0) | 2025.03.04 |