1. 클래스가 필요한 이유
- 학생 정보를 관리할 때 ⇒ 배열 여러개 사용해서 이름, 나이, 성적 등을 관리한다면?
- 데이터 관리하기에 매우 복잡함
- 학생이라는 개념을 하나로 묶는 것이 관리하기 좋음!
📌 데이터를 상위 개념으로 묶어서 관리하기 좋은 것이 클래스
2. 클래스 (Class)
- 객체를 생성하기 위한 ‘틀’ or ‘설계도’
- 객체가 가져야 할 속성 (변수) 과 기능 (메서드) 를 정의함
2-1. 클래스와 사용자 정의 타입
- 타입 : 데이터 종류 or 형태
- 클래스 사용 ⇒ 사용자가 정의하는 타입을 만들 수 있음
- 사용자 정의 타입을 만들기 위한 설계도 ⇒ “클래스”
- 클래스 사용해서 실제 메모리에 만들어진 실체를 “객체” or “인스턴스” 라고 함
3. 클래스 선언
- 클래스 선언 방법
// 클래스 선언
접근제어자 class 클래스이름 {
// 멤버 변수 (필드)
// 멤버 메서드
}
// 클래스 선언 예제
public class Student {
// 멤버 변수 (필드)
private String name;
private int age;
private int grade;
// 멤버 메서드
public void plusGrade() {
// ...
}
}
- 클래스 이름은 관례 상 파스칼 표기법 ( = upper camel case)을 사용
- 멤버 변수 (= 필드)
- 자바에서 멤버 변수, 필드는 동일한 뜻임
- 클래스에 소속된 변수를 뜻함
- 인스턴스.필드명으로 접근
4. 객체 (Object), 인스턴스 (Instance)
4-1. 객체
- 클래스에서 정의한 속성과 기능을 가진 실체
- 객체 끼리는 서로 독립적인 상태를 가짐
// student1 과 student2 는 같은 클래스에서 만들어졌지만
// 서로 다른 객체임
Student student1 = new Student();
Student student2 = new Student();
4-2. 인스턴스
- 특정 클래스로부터 생성된 객체
- 주로 객체가 어떤 클래스에 속해 있는지 강조할 때 사용함!!
// student1 객체는 Student 클래스의 **인스턴스**이다.
Student student1 = new Student();
4-3. 객체 vs 인스턴스
- 인스턴스가 객체보다 좀 더 관계에 초점 / 특정 클래스와의 관계를 명확히 할 때 인스턴스 용어 사용
“student1 은 Student 의 객체이다”대신 “student1 은 Student 클래스의 인스턴스이다.”- 객체, 인스턴스 모두 클래스에서 나온 실체라는 핵심 의미는 동일하므로 보통 둘을 구분하진 X
5. 객체 생성
- (객체 참조) 변수 선언
Student studnet;
- 객체 생성
📌 new 키워드 사용!
new : 클래스 정보를 기반으로 새로운 객체를 생성하라는 키워드
// 객체(인스턴스) 생성
student = new Student();
⇒ 실제 Student 객체(인스턴스)를 메모리에 생성함
⇒ 클래스 내 멤벼 변수를 사용하는 데 필요한 메모리 공간을 함께 확보함
- 참조값 보관
⇒ 객체 생성 시 (new 키워드) 참조값(=주소)을 반환해서 객체 변수에 저장함
⇒ 따라서 생성한 (student1) 변수를 통해 메모리에 있는 실제 객체에 접근, 사용 가능!
- 참조값 확인
더보기
Student student1 = new Student();
System.out.println(student1);
/* 출력결과
class1.Student@7a81197d
*/
6. 객체 사용
- 먼저 메모리에 존재하는 객체에 접근해야 함
- 객체 접근 ⇒ . (점) 사용
// 객체 접근 예제
Student student1 = new Student();
System.out.println(student1.name);
- . (점, dot) 키워드
- 객체 변수(student1)에 들어있는 참조값(x001)을 읽어서 메모리에 존재하는 객체에 접근
6-1. 객체에 값 대입
student1.name = "학생1"; // student1 객체의 name 필드에 값 대입
//x001.name = "학생1"; // 변수의 참조값을 통해 실제 객체에 접근
// 해당 객체의 name 필드에 값 대입
6-2. 객체 값 읽기
// 1. 객체 값 읽기
System.out.println("이름: " + student1.name);
// 2. 변수의 참조값을 통해 실제 객체에 접근
// 해당 객체의 name 필드에 접근
// System.out.println("이름: " + x001.name);
// 3. 객체의 필드 값을 읽어옴
// System.out.println("이름: " + "학생1");
7. 객체 배열
- student1, student2 와 같이 클래스를 통해 만든 객체 여러개를 사용할 때 일반 변수와 동일하게 배열 사용 가능
7-1. 객체를 담을 수 있는 배열 생성
Student[] students = new Student[2];
⇒ 아직 참조값 대입 x ⇒ null로 초기화
7-2. 배열에 객체 대입
students[0] = student1;
students[1] = student2;
// 변수에 들어있는 참조값(주소) 만 복사함!!
// students[0] = x001;
// students[1] = x002;
- 객체 배열 선언과 동시에 초기화 방법
더보기
// 객체 배열 선언과 동시에 초기화
1. Student[] students = new Student[]{student1, student2};
2. Student[] students = {student1, student2};
3. Student[] students = {new Student(), new Student()};
📌 자바에서의 대입은 항상 변수에 들어있는 값을 복사해서 전달하는 것!!
⇒ 객체 참조 변수와 동일하게 배열의 각 항목도 Student 타입의 참조값을 보관함!
7-3. 배열에 들어있는 객체 사용
System.out.println(students[0].name); // 배열 접근
// System.out.println(x005[0].name); // x005의 0번째 요소 접근
// System.out.println(x001.name); // 객체의 필드에 접근
// System.out.println("학생1");
'Java' 카테고리의 다른 글
[Java] 객체 지향 프로그래밍 (Object-Oriented Programming, OOP) (0) | 2024.07.08 |
---|---|
[Java] 기본형과 참조형 (0) | 2024.07.08 |
[Java] StringBuilder 로 출력하여 시간초과 해결 (0) | 2023.12.12 |
[Java] 메서드 오버로딩, 메서드 오버라이딩 (Method Overloading, Method Overriding) (0) | 2023.12.10 |
[Java] 향상된 for 문 (for-each 문) (0) | 2023.12.10 |