클래스와 데이터
- 김영한님의 실전 자바 강의 중 클래스와 데이터 챕터를 학습하며 클래스가 왜 필요한지, 그리고 메모리상에서 어떻게 동작하는지를 정리함
클래스 도입의 필요성
배경
- 왜 클래스가 필요한가
- 프로그래밍을 하다 보면 서로 관련된 데이터들을 한꺼번에 관리해야 하는 상황이 발생함
- 변수와 배열만으로는 데이터의 연관성을 완벽하게 표현하고 관리하는 데 한계가 있음
변수 사용의 한계
- 상황 가정
- 게임 캐릭터를 관리한다고 가정
- 문제점
- 캐릭터가 늘어날 때마다 변수를 계속 선언해야 함
- 캐릭터의 정보를 출력하는 코드도 변수 개수만큼 늘어나 유지보수가 힘듦
배열 사용의 한계와 위험성
- 구조적 문제
- 배열을 사용하면 데이터를 하나로 묶을 수는 있음
- 캐릭터의 속성인 이름, 레벨, 체력이 서로 다른 배열에 쪼개져 저장됨
-
관리의 위험
- 특정 캐릭터의 데이터를 삭제하거나 수정할 때 발생
- 모든 배열의 인덱스를 정확하게 맞춰야 하는 번거로움과 위험이 따름
1 2 3 4 5 6 7 8
// 배열 사용의 문제점 // 데이터가 분산되어 관리됨 String[] characterNames = {"전사", "마법사"}; int[] characterLevels = {10, 20}; int[] characterHps = {100, 80}; // 인덱스 0번을 삭제하려면 3개의 배열 모두 건드려야 함 // 실수 가능성 매우 높음
클래스의 등장
클래스 개념 도입
- 해결책
- 캐릭터라는 개념을 하나로 묶어 관리할 필요성이 대두됨
Character클래스를 만들어 이름, 레벨, 체력을 한 곳에서 관리함
1
2
3
4
5
public class Character {
String name;
int level;
int hp;
}
용어 정리
클래스 (Class)
-
정의
- 객체를 생성하기 위한 설계도 또는 틀
- 객체가 가져야 할 속성인 멤버 변수와 기능을 정의함
-
멤버 변수 (Member Variable)
- 클래스 내부에 정의된 변수
- 데이터베이스의 필드와 유사한 개념
객체 (Object)와 인스턴스 (Instance)
-
객체
- 클래스에서 정의한 속성과 기능을 가진 실체
-
인스턴스
- 특정 클래스로부터 생성된 객체임을 강조할 때 사용함
character1은Character의 인스턴스라고 표현함
객체 생성과 메모리 구조
객체 생성 과정
-
new 키워드와 참조 값
new Character()를 호출하면 메모리에 실제 객체가 생성되고 참조 값인 주소가 반환됨- 변수에는 객체 자체가 아니라 이 참조 값이 저장됨
1 2 3 4
// x001 참조 값 반환 및 저장 Character character1 = new Character(); // 참조 값을 통해 접근 character1.name = "전사";
참조 값의 이해
-
대입의 원칙
- 자바는 항상 변수의 값을 복사해서 대입함
- 객체를 대입하는 경우 객체 자체가 복사되는 것이 아니라 참조 값만 복사됨
-
객체 접근
- 점(.) 연산자를 사용함
- 변수에 저장된 참조 값을 통해 실제 메모리에 존재하는 객체에 접근함
객체 배열과 리팩토링
배열과 객체의 결합
-
구조
- 배열도 객체를 직접 저장하는 것이 아니라 객체의 참조 값을 저장함
- 배열 생성 시에는 배열의 크기만큼 참조 값을 담을 공간이 확보됨
1 2 3
Character[] characters = new Character[2]; // character1의 참조 값(x001)이 복사되어 들어감 characters[0] = character1;
리팩토링 효과
-
향상된 for문 활용
- 배열을 사용하면 반복문을 통해 로직을 깔끔하게 관리할 수 있음
- 객체 지향적인 코드로 데이터와 기능 관리가 수월해짐
1 2 3 4
// 배열 도입 후 최적화된 출력 로직 for (Character c : characters) { System.out.println("이름:" + c.name + " 레벨:" + c.level + " 체력:" + c.hp); }
요약 정리
데이터 관리의 진화
- 발전 과정
- 변수 → 배열 → 클래스로 발전함
- 클래스를 통해 관련된 데이터를 하나로 묶어 관리할 수 있게 됨
- 사람이 이해하기 쉬운 구조로 프로그래밍이 가능해짐
자바 메모리 대원칙
-
참조 값 복사
- 자바에서 변수의 대입은 항상 값을 복사해서 전달함
- 기본형은 실제 값을 복사함
- 참조형은 객체의 위치를 가리키는 참조 값을 복사함
-
객체와 참조
- 변수에는 객체가 들어있는 것이 아님
- 변수에는 객체에 접근할 수 있는 리모컨인 참조 값이 들어있음
- 이 참조 값을 통해 메모리에 있는 실제 객체에 접근하고 데이터를 조작함
연습 문제
-
여러 학생의 이름, 나이, 성적을 각각의 배열로 따로 관리할 때 가장 어려운 점은 무엇인가?
a. 학생 정보가 흩어져 관리가 불편하고 실수가 쉽다.
- 학생 한 명의 데이터가 여러 배열에 나뉘어 있으므로, 정보 수정 시 각 배열을 모두 신경 써야 해 번거롭고 오류가 생기기 쉬움
- 이런 문제를 클래스로 해결할 수 있음
-
객체 지향에서 클래스가 하는 가장 중요한 역할은 무엇인가요?
a. 객체를 만드는 설계도 또는 틀 역할
- 클래스는 실제 메모리에 만들어질 객체가 어떤 속성과 기능을 가질지 정의하는 설계도와 같음
- 이 설계도를 바탕으로 객체를 만듬
-
Student student1;처럼 클래스 타입 변수에 저장되는 값은 무엇인가요?a. Student 객체의 메모리 위치를 가리키는 참조값
- 자바에서 클래스 타입 변수는 객체 자체가 아닌, 해당 객체가 메모리 어디에 있는지 알려주는 ‘참조값’을 저장함
- 객체는 메모리 다른 곳에 있음
-
Student[] students같은 객체 배열의 각 요소를 순서대로 처리할 때 주로 쓰는 제어문은 무엇인가요?a. for 문 (향상된 for 포함)
- 배열의 모든 요소를 처음부터 끝까지 방문하며 처리하는 작업은 for 문에 가장 적합함
- 향상된 for 문을 쓰면 더 편리하게 반복할 수 있음
-
클래스로부터 new를 이용해 메모리에 만든 실제 결과물은 무엇일까요?
a. 인스턴스 (또는 객체)
- 클래스는 설계도이고, new 키워드로 이 설계도를 바탕으로 메모리에 실제화한 것이 바로 인스턴스, 즉 객체임
- 실제 데이터를 담고 사용됨