
'김영한의 실전 자바' 강의를 보고 정리하였습니다.
클래스가 필요한 이유
자바 세상은 클래스와 객체로 이루어져 있다.
먼저 클래스는 왜 필요한 걸까 ?
학생 정보 출력 프로그램 예제 코드를 보며 알아보도록 하자.
첫 번째 방법 : 변수 사용
public class ClassStart1 {
public static void main(String[] args) {
String student1Name = "학생1";
int student1Age = 18;
int student1Grade = 90;
String student2Name = "학생2";
int student2Age = 16;
int student2Grade = 80;
System.out.println("이름: " + student1Name + " 나이: " + student1Age + " 성적: " + student1Grade);
System.out.println("이름: " + student2Name + " 나이: " + student2Age + " 성적: " + student2Grade);
}
}
위 코드의 문제 👉🏻 학생이 늘어날 때마다 변수를 추가로 선언해야 하고, 또 출력하는 코드도 추가해야 한다.
두 번째 방법 : 배열 사용
public class ClassStart2 {
public static void main(String[] args) {
String[] studentNames = {"학생1", "학생2", "학생3", "학생4"};
int[] studentAges = {18, 16, 17, 20};
int[] studentGrades = {90, 80, 70, 60};
for (int i = 0; i < studentNames.length; i++) {
System.out.println("이름: " + studentNames[i] + "나이: " + studentAges[i] + "성적: " + studentGrades[i]);
}
}
}
위 코드의 문제 👉🏻 한 학생의 데이터가 studentNames[ ], studentAges[ ], studentGrades[ ]라는 3개의 배열에 나누어져 있다. 따라서 데이터를 변경할 때 매우 조심해서 작업해야 한다는 불편함이 생긴다.
이처럼 이름, 나이, 성적을 각각 따로 나누어서 관리하는 것은 사람이 관리하기 좋은 방식이 아니다.
사람이 관리하기 좋은 방식은 각각의 학생 별로 본인의 이름, 나이, 성적을 관리하는 것이다.
클래스 도입
위 코드의 문제점들을 클래스를 도입해서 해결할 수 있다.
Student 클래스
public class Student {
String name;
int age;
int grade;
}
- 멤버 변수 (Member Variable): 특정 클래스에 소속된 멤버. 클래스 내에 정의된 변수
- 필드 (Field): 데이터 항목을 가리키는 용어
* 자바에서 멤버 변수, 필드는 같은 의미로 사용된다 !
클래스는 관례상 대문자로 시작하고 CamelCase를 사용한다.
Student 클래스를 사용한 코드
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);
}
}
클래스와 사용자 정의 타입
- 타입: 데이터의 종류나 형태
- 클래스: 사용자 정의 타입을 만들기 위한 설계
- 객체 or 인스턴스: 클래스(설계도)를 사용해서 실제 메모리에 만들어진 실체
* 자바에서 객체와 인스턴스는 같은 의미로 사용된다 !
클래스를 사용하여 사용자가 원하는 종류의 데이터 타입을 정의할 수 있다.
위에서 언급했듯이, 사람이 관리하기 좋은 방식은 각각의 학생 별로 본인의 이름, 나이, 성적을 관리하는 것이다.
그렇다면 학생(Student)이라는 타입을 직접 정의하면 되지 않을까?
1. 변수 선언

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

- student1 = new Student()
- new Student(): Student 클래스 정보를 기반으로 메모리에 실제 Student 객체(인스턴스)를 생성한다.
- Student 클래스는 String name, int age, int grade 멤버 변수를 가지고 있다. 이 변수를 사용하는데 필요한 메모리 공간도 함께 확보한다.
3. 참조값 보관

- 객체를 생성하면 자바는 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값(주소)(x001)을 반환한다.
- x001이라고 표현한 값이 참조값이다. (실제로는 16진수로 표현됨)
- 생성된 객체의 참조값(x001)이 student1 변수에 보관된다.
- student1 변수를 통해 메모리에 있는 실제 객체를 접근하고 사용할 수 있다.
참조값을 변수에 보관해야 하는 이유
new Student() 코드는 단순히 Student 클래스를 기반으로 메모리에 실제 객체를 만드는 역할을 할 뿐, 코드 자체에는 아무런 이름이 없다. 따라서 생성한 객체에 접근하기 위해 Student student1 변수에 참조값(x001)을 저장해주어야 한다.
객체 사용
클래스를 통해 생성한 객체를 사용하려면 먼저 메모리에 존재하는 객체에 접근해야 한다.
객체 접근 방법 → . (점,dot) 사용
// 객체 값 대입
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
// 객체 값 사용
System.out.println("이름: " + student1.name + " 나이: " + student1.age + " 성적: " + student1.grade);

객체에 값 대입
student1.name = "학생1";
x001.name = "학생1";


1. . (점, dot)을 사용하여 student1 변수가 가자고 있는 참조값을 통해 실제 객체에 접근한다.
2. x001 객체가 있는 곳의 name 멤버 변수에 "학생1" 데이터가 저장된다.
클래스, 객체, 인스턴스 정리
클래스(Class): 객체를 생성하기 위한 '틀' 또는 '설계도'. 클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의한다.
객체(Object): 클래스에서 정의한 속성과 기능을 가진 실체. 객체는 서로 독립적인 상태를 가진다.
인스턴스(Instance): 특정 클래스로부터 생성된 객체를 의미한다.
* 객체와 인스턴스 둘은 보통 구분하지 않고 사용한다.
배열 도입
배열을 사용하면 특정 타입을 연속한 데이터 구조로 묶어서 편리하게 관리할 수 있다.
Student 클래스를 사용한 변수들도 Student 타입이기 때문에 학생도 배열을 사용해서 하나의 데이터 구조로 묶어서 관리할 수 있다.
배열에 참조값 대입
Student[] students = new Student[2];

- Student 배열의 각각의 항목은 Student 타입의 참조값을 보관한다.
- 배열에는 아직 참조값을 대입하지 않았기 때문에 참조값이 없다는 의미의 null 값으로 초기화 된다.
배열에 객체 보관
students[0] = student1;
students[1] = student2;
students[0] = x001;
students[1] = x002;
⭐ 자바에서 대입은 항상 변수에 들어 있는 값을 복사한다. ⭐ → 중요 !
student1, student2에 보관된 참조값을 읽고 복사해서 배열에 대입한다.

⚠️ 주의할 점
변수에는 인스턴스 자체가 들어있는 것이 아니다. 인스턴스의 위치를 가리키는 참조값이 들어있을 뿐이다. 따라서 대입(=)시에 인스턴스가 복사되는 것이 아니라 참조값만 복사된다.
'Java' 카테고리의 다른 글
[JAVA] 3. 객체 지향 프로그래밍 (1) | 2024.07.12 |
---|---|
[JAVA] 2-3. 기본형과 참조형 - null (0) | 2024.07.12 |
[JAVA] 2-2. 기본형과 참조형 - 멤버 변수, 지역 변수와 초기화 (0) | 2024.06.28 |
[JAVA] 2-1. 기본형과 참조형 (0) | 2024.06.28 |

'김영한의 실전 자바' 강의를 보고 정리하였습니다.
클래스가 필요한 이유
자바 세상은 클래스와 객체로 이루어져 있다.
먼저 클래스는 왜 필요한 걸까 ?
학생 정보 출력 프로그램 예제 코드를 보며 알아보도록 하자.
첫 번째 방법 : 변수 사용
public class ClassStart1 {
public static void main(String[] args) {
String student1Name = "학생1";
int student1Age = 18;
int student1Grade = 90;
String student2Name = "학생2";
int student2Age = 16;
int student2Grade = 80;
System.out.println("이름: " + student1Name + " 나이: " + student1Age + " 성적: " + student1Grade);
System.out.println("이름: " + student2Name + " 나이: " + student2Age + " 성적: " + student2Grade);
}
}
위 코드의 문제 👉🏻 학생이 늘어날 때마다 변수를 추가로 선언해야 하고, 또 출력하는 코드도 추가해야 한다.
두 번째 방법 : 배열 사용
public class ClassStart2 {
public static void main(String[] args) {
String[] studentNames = {"학생1", "학생2", "학생3", "학생4"};
int[] studentAges = {18, 16, 17, 20};
int[] studentGrades = {90, 80, 70, 60};
for (int i = 0; i < studentNames.length; i++) {
System.out.println("이름: " + studentNames[i] + "나이: " + studentAges[i] + "성적: " + studentGrades[i]);
}
}
}
위 코드의 문제 👉🏻 한 학생의 데이터가 studentNames[ ], studentAges[ ], studentGrades[ ]라는 3개의 배열에 나누어져 있다. 따라서 데이터를 변경할 때 매우 조심해서 작업해야 한다는 불편함이 생긴다.
이처럼 이름, 나이, 성적을 각각 따로 나누어서 관리하는 것은 사람이 관리하기 좋은 방식이 아니다.
사람이 관리하기 좋은 방식은 각각의 학생 별로 본인의 이름, 나이, 성적을 관리하는 것이다.
클래스 도입
위 코드의 문제점들을 클래스를 도입해서 해결할 수 있다.
Student 클래스
public class Student {
String name;
int age;
int grade;
}
- 멤버 변수 (Member Variable): 특정 클래스에 소속된 멤버. 클래스 내에 정의된 변수
- 필드 (Field): 데이터 항목을 가리키는 용어
* 자바에서 멤버 변수, 필드는 같은 의미로 사용된다 !
클래스는 관례상 대문자로 시작하고 CamelCase를 사용한다.
Student 클래스를 사용한 코드
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);
}
}
클래스와 사용자 정의 타입
- 타입: 데이터의 종류나 형태
- 클래스: 사용자 정의 타입을 만들기 위한 설계
- 객체 or 인스턴스: 클래스(설계도)를 사용해서 실제 메모리에 만들어진 실체
* 자바에서 객체와 인스턴스는 같은 의미로 사용된다 !
클래스를 사용하여 사용자가 원하는 종류의 데이터 타입을 정의할 수 있다.
위에서 언급했듯이, 사람이 관리하기 좋은 방식은 각각의 학생 별로 본인의 이름, 나이, 성적을 관리하는 것이다.
그렇다면 학생(Student)이라는 타입을 직접 정의하면 되지 않을까?
1. 변수 선언

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

- student1 = new Student()
- new Student(): Student 클래스 정보를 기반으로 메모리에 실제 Student 객체(인스턴스)를 생성한다.
- Student 클래스는 String name, int age, int grade 멤버 변수를 가지고 있다. 이 변수를 사용하는데 필요한 메모리 공간도 함께 확보한다.
3. 참조값 보관

- 객체를 생성하면 자바는 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값(주소)(x001)을 반환한다.
- x001이라고 표현한 값이 참조값이다. (실제로는 16진수로 표현됨)
- 생성된 객체의 참조값(x001)이 student1 변수에 보관된다.
- student1 변수를 통해 메모리에 있는 실제 객체를 접근하고 사용할 수 있다.
참조값을 변수에 보관해야 하는 이유
new Student() 코드는 단순히 Student 클래스를 기반으로 메모리에 실제 객체를 만드는 역할을 할 뿐, 코드 자체에는 아무런 이름이 없다. 따라서 생성한 객체에 접근하기 위해 Student student1 변수에 참조값(x001)을 저장해주어야 한다.
객체 사용
클래스를 통해 생성한 객체를 사용하려면 먼저 메모리에 존재하는 객체에 접근해야 한다.
객체 접근 방법 → . (점,dot) 사용
// 객체 값 대입
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
// 객체 값 사용
System.out.println("이름: " + student1.name + " 나이: " + student1.age + " 성적: " + student1.grade);

객체에 값 대입
student1.name = "학생1";
x001.name = "학생1";


1. . (점, dot)을 사용하여 student1 변수가 가자고 있는 참조값을 통해 실제 객체에 접근한다.
2. x001 객체가 있는 곳의 name 멤버 변수에 "학생1" 데이터가 저장된다.
클래스, 객체, 인스턴스 정리
클래스(Class): 객체를 생성하기 위한 '틀' 또는 '설계도'. 클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의한다.
객체(Object): 클래스에서 정의한 속성과 기능을 가진 실체. 객체는 서로 독립적인 상태를 가진다.
인스턴스(Instance): 특정 클래스로부터 생성된 객체를 의미한다.
* 객체와 인스턴스 둘은 보통 구분하지 않고 사용한다.
배열 도입
배열을 사용하면 특정 타입을 연속한 데이터 구조로 묶어서 편리하게 관리할 수 있다.
Student 클래스를 사용한 변수들도 Student 타입이기 때문에 학생도 배열을 사용해서 하나의 데이터 구조로 묶어서 관리할 수 있다.
배열에 참조값 대입
Student[] students = new Student[2];

- Student 배열의 각각의 항목은 Student 타입의 참조값을 보관한다.
- 배열에는 아직 참조값을 대입하지 않았기 때문에 참조값이 없다는 의미의 null 값으로 초기화 된다.
배열에 객체 보관
students[0] = student1;
students[1] = student2;
students[0] = x001;
students[1] = x002;
⭐ 자바에서 대입은 항상 변수에 들어 있는 값을 복사한다. ⭐ → 중요 !
student1, student2에 보관된 참조값을 읽고 복사해서 배열에 대입한다.

⚠️ 주의할 점
변수에는 인스턴스 자체가 들어있는 것이 아니다. 인스턴스의 위치를 가리키는 참조값이 들어있을 뿐이다. 따라서 대입(=)시에 인스턴스가 복사되는 것이 아니라 참조값만 복사된다.
'Java' 카테고리의 다른 글
[JAVA] 3. 객체 지향 프로그래밍 (1) | 2024.07.12 |
---|---|
[JAVA] 2-3. 기본형과 참조형 - null (0) | 2024.07.12 |
[JAVA] 2-2. 기본형과 참조형 - 멤버 변수, 지역 변수와 초기화 (0) | 2024.06.28 |
[JAVA] 2-1. 기본형과 참조형 (0) | 2024.06.28 |