Java - 클래스는 무엇인가?

김영한님의 Java 강의로 기초다지기 - 클래스란?

Posted by Warner on December 8, 2023

클래스가 필요한 이유

자바 세상은 클래스와 객체로 이루어져 있다. 그만큼 클래스와 객체라는 개념은 중요하다.

배열로 이해하는 클래스가 필요한 이유

String[]studentNames={"학생1","학생3","학생4","학생5"};
int[]studentAges={15,17,10,16};
int[]studentGrades={90,100,80,50};

한 학생의 데이터가 3개의 배열에 나누어져 있기 때문에 3개의 배열을 각각 변경해야 한다. 그리고 한 학생의 데이터를 관리하기 위해 3개 배열의 인덱스 순서를 항상 정확하게 맞추어야 한다.

특정 학생의 데이터를 변경할 때 실수할 가능성이 매우 높다.

사람이 관리하기 좋은 방식은 학생이라는 개념을 하나로 묶는 것이다. 그리고 각각의 학생 별로 본인의 이름, 나이, 성적을 관리하는 것이다.

클래스 도입

package class1;

public class Student {
    String name;
    int age;
    int grade;
}

class 키워드를 사용해서 학생 클래스(Student)를 정의한다. 학생 클래스는 내부에 이름(name), 나이(age), 성적(grade)변수를 가진다.

이렇게 클래스에 정의한 변수들을 멤버 변수, 또는 필드라 한다.

  • 멤버 변수(Member Variable): 이 변수들은 특정 클래스에 소속된 멤버이기 때문에 이렇게 부른다.
  • 필드(Field):데이터 항목을 가리키는 전통적인 용어이다. 데이터베이스, 엑셀 등에서 데이터 각각의 항목을 필드라 한다.
  • 자바에서 멤버 변수, 필드는 같은 뜻이다. 클래스에 소속된 변수를 뜻한다.

클래스는 관례상 대문자로 시작하고 낙타 표기법을 사용한다.
예): Student, User, MemberService

클래스와 상용자 정의 타입

  • 타입은 테이터의 종류나 행태를 나타낸다.
  • int라고 하면 정수 타입, String이라고 하면 문자 타입이다.
  • 학생(Student)이라는 타입을 만들면 되지 않을까?
  • 클래스를 사용하면 int, String과 같은 타입을 직접 만들 수 있다.
  • 사용자가 직접 정의하는 사용자 정의 타입을 만들려면 설계도가 필요하다. 이 설계도가 바로 클래스이다.
  • 설계도인 클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다.
  • 클래스를 통해서 사용자가 원하는 종류의 데이터 타입을 마음껏 정의할 수 있다.

용어: 클래스, 객체, 인스턴스 클래스는 설계도이고, 이 설계도를 기반으로 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다. 둘다 같은 의미로 사용된다.
여기서는 학생(Student) 클래스를 기반으로 학생1(student1), 학생2(student2) 객체 또는 인스턴스를 만들었다.

1. 변수 선언 class1.png

  • Student student1
    • Student 타입을 받을 수 있는 변수를 선언한다.
    • int 는 정수를, String은 문자를 담을 수 있듯이 Student는 Student 타입의 객체(인스턴스)를 받을 수 있다.

2. 객체 생성 class2.png

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

3. 참조값 보관 class3.png

  • 객체를 생성하면 자바는 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값(주소)(x001)을 반환한다.
  • new 키워드를 통해 객체가 생성되고 나면 참조값을 반환한다. 앞서 선언한 변수인 Student student1에 생성된 객체의 참조값(x001)을 보관한다,
  • Student student1 변수는 이제 메모리에 존재하는 실제 Student 객체(인스턴스)의 참조값을 가지고 있다.

지금까지 설명한 내용을 간단하게 풀어보면 아래와 같다.

Student student1=new Student(); //1. Student 객체 생성
Student student1=x001; //2. new Student()의 결과로 x001 참조값 반환
student1=x001; //3. 최종 결과

객체 사용

클래스를 통해 생성한 객체를 사용하려면 먼저 메모리에 존재하는 객체에 접근해야 한다. 객체에 접근하려면 .(점,dot)을 사용하면 된다.

//객체 값 대입
student1.name="학생1";
student1.age=15;
student1.grade=90;
//객체 값 사용
System.out.println("이름:"+student1.name+" 나이:"+student1.age+" 성적:"+student1.grade);

클래스, 객체, 인스턴스 정리

클래스-Class 클래스는 객체를 생성하기 위한 ‘틀’ 또는 ‘설계도’이다. 클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의한다.

  • 틀 : 붕어빵 틀을 생각해보자. 붕어빵 틀은 붕어빵이 아니다! 이렇게 생긴 붕어빵이 나왔으면 좋겠다고 만드는 틀일 뿐이다. 실제 먹을 수 있는 것도 아니다. 실제 먹을 수 있는 팥 붕어빵을 객체 또는 인스턴스라 한다.
  • 설계도 : 자동차 설계도를 생각해보자. 자동차 설계도는 자동차가 아니다! 설계도는 실제 존재하는 것이 아니라 개념으로만 있는 것이다. 설계도를 통해 생산한 실제 존재하는 흰색 테슬라 모델 Y 자동차를 객체 또는 인스턴스라 한다.

객체 - Object 객체는 클래스에서 정의한 속성과 기능을 가진 실체이다. 객체는 서로 독립적인 상태를 가진다.
예를 들어 위 코드에서 student1은 학생1의 속성을 가지는 객체이고, student2는 학생2의 속성을 가지는 객체이다. student1과 student2는 같은 클래스에서 만들어졌지만, 서로 다른 객체이다.

인스턴스 - Instance 인스턴스는 특정 클래스로부터 생성된 객체를 의미한다. 그래서 객체와 인스턴스라는 용어는 자주 혼용된다. 인스턴스는 주로 객체가 어떤 클래스에 속해 있는지 강조할 때 사용한다. 예를 들어서 student1 객체는 Student 클래스의 인스턴스다. 라고 표현한다.

객체 vs 인스턴스 둘다 클래스에서 나온 실체라는 의미에서 비슷하게 사용되지만, 용어상 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어이다. 보통 student1은 Student의 객체이다. 라고 말하는 대신 student1은 Student의 인스턴스이다. 라고 특정 클래스와의 관계를 명확히 할 때 인스턴스라는 용어를 주로 사용한다.
좀 더 쉽게 풀어보자면, 모든 인스턴스는 객체이지만, 우리가 인스턴스라고 부르는 순간은 특정 클래스로 부터 그 객체가 셍성되었음을 강조하고 싶을 때이다.

하지만 둘다 클래스에서 나온 실체라는 핵심 의미는 같기 때문에 보통 둘을 구분하지 않고 사용한다.