Java

[Java] 클래스

공대생안씨 2024. 7. 8. 11:23

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");