코린이의 소소한 공부노트

클래스의 정의 본문

Java

클래스의 정의

무지맘 2022. 3. 2. 16:35

데이터를 다룰 때 우리는 다음과 같은 것들을 이용한다.

1. 변수

  - 하나의 데이터를 저장할 수 있는 공간

  - 타입에 따라 공간의 크기가 다름

  - 자세한 설명은 2021.12.06 - [Java] - 변수의 데이터 타입(data type)

2. 배열

  - 같은 종류의 여러 데이터(변수)를 하나로 저장할 수 있는 공간

  - 배열의 크기를 정하면 (배열의 크기) * (타입에 따른 변수의 크기)만큼 공간이 할당됨

  - 자세한 설명은 2022.01.14 - [Java] - 배열 (1) 선언과 생성, 인덱스

3. 구조체

  - 서로 관련된 여러 데이터를 하나로 저장할 수 있는 공간

  - 배열과는 다르게 종류에 상관없이 한 구조체에 담을 수 있음

  - 자바에서는 이를 딱히 지칭하는 말은 없음

4. 클래스

  - 서로 관련된 데이터와 함수(메서드)의 결합

  - 구조체에 함수가 결합된 개념으로 이해

  - 객체를 만드는 설계도 역할

  - 사용자 정의 타입 -> 사용자가 원하는 데이터와 함수를 정의해서 쓸 수 있기 때문

  - 관련된 내용들을 묶어서 다룰 수 있기 때문에 코드의 길이도 줄이고 재사용성도 높일 수 있음

 

클래스를 사용하는 이유는 아주 간단하다. 객체지향 언어는 비객체지향적 언어의 한계인 코드의 반복 사용, 그에 따른 중량화 등의 단점을 보완하기 위해 객체라는 것을 도입했고, 이 객체를 생성하기 위해서는 클래스가 필요하기 때문이다. 이와 관련된 설명은 2022.02.20 - [Java] - 클래스, 객체, 인스턴스에 있다.

 

사람의 생일을 저장하려 한다. 생일은 태어난 연도, 월, 일이 있으니 이를 코드로 표현해보자.

1. 비객제지향적 코딩

int year;
int month;
int day;

써놓고 보니, 가족들의 생일도 저장해 보고 싶다. 3명을 추가로 저장하려면 이렇게 해야 한다.

int year1, year2, year3;
int month1, month2, month3;
int day1, day2, day3;

여러 개가 선언되어있는걸 보니.. 이건 좀 아닌 듯싶다. 배열을 이용하면 괜찮아질까?

int[] year = new int[4];
int[] month = new int[4];
int[] day = new int[4];

한결 나아진 느낌은 있으나, 연도끼리 월끼리 일끼리 모여있는 것은 생년월일을 나타내는 데 큰 의미가 없을 듯하다. 인덱스 0번부터 차례대로 아빠, 엄마, 나, 동생이라고 해도 사용하는 데 무지 불편할 것 같다. 나는 연월일이 붙어있는 것을 원한다!! 그래서 마지막으로 연월일을 붙여보기로 했다.

int[] birOfDad = new int[3];
int[] birOfMom = new int[3];
int[] birOfMine = new int[3];
int[] birOfSis = new int[3];

뇌절흠.. 연은 year, 월은 month, 일은 day로 표현하고 싶었는데, 위 코드처럼 해버리면 애초에 연, 월, 일을 나눠서 관리하는 의미가 사라져 버렸다. 이렇듯 비객체지향적인 코딩은 연관성 있는 데이터를 묶어서 표현하기 참 애매하다.

2. 객체지향적 코딩

우선, 생일 정보를 저장할 수 있는 클래스를 하나 만든다.

class Birthday{
	int year;
	int month;
	int day;
}

한 사람의 정보를 저장하는 객체를 하나 만들어볼까?

Birthday bir = new Birthday();

성공적이다. 3명 정보도 추가로 저장할 객체를 만들어보자.

Birthday bir1 = new Birthday();
Birthday bir2 = new Birthday();
Birthday bir3 = new Birthday();

4명의 정보를 배열로 묶어서 관리하려면 어떻게 해야 할까?

// 1) 한꺼번에 하기
Birthday[] b = { new Birthday(), new Birthday(), new Birthday(), new Birthday() };

// 2) 나눠서 하기
Birthday[] b = new Birthday[4];
b[0] = new Birthday();
b[1] = new Birthday();
b[2] = new Birthday();
b[3] = new Birthday();

 

생성도 다 했으니, 비객체지향 코딩과 객체지향 코딩에서 만든 데이터에 펭수의 생일을 저장해보겠다.

// 1) 비객체지향
year = 2019;
month = 8;
day = 8;

// 2) 객체지향
bir.year = 2019;
bir.month = 8;
bir.day = 8;

왼쪽이 비객체지향 / 오른쪽이 객체지향

값을 넣는데 객체지향이 참조변수 이름도 써야 하고 더 귀찮게 느껴질 수 있다. 하지만 여러 생일 정보를 다룬다면 위에서 코드를 확인했듯이 객체지향쪽이 훨씬 더 편하다. 자바로 코딩을 하면서 연관성이 있는 정보를 묶어서 다뤄야 한다면 클래스로 정의해서 코딩을 쉽고 편하게 해 보자.

'Java' 카테고리의 다른 글

메서드의 생성(선언)과 사용(호출)  (0) 2022.03.04
선언 위치에 따른 변수의 종류  (0) 2022.03.03
객체 배열  (0) 2022.03.01
클래스, 객체, 인스턴스  (0) 2022.02.20
객체지향 언어의 도입 배경과 특징  (0) 2022.02.20