클래스가 필요한 이유
자바 세상은 클래스와 객체로 이루어져 있다. 그만큼 클래스와 객체라는 개념은 중요하다. 그런데 클래스와 객체는 너무 많은 내용을 포함하고 있어서 한번에 이해하기 쉽지 않다. 여기서는 클래스와 객체라는 개념이 왜 필요한지 부터 시작해서, 클래스가 어떤 방식으로 발전하면서 만들어졌는지 점진적으로 알아보겠다.
먼저 클래스가 왜 필요한지 이해하기 위해 다음 문제를 풀어보자.
문제: 학생 정보 출력 프로그램 만들기
두 명의 학생 정보를 출력하는 프로그램을 작성해야 한다. 각 학생은 이름, 나이, 성적을 가지고 있다.
- 요구 사항:
- 첫 번째 학생의 이름은 "학생1", 나이는 15, 성적은 90입니다.
- 두 번째 학생의 이름은 "학생2", 나이는 16, 성적은 80입니다.
- 각 학생의 정보를 다음과 같은 형식으로 출력해야 합니다: "이름: [이름] 나이: [나이] 성적: [성적]"
- 변수를 사용해서 학생 정보를 저장하고 변수를 사용해서 학생 정보를 출력해야 합니다.
- 예시 출력:
이름: 학생1 나이: 15 성적: 90
이름: 학생2 나이: 16 성적: 80
쌩으로 할 수 있음 → 너무 불편해
대안은 배열로 할 수 있음 → 이것도 불편해 → 클래스 도입
클래스
클래스에 정의한 변수들을 멤버 변수, 필드 라고한다.
- 멤버 변수(Member Variable): 이 변수들은 특정 클래스에 소속된 멤버이기 때문에 이렇게 부른다.
- 필드(Field): 데이터 항목을 가리키는 전통적인 용어이다. 데이터베이스, 엑셀 등에서 데이터 각각의 항목을 필드라 한다.
자바에서 멤버 변수, 필드는 같은 뜻이다. 클래스에 소속된 변수를 뜻한다.
클래스는 대문자로 시작 하고 낙타표기법을 사용한다.
클래스 (사용자 정의 타입)
클래스의 또 다른 이름은 사용자 정의 타입이다.
- 타입은 데이터의 종류나 형태를 나타낸다.
- int 라고 하면 정수 타입, String 이라고 하면 문자 타입이다.
- 학생( Student )이라는 타입을 만들면 되지 않을까?
- 클래스를 사용하면 int , String 과 같은 타입을 직접 만들 수 있다.
- 사용자가 직접 정의하는 사용자 정의 타입을 만들려면 설계도가 필요하다. 이 설계도가 바로 클래스이다.
- 설계도인 클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다.
- 클래스를 통해서 사용자가 원하는 종류의 데이터 타입을 마음껏 정의할 수 있다.
용어: 클래스, 객체, 인스턴스
클래스는 설계도이고, 이 설계도를 기반으로 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다.
객체나 인스턴스는 사실 상 같은 의미로 사용된다.
여기서는 학생( Student ) 클래스를 기반으로 학생1( student1 ), 학생2( student2 ) 객체 또는 인스턴스를 만들었다.
클래스 파헤쳐보기
Student student1;
student1 = new Student();
student1.name = "학생1";
student1.age = 15;
student1.score = 90;
1. Student student1;
Student 타입 변수student1 선언
int 는 정수 String은 문자를 담는 것 처럼 Student 는 Student 타입의 객체(=인스턴스)를 받을 수 있다 .
2. new Student();
new Student() : new 는 새로 생성한다는 뜻이다.
new Student() 는 Student 클래스 정보를 기반으로 새로운 객체를 생성하라는 뜻이다. 이렇게 하면 메모리에 실제 Student 객체(인스턴스)를 생성한다. 객체를 생성할 때는 new 클래스명() 을 사용하면 된다. 마지막에 () 도 추가해야 한다.
Student 클래스는 String name , int age , int grade 멤버 변수를 가지고 있다. 이 변수를 사용하는데 필요한 메모리 공간도 함께 확보한다.
여기 예시에서는 x001이라는 참조값으로 반환된다.
즉 new Student()가 x001이 되는 거다
3. student1 = new Student();
위 처럼 반환된 참조값을 Student 타입 변수student1 가 저장하게 된다.
Student student1 변수는 이제 메모리에 존재하는 실제 Student 객체(인스턴스)의 참조값을 갖게되고 따라서 이 변수를 통해서 객체를 접근(참조)할 수 있다. 쉽게 이야기해서 student1 변수를 통해 메모리에 있는 실제 객체를 접근하고 사용할 수 있다.
객체 사용과 맴버 변수 초기화
클래스를 통해 생성한 객체를 사용하려면 먼저 메모리에 존재하는 객체에 접근해야 한다.
객체에 접근하려면 . (점, dot)을 사용하면 된다.
객체가 가지고 있는 멤버 변수( name, age , grade )에 값을 대입하려면 먼저 객체에 접근해야 한다.
객체에 접근하려면 . (점, dot) 키워드를 사용하면 된다.
이 키워드는 변수( student1 )에 들어있는 참조값( x001 )을 읽어서 메모리에 존재하는 객체에 접근한다.
용어정리
객체 Object
객체는 클래스에서 정의한 속성과 기능을 가진 실체이다. 객체는 서로 독립적인 상태를 가진다. 예를 들어 위 코드에서 student1 은 학생1의 속성을 가지는 객체이고, student2 는 학생2의 속성을 가지는 객체이다. student1 과 student2 는 같은 클래스에서 만들어졌지만, 서로 다른 객체이다.
인스턴스 Instance
인스턴스는 특정 클래스로부터 생성된 객체를 의미한다. 그래서 객체와 인스턴스라는 용어는 자주 혼용된다. 인스턴스는 주로 객체가 어떤 클래스에 속해 있는지 강조할 때 사용한다. 예를 들어서 student1 객체는 Student 클래스의 인스턴스다. 라고 표현한다.
객체 vs 인스턴스
둘다 클래스에서 나온 실체라는 의미에서 비슷하게 사용되지만, 용어상 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어이다.
보통 student1 은 Student 의 객체이다. 라고 말하는 대신 student1 은 Student 의 인스턴스이다. 라고 특정 클래스와의 관계를 명확히 할 때 인스턴스라는 용어를 주로 사용한다.
좀 더 쉽게 풀어보자면, 모든 인스턴스는 객체이지만, 우리가 인스턴스라고 부르는 순간은 특정 클래스로부터 그 객체가 생성되었음을 강조하고 싶을 때이다. 예를 들어 student1 은 객체이지만, 이 객체가 Student 클래스로부터 생성되었다는 점을 명확히 하기 위해 student1 을 Student 의 인스턴스라고 부른다. 하지만 둘다 클래스에서 나온 실체라는 핵심 의미는 같기 때문에 보통 둘을 구분하지 않고 사용한다.
reference